Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java套接字编程中管理所有传入的聊天消息_Java_Sockets_Tcp_Serversocket - Fatal编程技术网

在java套接字编程中管理所有传入的聊天消息

在java套接字编程中管理所有传入的聊天消息,java,sockets,tcp,serversocket,Java,Sockets,Tcp,Serversocket,我正在开发一个具有聊天功能的程序,并在其中使用套接字。 在我的例子中,我想在不同的聊天窗口中处理每个客户端(请参见附件) 到目前为止,当连接1个客户端时,没有问题。但当连接两个客户端时,第一个客户端将被第二个客户端覆盖,并且他无法从服务器接收消息,除非我关闭连接的最新客户端的连接(服务器仍然从所有客户端接收消息,尽管只有一个客户端可以从服务器接收消息) 我该怎么做?我在用卡萨船长的框架 我想像下图那样管理它 这是我的密码: 服务器: 客户: public void client(){

我正在开发一个具有聊天功能的程序,并在其中使用套接字。 在我的例子中,我想在不同的聊天窗口中处理每个客户端(请参见附件)

到目前为止,当连接1个客户端时,没有问题。但当连接两个客户端时,第一个客户端将被第二个客户端覆盖,并且他无法从服务器接收消息,除非我关闭连接的最新客户端的连接(服务器仍然从所有客户端接收消息,尽管只有一个客户端可以从服务器接收消息)

我该怎么做?我在用卡萨船长的框架 我想像下图那样管理它

这是我的密码: 服务器:

客户:

public void client(){
        Thread client = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    socket = new Socket("localhost",port);

                    din  = new DataInputStream(socket.getInputStream());
                    dout = new DataOutputStream(socket.getOutputStream());

                    while (!read.equals("bye")){
                        read = din.readUTF();

                        if (getClientArea()!=null){
                            setClientArea(getClientArea()+"\n"+read);
                        }else {
                            setClientArea(read);
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    try {
                        din.close();
                        dout.close();
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        client.start();
    }

    public void clientSend(javax.faces.event.ActionEvent event) {
        write = getClientField();
        try {
            dout.writeUTF(write);
            dout.flush();
            if (getClientArea()!=null){
                setClientArea(getClientArea()+"\n"+write);
                setClientField("");
            }else {
                setClientArea(write);
                setClientField("");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(write);
    }

我相信我理解这个问题,以及如何纠正它

您正在为每个新连接使用唯一的线程(chatHandler)。
此线程在连接时自动写入“Hello”,但此后将专用于读取消息(在while循环中,您只读取din)并相应地更新控制台。由于每个线程都在管理对din的引用,因此所有传入消息都正常

然而,写回客户机(serverSend)似乎不在线程中;它由按钮事件触发。此时,dout将是对最近连接的引用,而不是对要获取消息的客户端的引用。这就是为什么最近的客户机会获得所有未来的消息

纠正方法是为预期客户选择正确的“dout”。当服务器“操作员”选择写回消息(单击“发送”按钮)时,您需要为该客户端获取正确的“dout”

一种方法是在创建线程之前建立dout(使用套接字),并在每个客户机及其对应的dout(即在映射中)之间保持关系


如果问题仍然不清楚(每个客户都必须有一个对dout的唯一引用),请让我知道,我将尝试澄清。

我投票将此问题作为离题题结束,因为没有问题here@ScaryWombat抱歉,刚刚编辑完毕。这不是一个“思想开放”网站,而是一个更具体问题的网站。请阅读的“如何提问”部分,了解如何最好地使用此网站。@HovercraftFullOfEels谢谢,抱歉,我只是个新手,我承认我没有阅读“如何提问”。总之,刚刚编辑了我的问题,希望你能帮助MemanageJavaSocket编程中所有传入的聊天信息。你真的说到点子上了。你说的一切都是对的。只是,我在想我该如何与每个客户保持关系。以及如何为每个客户端的服务器实现聊天窗口。我在想一个循环。但也许有更好的方法来管理套接字池会很困难。我总是尝试为新连接分配一个整数id(1、2、3..等等)。此id可用于将dout[1]与分配给1的GUI组件绑定在一起,等等。如果解决方案的所有部分在每个会话中共享此唯一id,则可以将它们绑定在一起。考虑将dout存储在一个数组中,使用clientId作为索引,并以某种方式将相同的id与GUI组件关联起来。当选择GUI组件时,您将引用clientID,这允许您查找dout[clientID]。希望这有意义。。。
public void client(){
        Thread client = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    socket = new Socket("localhost",port);

                    din  = new DataInputStream(socket.getInputStream());
                    dout = new DataOutputStream(socket.getOutputStream());

                    while (!read.equals("bye")){
                        read = din.readUTF();

                        if (getClientArea()!=null){
                            setClientArea(getClientArea()+"\n"+read);
                        }else {
                            setClientArea(read);
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    try {
                        din.close();
                        dout.close();
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        client.start();
    }

    public void clientSend(javax.faces.event.ActionEvent event) {
        write = getClientField();
        try {
            dout.writeUTF(write);
            dout.flush();
            if (getClientArea()!=null){
                setClientArea(getClientArea()+"\n"+write);
                setClientField("");
            }else {
                setClientArea(write);
                setClientField("");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(write);
    }