Java網路程式設計,socket實現一對一全雙工通訊聊天功能
阿新 • • 發佈:2018-12-10
本文使用socket的長連線,進行訊息的傳送和接受。
1、兩端
client 端,server端
2、兩執行緒
客戶端、伺服器端,各開兩個執行緒,實現讀寫,可以全雙工通訊,非同步傳送,非同步接受。
3、兩注意
程式等待輸入和一直處於等待訊息發來,所以,用到死迴圈。
讀訊息,用到的是行讀,nextLine()方法,所以,一定要在傳送訊息時,在訊息末尾追加加上換行符,否則讀不到。
程式碼:
1、訊息傳送服務類
package com.socket.newChat; import java.io.IOException; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; /** * Created by Liuxd on 2018-09-15. */ public class SendMessageService implements Runnable { private Socket socket; private String name; public SendMessageService(Socket socket, String name) { this.socket = socket; this.name = name; } public void run() { PrintWriter pWriter = null; Scanner scanner = null; try { pWriter = new PrintWriter(socket.getOutputStream()); scanner = new Scanner(System.in); while (true) { String s = scanner.nextLine(); pWriter.write(name + s + "\n"); pWriter.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { scanner.close(); pWriter.close(); } } }
2、訊息接受服務類
package com.socket.newChat; import java.io.IOException; import java.net.Socket; import java.util.Scanner; /** * Created by Liuxd on 2018-09-15. */ public class ReceiveMessageService implements Runnable { private Socket socket; public ReceiveMessageService(Socket socket) { this.socket = socket; } @Override public void run() { Scanner scanner = null; try { scanner = new Scanner(socket.getInputStream()); while (scanner.hasNext()) { System.out.println(scanner.nextLine()); } } catch (IOException e) { e.printStackTrace(); } finally { scanner.close(); } } }
3、服務端
package com.socket.newChat; /** * Created by Liuxd on 2018-09-15. */ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class TestServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8081); while (true) { Socket socket=serverSocket.accept(); new Thread(new SendMessageService(socket,"伺服器端:")).start(); new Thread(new ReceiveMessageService(socket)).start(); System.out.println("請輸入..."); } } }
4、客戶端
package com.socket.newChat;
/**
* Created by Liuxd on 2018-09-15.
*/
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class TestClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 8081);
new Thread(new SendMessageService(socket,"客戶端:")).start();
new Thread(new ReceiveMessageService(socket)).start();
System.out.println("請輸入...");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}