千家信息网

如何使用Java多线程来实现多人聊天室

发表于:2024-09-23 作者:千家信息网编辑
千家信息网最后更新 2024年09月23日,这篇文章主要为大家展示了"如何使用Java多线程来实现多人聊天室",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何使用Java多线程来实现多人聊天室"这篇
千家信息网最后更新 2024年09月23日如何使用Java多线程来实现多人聊天室

这篇文章主要为大家展示了"如何使用Java多线程来实现多人聊天室",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何使用Java多线程来实现多人聊天室"这篇文章吧。

客户端代码:

package netProgram;import java.io.IOException;import java.net.Socket;import java.net.SocketAddress;public class Client implements ScreenInputInterface{    private SocketHandler socketHandler;    public void start(){        new Thread(new ScreenInputRunIns(this)).start();        try {            socketHandler =   new SocketHandler(new Socket("127.0.0.1",666),null);            new Thread(socketHandler).start();        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void send(String msg) {        socketHandler.sendMsg(msg);    }    /*    @Override    public void send(String msg, SocketAddress address) {        socketHandler.sendMsg(msg);    }*/}

服务端代码:

package netProgram;import java.io.IOException;import java.net.ServerSocket;import java.net.SocketAddress;import java.util.ArrayList;import java.util.List;public class Server implements ScreenInputInterface{    private List clients = new ArrayList<>();    private ServerSocket serverSocket;    public void start(){//        new Thread(new ScreenInputRunIns(this)).start();        try {            serverSocket = new ServerSocket(666);            while (true){                SocketHandler socketHandler = new SocketHandler(serverSocket.accept(),this);                clients.add(socketHandler);                System.out.println(socketHandler.getSocket().getRemoteSocketAddress()+"进入聊天系统");                new Thread(socketHandler).start();            }        } catch (IOException e) {            e.printStackTrace();        }    }    @Override    public void send(String msg) {        for (SocketHandler s:clients) {            s.sendMsg(msg);        }    }    /*    @Override    public void send(String msg, SocketAddress address) {        for (SocketHandler s:clients) {            if (s.getSocket().getRemoteSocketAddress().equals(address)){                continue;            }            s.sendMsg(msg);        }    }*/    public static void main(String[] args) {        new Server().start();    }}

屏幕输入信息接口:

package netProgram;import java.net.SocketAddress;public interface ScreenInputInterface {    void send(String msg);//    void send(String msg, SocketAddress address);}

用于各个端口输入信息的创建的线程对象:

package netProgram;import java.util.Scanner;public class ScreenInputRunIns implements Runnable{    private ScreenInputInterface screenInputInterface;    private Scanner input = new Scanner(System.in);    public ScreenInputRunIns(ScreenInputInterface screenInputInterface) {        this.screenInputInterface = screenInputInterface;    }    @Override    public void run() {//屏幕实时输入        while (true){            String msg = input.nextLine();//            screenInputInterface.send(msg,null);            screenInputInterface.send(msg);        }    }}

套接字处理器(用于传输数据:实际发送信息到输出流并实时监听各个端口的输入且负责显示):

package netProgram;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class SocketHandler implements Runnable{    private String clientName;    private Socket socket;    private PrintWriter writer;    private Server server;    public SocketHandler(Socket socket,Server server) throws IOException {        this.socket = socket;        this.server = server;        clientName  = "<"+socket.getLocalSocketAddress()+">";        writer = new PrintWriter(this.socket.getOutputStream());    }    public Socket getSocket() {        return socket;    }    public void sendMsg(String msg){        if (server!=null) writer.println(msg);        else writer.println(clientName+":"+msg);        writer.flush();    }    @Override    public void run() {        while(true){//监听输入流的输入            try {                BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));                String receiveMsg = null;                System.out.println();                if ((receiveMsg = reader.readLine())!=null&&!(receiveMsg.equals(""))){                    if (server!=null){//                        server.send(receiveMsg,socket.getRemoteSocketAddress());                        server.send(receiveMsg);                    }else {                        System.out.println(receiveMsg);                    }                }            } catch (IOException e) {                e.printStackTrace();            }        }    }}

负责启动的各个端口的客户端代码:

package netProgram;public class ClientLinked {    public static void main(String[] args) {        new Client().start();    }}
package netProgram;public class ClientLinked1 {    public static void main(String[] args) {        new Client().start();    }}
package netProgram;public class ClientLinked2 {    public static void main(String[] args) {        new Client().start();    }}

服务端启动代码在服务端类的main方法中。

以上是"如何使用Java多线程来实现多人聊天室"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0