一個比較成熟的Socket實例

廢話不多說...直接看代碼

服務器端...

Server.java

package test;  
import java.net.ServerSocket;  
import java.net.Socket;
public class Server {
	public static ServerSocket ss;
    int i=10000;
	public Server(){
    	try {
    		System.out.println("監聽端口:"+i);
        	ss = new ServerSocket(i);
        	Socket socket = ss.accept();
        	Socket_List.setSocket(i, socket);
            System.out.println("在端口       "+i+"  有新連接:"+Socket_List.getSocket(i).getRemoteSocketAddress());
            new Thread(new getMessage(i)).start();
		} catch (Exception e) {
			System.out.println("連接客戶端異常"+e.getMessage());
		}
    }
    public static void main(String[] args) {
         new Server();
    }
}
Socket_list.java

package test;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

public class Socket_List {
	private static Map<Integer, Socket> map= new HashMap<Integer, Socket>();
	private static Socket_List list;
	public static Socket_List getThis()
	{
		if(list==null)
			list= new Socket_List();
		return list;
	}
	public static Socket getSocket(int i)
	{
		return map.get(i);
	}
	public static void setSocket(int i,Socket socket)
	{
		map.put(i, socket);
	}
}

getMessage.java

package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class getMessage implements Runnable{
	private int i=0;
	public static String getMessages(int id) throws Exception
	{
		BufferedReader reader=new BufferedReader(new InputStreamReader(Socket_List.getSocket(id).getInputStream()));
		return reader.readLine();
	}
	public static void sendMessages(int id,String message) throws Exception
	{
		PrintWriter send=new PrintWriter(Socket_List.getSocket(id).getOutputStream());
		send.println(message);
		send.flush();
	}
	public getMessage(int i) {
		this.i=i;
	}
	@Override
	public void run() {
		try {
			while(true)
			{
				String Message=getMessages(i);
				System.out.println("來自"+Socket_List.getSocket(i).getRemoteSocketAddress()+"的信息:"+Message);
				sendMessages(i, Message);
				System.out.println("向客戶端發送信息:"+Message);
			}
		} catch (Exception e) {
			try {
				System.out.println("客戶端"+Socket_List.getSocket(i).getRemoteSocketAddress()+"斷開連接~!");
				Socket_List.getSocket(i).close();
				Server.ss.close();
				new Server();
			} catch (Exception e1) {
				System.out.println("未能正常關閉Socket!~");
			}
		}
	}
}

客戶端

Client.java

package test;
import java.net.Socket;
public class Client {
	int i=10000;
    public Client(){
    	try {
    		Socket client=new Socket("127.0.0.1",i);
    		System.out.println("已連接"+i);
	    	new Thread(new ClientgetMessage(client)).start();
    	} catch (Exception e) {
			System.out.println("未能連接到服務器"+e.getMessage());
		}
    }
    public static void main(String[] args) {  
		new Client();
    }  
}  


ClientgetMessage.java

package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ClientgetMessage implements Runnable{
	private Socket socket;
	public ClientgetMessage(Socket socket) {
		this.socket=socket;
	}
	public void run() {
		new Thread(new getMessages(socket)).start();
		new Thread(new sendMessages(socket)).start();
	}
}
class getMessages implements Runnable
{
	private Socket socket;
	getMessages(Socket socket)
	{
		this.socket=socket;
	}
	public void run() {
		try {
			while(true)
			{
				BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
				String Message=reader.readLine();
				System.out.println("來自"+socket.getRemoteSocketAddress()+"的信息:"+Message);
			}
		} catch (Exception e) {
			try {
				System.out.println("服務器"+socket.getRemoteSocketAddress()+"斷開連接~!");
				socket.close();
				new Client();
				System.exit(0);
			} catch (Exception e1) {
				System.out.println("未能正常關閉Socket!~");
			}
		}
	}
	
}
class sendMessages implements Runnable
{
	private Socket socket;
	sendMessages(Socket socket)
	{
		this.socket=socket;
	}
	public void run() {
		try {
			while(true)
			{
				PrintWriter send=new PrintWriter(socket.getOutputStream());
				BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
				send.println(reader.readLine());
				send.flush();
			}
		} catch (Exception e) {
			System.out.println("發送消息失敗");
		}
	}
	
}

-----------------------------------程序員 閆帆原創---------------------------------------

轉載請註明原創人信息  程序員 閆帆yanfanvip



發佈了49 篇原創文章 · 獲贊 21 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章