Socket编程:聊天室不同版本V2

聊天室案例V2.
改善聊天室案例V1,实现客户端重复发送数据到服务器端的功能,即用户可以在控制台不断
输入内容,并将内容逐一发送给服务端
1.对于客户而言,为了能够重复发送,需要构建循环,并在循环中,不断读入控制台录入的数据
并发送
2.对于服务器端,也需要构建循环,并在循环中不断读取客户端发来的数据并打印显示.

TCP通信
Server端多线程的应用
.若想使一个服务端可以支持多客户端连接,我们需要解决一下问题
-1.循环调用accept方法侦听客户端的连接
-2.使用线程来处理单一客户端的数据交互

因为需要处理多客户端,所以服务端要周期性循环调用accept方法,但该方法会产生阻塞,所
以要与某个客户端的交互就需要使用线程来并发处理
public class Client2 {
    private Socket socket;
    public Client2() {
        try {
            socket = new Socket("localhost", 8060);
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void start() {
        try {
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
            PrintWriter pw = new PrintWriter(osw,true);
            Scanner scanner = new Scanner(System.in);
            while(true) {
                pw.println(scanner.nextLine());
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(socket!=null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
    }
    public static void main(String[] args) {
        Client2 c2 = new Client2();
        c2.start();
    }
}

public class Server2 {
    private ServerSocket serversocket;
    public Server2() {
        try {
            serversocket = new ServerSocket(8060);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void start() {
        System.out.println("Wait Client Connect");
        try {
            Socket socket = serversocket.accept();
            System.out.println("Successful connection to client");
            InputStream in = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(in,"UTF-8");
            BufferedReader br = new BufferedReader(isr);
            while(true) {
            System.out.println("Client Speak:"+br.readLine());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        Server2 s2 = new Server2();
        s2.start();
    }
}
 

猜你喜欢

转载自blog.csdn.net/CXY_ZPH/article/details/86512908