note 24-set up ServerSocket in android

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);
		}
		
	}
}

猜你喜欢

转载自julianjulian8.iteye.com/blog/1735393