ServerSoket/Socket聊天簡單實現V2(單線程,一個客戶端對一個服務器,客戶端可接收可發送,服務器可接收可發送【發送後需等到再次接收到消息才能再次發送】)

知識點:服務器端只會起一個線程對所有的客戶端連接進行處理,這樣會因爲某個客戶端處理的阻塞,而導致其他客戶端得不到處理。
源碼如下:分服務器Server/客戶端Client兩個類。
package communication;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**

  • @author Dylaniou
  • 需要先啓動服務器
    */
    public class Server {
    static ServerSocket serverSocket = null;
    static int port = 18000;
    static Socket socket = null;
    public static void main(String[] args) throws IOException {
    serverSocket = new ServerSocket(port);
    System.out.println(“服務器啓動成功,等待客戶端請求”);
    socket = serverSocket.accept();
    System.out.println(“收到客戶端請求”);
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    String line = null;
    while((line = br.readLine())!=null){
    System.out.println(“客戶端:” + line+ “,服務器請回答~”);
    line = br2.readLine();
    bw.write(line);
    bw.newLine();
    bw.flush();
    System.out.println(“服務器:” + line+ “,客戶端請回答~”);
    line = null;
    }
    br2.close();
    bw.close();
    br.close();
    }
    }

package communication;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**

  • @author Dylaniou
  • 需要先啓動服務器
    */
    public class Client {
    static Socket socket = null;
    static int port = 18000;
    public static void main(String[] args) throws UnknownHostException, IOException {
    socket = new Socket(“localhost”,port);
    System.out.println(“客戶端成功建立socket連接”);
    //發送命令行消息給服務器
    //將命令行字節輸入流轉換爲字符輸入流,利用緩衝字符輸入流讀取命令行消息
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    //將socket字節輸出流轉換爲字符輸出流,利用緩衝字符輸出流輸出命令行消息
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    BufferedReader br2 = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String line =null;
    while((line = br.readLine())!=null){
    System.out.println( “客戶端:” + line+",服務器請回答~");
    bw.write(line);
    bw.newLine();//用於終止輸出行,不然命令行輸入再多內容也無法發送出去
    bw.flush();
    System.out.println(“服務器:” + br2.readLine() + “,客戶端請回答~”);
    line = null;
    }
    bw.close();
    br.close();
    }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章