Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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

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_Client Server_Nio_Bytebuffer - Fatal编程技术网

Java 我的服务器向我的客户端发送了两次信息。我不知道为什么

Java 我的服务器向我的客户端发送了两次信息。我不知道为什么,java,sockets,client-server,nio,bytebuffer,Java,Sockets,Client Server,Nio,Bytebuffer,编辑我现在有它的工作感谢下面的评论。我还解释了我在评论中修正的内容。谢谢你们的帮助 我正在用java开发一个多人游戏。到目前为止进展很顺利,但是我在服务器向客户端发送信息时遇到了问题。这个过程应该是,服务器从客户机接收信息并解释它应该做什么。在这种情况下,客户端向服务器发送带有逗号的聊天消息。聊天吧,鲍勃,留言在这里。 此时,服务器实际上应该将相同的信息发送回发送消息的客户端。然而,不知何故,在这一过程中,存储信息的ByteBuffer被破坏了 以下是服务器的相关代码:

编辑我现在有它的工作感谢下面的评论。我还解释了我在评论中修正的内容。谢谢你们的帮助

我正在用java开发一个多人游戏。到目前为止进展很顺利,但是我在服务器向客户端发送信息时遇到了问题。这个过程应该是,服务器从客户机接收信息并解释它应该做什么。在这种情况下,客户端向服务器发送带有逗号的聊天消息。聊天吧,鲍勃,留言在这里。 此时,服务器实际上应该将相同的信息发送回发送消息的客户端。然而,不知何故,在这一过程中,存储信息的ByteBuffer被破坏了

以下是服务器的相关代码:

                    // Read the data
                    SocketChannel sc = (SocketChannel) key.channel();

                    // interpret
                    int bytesEchoed = 0;
                    while (true) {
                        //Clears this buffer.
                        echoBuffer.clear();

                        int number_of_bytes;
                        String message = new String(echoBuffer.array());
                        String[] splits = message.split(",");
                        try {
                            number_of_bytes = sc.read(echoBuffer);
                        } catch (java.io.IOException e) {
                            key.cancel();
                            number_of_bytes = -1;
                        }
                        //-----------Interpret Packets--------------------

                        //-------------Chat-----------------
                        if (splits[0].contentEquals("chat")) {
                            //do chat shit
                            String name = splits[1];
                            String text = splits[2];
                            String sendBack = "chat," + name + "," + text + ","+"\r";
                            System.out.println(sendBack);
                            if (splits[0].equals("chat")) {
                                echoBuffer.clear();
                                echoBuffer.put(sendBack.getBytes());
                            }
                        }

                        //

                        if (number_of_bytes <= 0) {
                            break;
                        }

                        //
                        //

                        echoBuffer.flip();
                        sc.write(echoBuffer);
                        bytesEchoed += number_of_bytes;
                    }

                    System.out.println("Echoed " + bytesEchoed + " from " + sc);

                    // once a key is handled, it needs to be removed
                    it.remove();
                }

            }
        }
    }

有人能告诉我我搞砸了什么吗?

在将发送回字符串放入bytebuffer之前,我没有搞清楚,这是在将文本添加到缓冲区的末尾,而不是开始。此外,在客户端,我使用readLine获取传入数据,但传出服务器数据上没有回车符或新行,导致我的客户端没有读取任何内容。这两件事都解决了,让它正常工作

你发布的代码太多了。删掉不相关的内容。如果您不知道什么是相关的,请使用调试器。使用调试器。你们可以分类,我建议客户端正在发送这些东西,而你们的服务器只是在正确地回显它。注意:如果你得到一个IOException,你应该关闭通道,而不是取消键。我不知道如何调试,所以我在谷歌上搜索了它,并使用netbeans调试器逐步完成了程序。在放入发送回字符串之前,我没有清除,而是将文本添加到缓冲区的末尾,而不是开始。此外,在客户端,我使用readLine获取传入数据,但在传出服务器数据上没有回车符或新行,导致我什么也不读取。这两件事都解决了,让它正常工作。换句话说,你从客户端发送了两次信息,所以错误不在你发布的服务器代码中。