看了兩天socket通信,也參考了網上其他人是怎么寫的。
下面我把最簡單的socket例程貼出來
server代碼:
public class Server { private static int port = 8888; private static ServerSocket serverSocket; private static Socket socket; public static void main(String args[]) throws IOException { serverSocket = new ServerSocket(port, 2); socket = serverSocket.accept(); System.out.println("客戶端已鏈接"); DataInputStream dis = new DataInputStream(socket.getInputStream()); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writeUTF("來自服務器的消息"); while (true){ /* //讀取客戶端發送的信息 String str = dis.readUTF(); System.out.println("From 客戶端:"+str); if(str.equals("bye")){ socket.close(); serverSocket.close(); break; } */ // 發送鍵盤輸入的一行 String s = new BufferedReader(new InputStreamReader(System.in)).readLine(); dos.writeUTF(s); } } }
Client代碼:
public class Client { private static int port = 8888; private static String host = "localhost"; private static Socket socket; public static void main(String args[]) throws UnknownHostException, IOException { socket = new Socket(host, port); DataInputStream dis = new DataInputStream(socket.getInputStream()); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writeUTF("來自客戶端的消息"); while(true){ //讀取服務器發送的信息 String str = dis.readUTF(); System.out.println("From 服務器:"+str); if(str.equals("bye")){ socket.close(); System.out.println("關閉socket"); break; } // 發送鍵盤輸入的一行 //String s = new BufferedReader(new InputStreamReader(System.in)).readLine(); //dos.writeUTF(s); } } }
因為readLine()是一個阻塞函數,接收不到消息會阻塞在那里。如果把兩個文件中的注釋去掉后,服務器和客戶端必須你一句我一句,才能正常通信。目前還沒有解決辦法。
所以,先實現單向通信:server發送數據,client接收數據。