当前位置: 首页 > 知识库问答 >
问题:

输入长度未知的套接字通信

宗烨赫
2023-03-14

我试图修复一个java套接字通信错误,服务器不知道输入消息的长度。在当前情况下,服务器测试输入是否完成inputStream.available();方法。然而,这种方法并不总是返回正确答案。它会导致读取部分输入。似乎有两种不同的可能性来解决这个问题。

>

客户端应该在发送后关闭其输出流,但这会导致客户端不读取响应,因为输出流关闭时套接字也会关闭。

有没有其他建议,特别是在nio包的帮助下?

非常感谢。

共有3个答案

穆理
2023-03-14

至少还有另外两种方法没有提及,可能应该提及。

>

  • 使用特殊字符表示某个输入的结尾。如果输入中不允许有新行,则\r\n是一个选择。

    使用某种序列化-您可以将数据作为JSON对象或XML之类的格式发送,这样您就知道什么时候没有更多的数据了。

  • 蒋骏
    2023-03-14

    available()不是消息长度的度量值,因此如果“正确答案”的定义是“消息长度”,则没有理由返回“正确答案”。

    如果您想要消息长度,您必须发送一个。或者使用行或自描述协议,如XML、序列化等。

    柳豪
    2023-03-14

    你可以用

    socket.shutdownOutput();
    

    关闭客户端的输出流。这将显示为关闭的输入流,而不关闭套接字。

    顺便说一句:你不能使用套接字。GetOutputStream()。关闭() 我认为你可以。

    IMHO发送长度是最佳选择,因为这将允许您使用同一套接字发送多个请求。

    下面是一个例子

    public class SimpleServerMain {
        public static void main(String... args) throws IOException, InterruptedException {
            ServerSocket ss = new ServerSocket(54321);
            Socket s = ss.accept();
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            for (String line; (line = br.readLine()) != null; )
                System.out.println("Got " + line);
    
            PrintStream ps = new PrintStream(s.getOutputStream());
            for (String word : "Hello World Bye Bye!".split(" ")) {
                ps.println(word);
                Thread.sleep(1000);
            }
            s.close();
            ss.close();
        }
    }
    

    public class SimpleClientMain {
        public static void main(String... args) throws IOException {
            Socket s = new Socket("localhost", 54321);
            InputStream inputStream = s.getInputStream();
    
            s.getOutputStream().write("Hello\n".getBytes());
            s.shutdownOutput();
    
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
            for (String line; (line = br.readLine()) != null; )
                System.out.println("Got " + line);
            System.out.println("Disconnected.");
            s.close();
        }
    }
    
     类似资料:
    • 问题内容: 不知道频道 长度时,我无法关闭频道 它给我错误 这是合乎逻辑的-当第二个goroutine关闭通道试图发送给它时,它关闭了它。在这种情况下关闭渠道的最佳方法是什么? 问题答案: 通道关闭后,您将无法在该通道上发送更多值,否则会出现混乱。这就是您的经验。 这是因为您启动了使用同一个通道的多个goroutine,并且它们在该通道上发送值。然后关闭每个通道。而且由于它们未同步,因此一旦第一个

    • Netty TCP Server在端口处运行,接收格式的数据。它使用Marine API库将胡言乱语转换为需要从套接字输入流的有意义的信息。 如何获得正在使用的netty服务器端口的输入流?

    • 问题内容: 我有这个功能(将代码示例的HTML标记剥离)从CSV构建HTML表,但是每次尝试运行它时都会遇到运行时错误,但我不知道为什么。谷歌说,也许编码有些错误,但是我不知道如何更改。 我的CSV以ANSI编码,并包含ä,Ä,Ü,Ö等字符,但我无法控制编码,或者将来是否会更改。 错误发生在这里: 121行是 源代码: 问题答案: 您可以尝试通过使用方法(javadocs)的形式来利用正确的编码。

    • 本文向大家介绍jQuery 限制输入字符串长度,包括了jQuery 限制输入字符串长度的使用技巧和注意事项,需要的朋友参考一下 我们后台做程序的时候,比如录入一篇文章,文章会有摘要,我们希望文章的字符长度是我们可以控制的,我们不希望它太长,比如限制只能输入250个字符,下面的代码实现了这种功能。 先来看一下效果图 代码如下: 以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持呐喊教程

    • 问题内容: 我让我的用户以HTML形式添加数字输入,并用值填充它们。该表单在提交时被序列化,并发送到一个PHP文件,该文件使用PDO将数据插入到MySQL数据库中。数据库表中有一堆列,用于存储表单中的其他值,但是用于存储用户添加的输入的列的设置如下: 这些列允许使用,因为我根本不知道用户是否会添加任何数字输入。 有没有更好的方法来存储这些数字? 以下是我的JS的一部分,用于获取表单数据并将其发送到

    • 我想为Netty处理程序使用不同于套接字的输入。这可能吗?如果是这样,什么是有效的输入格式?