使用Socket模拟聊天室

使用Socket模拟聊天室

客户端

客户端读线程

public class EchoClientReadThread implements Runnable{


    private Socket socket;
    private BufferedReader in;

    public EchoClientReadThread(Socket socket,BufferedReader in){
        this.in = in;
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            String str = null;

            while ((str = in.readLine()) != null){
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端写线程

public class EchoClientWriteThread implements Runnable{
    private PrintWriter out;
    private Socket socket;
    Scanner scanner;
    public EchoClientWriteThread(Socket socket,PrintWriter out,Scanner scanner){
        this.scanner = scanner;
        this.out = out;
        this.socket = socket;
    }

    @Override
    public void run() {
        String data =null;
        while ((data=scanner.nextLine())!=null){
            out.println(data);
        }

    }
}

客户主函数

public class EchoClient {
    public static void main(String[] args) {
        String host = "127.0.0.1";
        int port = 12345;
        try {
            Socket socket = new Socket(host,port);
            PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
            Scanner scanner = new Scanner(System.in);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            Thread t1 = new Thread(new EchoClientReadThread(socket,in));
            Thread t2 = new Thread(new EchoClientWriteThread(socket,out,scanner));
            t1.start();
            t2.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务端

服务端线程

public class EchoServerThread implements Runnable{

    private ArrayList<Socket> socketarr ;
    private Socket socket;

    public EchoServerThread(ArrayList Socketarr,Socket socket){
        this.socketarr = Socketarr;
        this.socket = socket;
    }
    @Override
    public void run() {

        try {
            InetSocketAddress address =  (InetSocketAddress) socket.getRemoteSocketAddress();
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String data = null;
            while ((data= in.readLine())!=null){
                System.out.println("来自:"+address.getHostName()+":"+address.getPort()
                        +"的信息:"+data);
                for (Socket s:socketarr){
                    PrintWriter out = new PrintWriter(s.getOutputStream(),true);
                    out.println("来自:"+address.getHostName()+":"+address.getPort()
                            +"的信息:"+data);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务端主函数

public class EchoServer {
    public static void main(String[] args) {
        int port = 12345;


        try {
            ArrayList<Socket> arrayList = new ArrayList<>();
            ServerSocket sst = new ServerSocket(port);
            while (true) {
                Socket ssc = sst.accept();
                InetSocketAddress address = (InetSocketAddress) ssc.getRemoteSocketAddress();
                System.out.println(address.getHostName()+":"+address.getPort()+"已连接");
                arrayList.add(ssc);
                new Thread(new EchoServerThread(arrayList, ssc)).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
posted @   鸭梨的药丸哥  阅读(1)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示