note: That means The Server terminal is in the android device;
1. allow all internet permission in the manifest file , before <application> label;
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/>
2. enable Wifi in android device and get the ip address:
private String getIP(){ String ipAddress = null; try{ // Enumeration<NetworkInterface> en; // for(en=NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){ // NetworkInterface intf=en.nextElement(); // Enumeration<InetAddress> enIp; // for(enIp=intf.getInetAddresses();enIp.hasMoreElements();){ // InetAddress inetAddress=enIp.nextElement(); // if(!inetAddress.isLoopbackAddress()){ // ipAddress=inetAddress.getHostAddress().toString(); // Log.i("log_filter","ip:"+ipAddress); // // } // } // } // return ipAddress; WifiManager wifiManager=(WifiManager) SocketTestServer.this.getSystemService(Service.WIFI_SERVICE); if(!wifiManager.isWifiEnabled()){ wifiManager.setWifiEnabled(true); } WifiInfo wifiInfo=wifiManager.getConnectionInfo(); int ipAddressInt=wifiInfo.getIpAddress(); ipAddress=intToIp(ipAddressInt); Log.i("log_filter","ip:"+ipAddress); } catch(Exception ex){ Log.e("log_filter","get ip error:"+ex); } return ipAddress; } private String intToIp(int i){ return (i & 0xff)+"."+ ((i>>8)&0xff)+"."+ ((i>>16)&0xff)+"."+ ((i>>24)&0xff); }
3. run a new thread to handle the socket server . handle the input/output
4. send data from another application client server
5. use a while(true) loop to catch the input stream;
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.socket_test_server" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <application android:label="@string/app_name" > <activity android:name="SocketTestServer" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
package com.socket_test_server; import android.app.Activity; import android.app.Service; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import java.io.*; import java.net.*; public class SocketTestServer extends Activity { LinearLayout ll; LinearLayout.LayoutParams params; Button startServerButt; String localIP; class ServerThread extends Thread{ //tcp @Override public void run(){ ServerSocket serverSocket = null; try{ String outputStr="hi,client, recived msg from android server"; serverSocket=new ServerSocket(14567); Socket socket=serverSocket.accept(); InputStream ips=socket.getInputStream(); OutputStream ops=socket.getOutputStream(); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(ips)); BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(ops)); int len; //catch input; while(true){ Log.i("log_filter","server,into the while loop"); len=bufferedReader.read(); Log.i("log_filter","server: get data length:"+len); if(len>0){ char[] c=new char[len]; bufferedReader.read(c, 0, len); Log.i("log_filter","server: get data:"+new String(c,0,len)); //output an feed back msg bufferedWriter.write(outputStr); bufferedWriter.flush(); } } } catch(Exception ex){ Log.e("lig_filter","socket thread error:"+ex); } try { // serverSocket.close(); } catch (Exception ex) { Log.e("lig_filter","socket thread close error:"+ex); } } //udp // public void run(){ // try{ // DatagramSocket socket=new DatagramSocket(14567); // byte[] data=new byte[1024]; // DatagramPacket packet=new DatagramPacket(data,data.length); // socket.receive(packet); // String result=new String(packet.getData()); // Log.i("log_filter","udp packet:"+result); // } // catch(Exception ex){ // Log.e("log_filter","udp error:"+ex); // } // } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ll=new LinearLayout(this); params=new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); startServerButt=new Button(this); startServerButt.setOnClickListener(startServerClick); ll.addView(startServerButt,params); setContentView(ll); localIP=getIP(); } OnClickListener startServerClick=new OnClickListener(){ public void onClick(View arg0) { // throw new UnsupportedOperationException("Not supported yet."); new ServerThread().start(); } }; private String getIP(){ String ipAddress = null; try{ // Enumeration<NetworkInterface> en; // for(en=NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){ // NetworkInterface intf=en.nextElement(); // Enumeration<InetAddress> enIp; // for(enIp=intf.getInetAddresses();enIp.hasMoreElements();){ // InetAddress inetAddress=enIp.nextElement(); // if(!inetAddress.isLoopbackAddress()){ // ipAddress=inetAddress.getHostAddress().toString(); // Log.i("log_filter","ip:"+ipAddress); // // } // } // } // return ipAddress; WifiManager wifiManager=(WifiManager) SocketTestServer.this.getSystemService(Service.WIFI_SERVICE); if(!wifiManager.isWifiEnabled()){ wifiManager.setWifiEnabled(true); } WifiInfo wifiInfo=wifiManager.getConnectionInfo(); int ipAddressInt=wifiInfo.getIpAddress(); ipAddress=intToIp(ipAddressInt); Log.i("log_filter","ip:"+ipAddress); } catch(Exception ex){ Log.e("log_filter","get ip error:"+ex); } return ipAddress; } private String intToIp(int i){ return (i & 0xff)+"."+ ((i>>8)&0xff)+"."+ ((i>>16)&0xff)+"."+ ((i>>24)&0xff); } }
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package androidexp23; import java.io.*; import java.net.InetAddress; import java.net.Socket; /** * * @author Administrator */ public class SocketTestTCPClient01 { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here String sendContent="hello server, send from tcp client"; InputStream ips ; OutputStream ops ; StringBuffer feedBack=new StringBuffer(); try { Socket socketClient=new Socket("192.168.1.104",14567); ips=socketClient.getInputStream(); ops=socketClient.getOutputStream(); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(ips)); BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(ops)); int len; bufferedWriter.write(sendContent); bufferedWriter.flush(); System.out.println("socket client sended"); while(true){ len=bufferedReader.read(); if(len>0){ char[] c=new char[len]; bufferedReader.read(c, 0, len); System.out.println("client: get data from server:"+new String(c,0,len)); bufferedWriter.write(sendContent); bufferedWriter.flush(); } } } catch (IOException ex) { System.out.println("socket error:"+ex); } } }
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package androidexp23; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * * @author Administrator */ public class SocketTestUDPClient { public static void main(String[] args){ try{ DatagramSocket socket=new DatagramSocket(14567); InetAddress serverAddress=InetAddress.getByName("192.168.1.104"); String str="hello from UDP client"; byte[] data=str.getBytes(); DatagramPacket packet=new DatagramPacket(data,data.length,serverAddress,14567); socket.send(packet); } catch(Exception ex){ System.out.println("udp send error:"+ex); } } }
Very important: Socket.accept() is an blocked function . Refers to 强哥's method : How to setup multi client device:
import java.net.ServerSocket; import java.net.Socket; import send.Sender; public class Main { private static int port = 5000; public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(port); Thread receiver; System.out.println("-----server start------"); System.out.print("port---" + port); Sender sender = new Sender(); while (true) { Socket socket = null; System.out.println("waiting...----"); socket = ss.accept(); receiver = new Receiver(socket, sender); System.out.println("connect from address: " + socket.getInetAddress()); receiver.start(); } // System.out.println("server over"); } }
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.logging.Level; import java.util.logging.Logger; import messageHandle.MessageCenter; import queue.KSocketQueueCenter; import send.Sender; public class Receiver extends Thread { Socket socket; final int BYTE_ARRAY_MAX_LEN = 1000; final String FLASH_SAFE = "<policy-file-request/>"; static String safe = "<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\0"; Sender sender; public Receiver(Socket socket, Sender sender) { this.socket = socket; this.sender = sender; } @Override public void run() { try { InputStream is = socket.getInputStream(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); KSocketQueueCenter.GetInstance().addSocketQueue(socket); BufferedReader inBufferedReader=new BufferedReader(new InputStreamReader(is)); while (true) { int length=inBufferedReader.read(); System.out.println("----length:"+length); if(length>0){ char[] cbuf= new char[length]; inBufferedReader.read(cbuf, 0, length); System.out.println(cbuf+"--收到消息"); String s=new String(cbuf,0,cbuf.length) ; // 安全策略 if(s.indexOf("<policy-file-request/>") >= 0){ bw.write(safe, 0, safe.length()); bw.flush(); System.out.println(safe); }else{ MessageCenter.GetInstance().addMsg(s); } } else if(length==-1){ bw.close(); // KSocketQueueCenter.GetInstance().removeSocketQueue(socket); break; } // if (s != null && s.indexOf("<policy-file-request/>") >= 0) // { // for (int i = 0; i < s.length(); i++) { // System.out.println(i + " " + (int) s.charAt(i)); // } // // bw.write(safe, 0, safe.length()); // bw.flush(); // // System.out.println(safe); // } else { // //// synchronized (sender) { //// sender.Broadcast(s); //// } // // MessageCenter.GetInstance().addMsg(s); // // } } // bw.close(); // // synchronized (sender) { //// sender.removeOutput(out); // } } catch (Exception ex) { System.out.println("error in receiver"); ex.printStackTrace(); } try { socket.close(); System.out.println(socket.getInetAddress() + " disconnected"); } catch (IOException ex1) { System.out.println("socket close error"); Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex1); } } }