线程&网络问题

时间:2013-05-02 10:50:35

标签: java

给出以下代码:

 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个线程? 如果没有,我该如何正确有效地实施?

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

2 个答案:

答案 0 :(得分:1)

如果没有提供太多代码,我将概述您为实现目标而想做的事情。

server上:

  • 保留所有已连接array个对象的client或类似内容
  • send()班级
  • 中实施client功能
  • 实现循环通过客户端列表的broadcast()函数,并向每个函数发送消息(使用前面提到的send()函数
  • 确保从列表中跟踪(并删除)任何无效/已断开连接的clients,否则您在尝试发送给他们时会遇到麻烦。

client上:

  • 确保在关闭/断开连接时发送“已连接已终止”消息,以告知您要离开的server(使服务器更容易将您移除)

答案 1 :(得分: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(同样不是必须的)来获取客户端文本