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

时间:2013-01-08 16:02:53

标签: java multithreading sockets swt chat

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

我正在尝试做什么。

  1. 我想将在线客户端列表(LinkedList)发送给连接到服务器的所有客户端。
  2. 我想从客户端读取数据(来自StyledText的字符串)并将其写入全局主聊天区域(StyledText)。
  3. (类似于mIRC计划)。

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

    我发布了一些截图以便更好地理解:

    enter image description here

    enter image description here

    这就是我创建服务器的方式:

    DialogServer dialog = new DialogServer(new Shell());
    dialog.create();
    if(dialog.open() == Window.OK){
       new Server(serverAddress).start(); //dialog sets serverAddress as a String IP
    }
    

    服务器类:

    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
                }
            });
        }
    }
    

    连接服务器的对话框:

       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 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中开发

1 个答案:

答案 0 :(得分:1)

您的目标可分为三个任务:

  1. 创建用户界面
  2. 处理网络通信
  3. 将这两者捆绑在一起
  4. Stack Overflow是AFAIK,并非旨在指导整个项目。 您需要说明有关特定问题的具体问题。

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