Java聊天套接字读取和发送数据

Java聊天套接字读取和发送数据,java,multithreading,sockets,swt,chat,Java,Multithreading,Sockets,Swt,Chat,我成功开发了一个应用程序,您可以创建/连接到服务器。我有一个名为Person的类,其中有一个公共静态LinkedList。在此列表中,我存储连接到服务器的客户端。服务器/客户端类位于同一个包中。服务器和客户端类是扩展线程(它们在后台工作) 我想做的事 我想将联机客户端列表(LinkedList)发送给连接到服务器的所有客户端 我想从客户端读取数据(StyledText中的字符串),并将其写入全局主聊天区(StyledText) (类似于mIRC程序) 我整天都在阅读和搜索,但我从来没有看到关于“

我成功开发了一个应用程序,您可以创建/连接到服务器。我有一个名为Person的类,其中有一个公共静态LinkedList。在此列表中,我存储连接到服务器的客户端。服务器/客户端类位于同一个包中。服务器和客户端类是扩展线程(它们在后台工作)

我想做的事

  • 我想将联机客户端列表(LinkedList)发送给连接到服务器的所有客户端
  • 我想从客户端读取数据(StyledText中的字符串),并将其写入全局主聊天区(StyledText)
  • (类似于mIRC程序)

    我整天都在阅读和搜索,但我从来没有看到关于“Java聊天应用”的好的解释、示例或文档。我发现了AWT,Swing,但问题是我只知道SWT。此外,我还找到了TELNET教程,输入和输出流是在控制台(CMD)中读取和写入的。我需要使用InputStreamReader、BufferedStreamReader和PrintWriter吗?如果有,是否需要将这些数据转换为字节数组,然后将它们转换为对象

    为了更好地理解,我发布了一些截图:

    以下是我创建服务器的方式:

    DialogServer dialog = new DialogServer(new Shell());
    dialog.create();
    if(dialog.open() == Window.OK){
       new Server(serverAddress).start(); //dialog sets serverAddress as a String IP
    }
    
       DialogConnect dialog = new DialogConnect(new Shell());
       dialog.create();
       if(dialog.open() == Window.OK){
          new Client(connectAddress, connectNickname).start(); // dialog sets String parameters. new Client start a new Thread for a client.
       }
    
    服务器类:

    public class Server extends Thread{
    
        private static ServerSocket serverSocket;
        private static Socket socket;
        private static String address;
    
        public Server(String address){
            this.address = address;
        }
    
        public void run(){
            try {
                serverSocket = new ServerSocket(5000, 10, InetAddress.getByName(address));
                View.serverUp = true;
                View.log("Server is up. Listening on " + address + ":5000");
                Person p = new Person(View.nickname, true, 100.0);
                Person.listPeople.add(p); //add ADMIN to static LinkedList
                while(true){
                    socket = serverSocket.accept();
                    new Client(socket).start(); // client class thread
                    refresOnlineList(); // refresh UI table
                }
    
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        public static void refresOnlineList(){
            View.display.syncExec(new Runnable() {
    
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    View.tableViewer.refresh();
                    // TableViewer which contains online client list
                }
            });
        }
    }
    
    public class Client extends Thread{
        private static Socket socket;
        private static String nickname;
    
        public Client(Socket socket){
            this.socket = socket;
        }
    
        public Client(String address, String nickname){
            socket = new Socket();
            try {
                socket.connect(new InetSocketAddress(address, 5000), 10);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                View.log("Cannot connect to server.");
            }
    
            this.nickname = nickname;
        }
    
        public void run(){
            try {
                Person p = new Person(nickname, false, 15.4);
                Person.listPeople.add(p); // add PERSON to static LinkedList
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    要连接到服务器的对话框:

    DialogServer dialog = new DialogServer(new Shell());
    dialog.create();
    if(dialog.open() == Window.OK){
       new Server(serverAddress).start(); //dialog sets serverAddress as a String IP
    }
    
       DialogConnect dialog = new DialogConnect(new Shell());
       dialog.create();
       if(dialog.open() == Window.OK){
          new Client(connectAddress, connectNickname).start(); // dialog sets String parameters. new Client start a new Thread for a client.
       }
    
    客户端类:

    public class Server extends Thread{
    
        private static ServerSocket serverSocket;
        private static Socket socket;
        private static String address;
    
        public Server(String address){
            this.address = address;
        }
    
        public void run(){
            try {
                serverSocket = new ServerSocket(5000, 10, InetAddress.getByName(address));
                View.serverUp = true;
                View.log("Server is up. Listening on " + address + ":5000");
                Person p = new Person(View.nickname, true, 100.0);
                Person.listPeople.add(p); //add ADMIN to static LinkedList
                while(true){
                    socket = serverSocket.accept();
                    new Client(socket).start(); // client class thread
                    refresOnlineList(); // refresh UI table
                }
    
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        public static void refresOnlineList(){
            View.display.syncExec(new Runnable() {
    
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    View.tableViewer.refresh();
                    // TableViewer which contains online client list
                }
            });
        }
    }
    
    public class Client extends Thread{
        private static Socket socket;
        private static String nickname;
    
        public Client(Socket socket){
            this.socket = socket;
        }
    
        public Client(String address, String nickname){
            socket = new Socket();
            try {
                socket.connect(new InetSocketAddress(address, 5000), 10);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                View.log("Cannot connect to server.");
            }
    
            this.nickname = nickname;
        }
    
        public void run(){
            try {
                Person p = new Person(nickname, false, 15.4);
                Person.listPeople.add(p); // add PERSON to static LinkedList
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    

    在Eclipse RCP 3.8中开发,您的目标可分为三个任务:

  • 创建用户界面的步骤
  • 处理网络通信
  • 把这两个人绑在一起
  • 堆栈溢出不是为了指导整个项目。 你需要陈述关于具体问题的具体问题


    我建议您从控制台应用程序(客户端和服务器)开始,以摆脱创建UI的负担。完成后,您可以创建一些UI并将事件绑定到其中。

    请发布一个特定问题。很难说出你想要什么。