java 网络实现聊天室

100 阅读1分钟

客户端代码如下:

package com.xxxx.demo1027b;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class ChatRoomClient {
    Socket server;

    public ChatRoomClient() throws IOException {
        this.server=new Socket("127.0.0.1",8088);
        new RecieveThread().start();
        new SendThread().start();
    }

    class RecieveThread extends Thread{
        @Override
        public void run(){
            while(true){
                BufferedReader reader=null;
                try {
                    reader=new BufferedReader(new InputStreamReader(server.getInputStream(),"utf-8"));
                    System.out.println(reader.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class SendThread extends Thread{
        @Override
        public void run(){
            Scanner scanner=new Scanner(System.in);
            //System.out.println("用户["+server.getLocalPort()+"]已开辟发送线程");
            while(true){
                String string=scanner.nextLine();
                BufferedWriter writer=null;
                try {
                    writer=new BufferedWriter(new OutputStreamWriter(server.getOutputStream(),"utf-8"));
                    writer.write(string+"\n");
                    writer.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

class Test1{
    public static void main(String[] args) throws IOException {
        new ChatRoomClient();
    }
}

服务端代码如下:

package com.xxxx.demo1027b;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

public class ChatRoomServer {
    private List<Socket> clients;
    private ServerSocket server;
    private SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

    public ChatRoomServer() throws IOException {
        this.clients = new ArrayList();
        this.server = new ServerSocket(8088);
        makeConnect_and_newThread();
    }

    public void makeConnect_and_newThread() throws IOException {
        System.out.println("服务器初始化成功");
        while(true){
            Socket client=server.accept();
            System.out.println("用户["+client.getPort()+"]已加入群聊");
            clients.add(client);
            send("用户["+client.getPort()+"]已加入群聊",client);
            new RecieveAndSendThread(client).start();
        }
    }

    void send(String string,Socket src_client) throws IOException {
        for(Socket client:clients){
            BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(client.getOutputStream(),"utf-8"));
            writer.write("用户["+src_client.getPort()+"]时间["+simpleDateFormat.format(System.currentTimeMillis())+"]:"+string+"\n");
            writer.flush();
        }
    }

    class RecieveAndSendThread extends Thread{
        private Socket client;
        public RecieveAndSendThread(Socket client) {
            this.client=client;
        }

        @Override
        public void run(){
            BufferedReader bufferedReader=null;
            try {
                bufferedReader=new BufferedReader(new InputStreamReader(client.getInputStream(),"utf-8"));
                while(true){
                    String str=bufferedReader.readLine();//???
                    send(str,client);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class Test{
    public static void main(String[] args) throws IOException {
        new ChatRoomServer();
    }
}

整体架构如下:

image.png