1

给定以下代码:

 Client c1 = new Client();
 c1.connect("127.0.0.1",1300);

连接功能:

public void connect(String serverName, int port)
{
    try {

        Socket socket = new Socket(serverName,port);
        connection = new ConnectionProxy(socket);
        connection.start();
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
}

ConnectionProxy类扩展Thread):

public class ConnectionProxy extends Thread {
private Socket socket;
private InputStream is;
private OutputStream os;
private StringConsumer client;

public ConnectionProxy(Socket socket)
{
    this.socket = socket;

    try {
        is = socket.getInputStream();
        os = socket.getOutputStream();
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
}
public void run () {

    DataInputStream dis = new DataInputStream(is);
    DataOutputStream dos = new DataOutputStream(os);

    while (socket != null)
    {
        try {
            String msg = dis.readUTF();
            System.out.println(msg);
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }

    }
}

我正在尝试实现聊天,并且发现很难将客户端编写的消息发送给所有当前连接的客户端。

我怎么能那样做?我应该在服务器端保存每个对象(如 c1)的引用,还是应该在服务器端保存该ConnectionProxy线程?如果没有,我该如何正确有效地实现它?

很想得到一些帮助!谢谢!

4

2 回答 2

1

在没有给出太多代码的情况下,我将概述你想要做些什么来实现你的目标。

在你的server

  • 保留所有连接对象的一个array​​或类似的东西client
  • 在你的类中实现一个send()函数client
  • 实现一个broadcast()循环遍历客户端列表并向每个客户端发送消息的函数(使用上述send()函数
  • 确保跟踪(并删除)clients列表中的任何死/断开连接,否则您将在尝试发送给他们时遇到麻烦。

在你的client

  • 确保在关闭/断开连接时发送“连接终止”消息以告知server您要离开(使服务器更容易删除您)
于 2013-05-02T11:38:50.197 回答
0

服务器应该为每个传入连接创建一个新的客户端处理程序线程。

例如,在服务器端尝试类似:

ServerSocket server = new ServerSocket(port);

    while (true) {
        Socket client = server.accept();
        //add incoming client to connected clients vector.
        HandleClient c = new HandleClient(client);
        clients.add(c);
    }

在客户端向量中创建和存储客户端之后,您可以在 HandleClient 类 run() 方法上实现一个 bufferReader(同样不是必须的)来获取您的客户端文本

于 2013-05-02T10:58:24.523 回答