-1

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

我正在尝试做的事情。

  1. 我想将在线客户端列表(LinkedList)发送给连接到服务器的所有客户端。
  2. 我想从客户端读取数据(来自 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
}

服务器类:

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

4

1 回答 1

1

你的目标可以分为三个任务:

  1. 创建用户界面
  2. 处理网络通信
  3. 将这两者绑定在一起

AFAIK 的 Stack Overflow 并非旨在指导整个项目。您需要就具体问题陈述具体问题。

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

于 2013-01-09T01:43:03.630 回答