千家信息网

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

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要为大家展示了"如何使用Java多线程来实现多人聊天室",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"如何使用Java多线程来实现多人聊天室"这篇
千家信息网最后更新 2025年01月19日如何使用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多线程来实现多人聊天室"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

输入 线程 代码 多人 聊天室 信息 内容 端口 篇文章 服务 实时 客户 客户端 屏幕 学习 帮助 监听 处理器 套接字 实际 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 松江区管理网络技术服务哪家好 如何设置服务器指定7天重启一次 财富互联网科技有限公司月薪 联通软件开发工程师怎么样 商务软件开发公司 电商网络安全的问题 湖北生鲜专用软件开发 国家电网网络安全灾备中心 免费oracle数据库 数据库idx排列 物联网网络安全蚂蚁文库 福州直播场控软件开发 网络安全手抄报易画五年级 华为软件开发是哪个部门 洛阳大通网络技术中标 在外连接无线网络安全吗 网络安全宣传周启动仪式简报信息 伯特利网络安全 衢州运营网络技术包括什么 网络安全中级测评师难考吗 网络安全隔离软件 中国互联网科技行业投资 ecu软件开发平台 网络技术对音乐发展的影响 怎样清除数据库文件夹 紫光互联网科技有限公司南昌 服务器工程师做什么的 警方网络技术手段 上海会议混合现实技术软件开发 qt的数据库能存放什么
0