现在的位置: 首页 > 综合 > 正文

ServerSocket和Socket的簡單案例

2018年05月09日 ⁄ 综合 ⁄ 共 4689字 ⁄ 字号 评论关闭

//服務端,這里用PC機會服務端

package com.adventure.socket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MySocketServer {

	private static final int PORT = 9999;
	private List<Socket> mList = new ArrayList<Socket>();
	private ServerSocket server = null;
	private ExecutorService mExecutorService = null;//線程池 

	public MySocketServer(){
		try {
			server = new ServerSocket(PORT);
			mExecutorService = Executors.newCachedThreadPool();//創建一個線程pool
			Socket client = null;
			while(true){
				client = server.accept();
				mList.add(client);
				mExecutorService.execute(new ChatService(client));//執行里面的線程
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		new MySocketServer();
	}
	
	class ChatService implements Runnable{

		private Socket socket;
		private BufferedReader in = null;
		private String msg="";
		public ChatService(Socket socket){
			this.socket = socket;
			try {
				in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		@Override
		public void run() {
			try {
				while(true){
					String content = "";
					if((content = in.readLine()) != null){
						if(content.equals("exit")){
							//如果收到信息為"exit",則向客戶端返回ok,然后關掉socket,
							msg = "用戶IP:"+socket.getInetAddress() + " 退出后在線用戶數量:";
							this.sendmsg("ok");
							mList.remove(socket);
							in.close();socket.close();
							System.out.println(msg+ mList.size());
							break;
						}
						else{
							//打印客戶提交過來的其它信息
							msg = "客戶端IP:"+socket.getInetAddress() +" 在線用戶數量:"+mList.size()+" " + content+"-"+socket.hashCode();
							System.out.println(msg);
							this.sendmsg(msg);
						}
					}
				}
			} catch (Exception e) {
				System.out.println("server 數據讀取異常");
				e.printStackTrace();
			}
			
		}
		
		
		public void sendmsg(String message){
			int num = mList.size();
			for(int i=0;i<num;i++){
				Socket mSocket = mList.get(i);
				PrintWriter pout = null;
				try {
					pout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream())),true);
					pout.println(message);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

//android客戶端

package cn.client.kwok;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.Socket;
import java.util.Enumeration;

import android.app.Activity;
import android.content.Context;
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.EditText;

public class Client1Activity extends Activity {
    /** Called when the activity is first created. */
	
	private EditText content;
	private Button send;
	private String msg = "";
	private Socket socket;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        content = (EditText) findViewById(R.id.content);
        send = (Button) findViewById(R.id.button);
        send.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				msg = content.getText().toString();
				runt();
				
			}
		});
        
        

    }
    
    private void runt(){
    	new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				chatConnection();
			}
		}).start();
    	
    }
    
    public String getLocalMacAddress() {     
        WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);     
        WifiInfo info = wifi.getConnectionInfo();
        info.getIpAddress();
        return info.getMacAddress();     
    }  
    
    public void getLocalIPAddress(){
        try {
			for(Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){
				NetworkInterface intf = en.nextElement();
				for(Enumeration<InetAddress> ipAddr = intf.getInetAddresses();ipAddr.hasMoreElements();){
					InetAddress inetAddress = ipAddr.nextElement();
					String ip = inetAddress.getHostAddress();
					Log.i("size", ip+"--"+getLocalMacAddress());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
	public void chatConnection() {
		BufferedReader in = null;
		PrintWriter out = null;
		try {
			if(socket == null){
				socket = new Socket("192.168.1.109", 9999);
				Log.i("size","here");
			}
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
			if (socket.isConnected()) {
				if (!socket.isOutputShutdown()) {
					out.println(msg);
					Log.i("size","client 113 send:"+ msg+" "+socket.hashCode());
				}
			}
			while (true) {
				if(in.readLine() != null){
					if (in.readLine().equals("ok")) {
						//out.println("ok");
						Log.i("size", "client 113 exit "+socket.hashCode());
						in.close();
						if(out != null && socket != null){
							out.close();
							socket.close();
							socket = null;
						}
						break;
					} else {
						Log.i("size","client 113 receive"+ in.readLine()+" "+socket.hashCode());
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	 }
}

抱歉!评论已关闭.