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
如何使用不带字符和EOF的readline java_Java_Sockets_Readline_Eof - Fatal编程技术网

如何使用不带字符和EOF的readline java

如何使用不带字符和EOF的readline java,java,sockets,readline,eof,Java,Sockets,Readline,Eof,我正在尝试用java实现一个简单的服务器应用程序 它所做的只是在tcp/ip上的消息中读取,并将其存储为字符串。这是我的代码 try{ in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); } catch (IOException e) { System.out.println("cannot open input buffer");

我正在尝试用java实现一个简单的服务器应用程序

它所做的只是在tcp/ip上的消息中读取,并将其存储为字符串。这是我的代码

    try{
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    } catch (IOException e) {
        System.out.println("cannot open input buffer");
        System.exit(-1);
    }

    clientSocket.setSoTimeout(5000);

    //read first bit of message
    message = in.readLine();
    System.out.println(message);
    //as message is an undefined length we need to loop and check for the springer miller 
    //end mark /Request
    while(message.contains("/Request") == false  )
    {
        try {
        message = in.readLine();
        System.out.println(message);
        }
        catch (IOException e) {
            System.out.println("cannot open input buffer");
            System.exit(-1);
        }
    }       

    //reply
    out.println(outputLine);
我遇到的问题是消息似乎没有EOF。这是我翻译成我的另一个公司协议,这是程序的目的,所以我不能在消息中添加EOF

如果我运行该程序,将获得以下信息:

POST / HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: http://htng.org/1.1/Listener.Wsdl#ReceiveMessageAsync
User-Agent: Java/1.6.0_24
Host: 192.168.0.32:8080
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
Content-Length: 3009
然后,当它应该读取消息正文时,它将挂起

我以前从未使用过java,也不想编写一个读取的二进制套接字来检测我自己的EOF

有没有办法读取x秒,然后返回

谢谢你的帮助

已经成功地在C++中构建了程序,但是需要输入到java,因为预定的机器是未知的。p> 将在EOF时返回null,并且不会引发异常

此外,“其他公司协议”似乎是HTTP上的SOAP。 也许您想使用HTTP或SOAP库?这里的其他人可以给出一些建议

否则,您可以使用以下方法: readLine一次,以检查方法是否确实是POST(否则可能不存在内容长度标题)以及路径是否正确。
readLine,直到它返回一个空行(或null),以读取所有HTTP头。 执行此操作时,请查找以内容长度开头的行,以确定以下XML数据的长度。
创建一个正确长度的char[],并使用.read(cbuf,0,cbuf.length)将xml读入创建的缓冲区cbuf。

在TCP/IP之上实现协议是一件棘手的事情,需要对网络、套接字和OS:s I/O的工作方式有相当多的了解

此外,除了网络复杂性之外,实现HTTP令人惊讶地复杂

我很有礼貌地建议,你可能在深水中,因为你必须在这个层次上提出问题,并且可能需要更多的帮助

……无论如何

如果您正在读取的服务器正在尝试与http通信,请使用现有组件。Apache HttpComponents可能是一个不错的选择。我真的不相信它伪造http头,我建议您跳过“轻量级”方法

以下是一些网络i/o的基本事实

网络写入是面向数据包的。Tcp/ip通常尝试将尽可能多的内容塞进每个数据包(使用一些智能算法)。这意味着,如果您写入4000字节,消息将被拆分为多个任意大小的数据包,但通常小于1500字节,具体取决于网络设备。这也意味着 如果写入的数据包少于一个,则写入的数据可能会合并到一个数据包中。(数据包也可以沿其路径拆分和合并。)

为了通过流发送消息(消息本身以数据包的形式传输…),您需要提前知道消息的长度,或者读取完整的数据包(将.read()读入一个大缓冲区),解析内容,并以某种智能方式提取和构造完整的消息。正是http所做的。(其中包括)


TCP/IP当然不是面向行的,所以您的换行代码完全被忽略了。HTTP使用内容长度(以及一些其他技巧,因为它可能并不总是被定义)通过单个tcp/ip流发送“消息”,当消息完全发送时,该流可能会关闭,也可能不会关闭

您需要定义“消息”的含义。看起来您正在使用HTTP,因此消息长度由content length标头定义。然而,已经有很多HTTP服务器是用Java编写的——为什么还要编写另一个呢?它是一个独立的应用程序,可以将tcp/ip协议转换为rs232协议,这样两个服务器就可以进行通信了。我指的是短信。服务器添加了我设置的http位,正文是xml。@Skeith:但http部分告诉您必须读取多少数据。那么,为什么不使用已经知道如何从HTTP请求中读取数据的代码呢?因为我的公司有一个服务器,但它的设计目的是监听rs232端口上的传入通信。我的老板想要一个用java编写的轻量级接口应用程序,所以我尝试将消息视为纯文本。这是用C++来完成的,但是java读块。@斯基思:我怀疑C++中没有真正的工作,因为如果连接的另一端保持打开,你怎么能分辨消息的结尾和网络延迟的区别呢?或者您只是在读取XML文档并假设文档结束标记后没有更多数据?同样,如果客户机正在发布HTTP请求,我建议使用现有的HTTP服务器。SOAP与读取XML有关,我已经处理好的一点是接收困扰我的消息。异常处理程序是一个读取的方法,如果没有找到EOF,它将返回5秒之后的任何一个。您是否已经考虑到所有XML都出现在一行中(在结尾没有新行)?抱歉,是厚的,但是Car还是char []还是java类?C++中,我使用的是ReV(NeXYFD,消息,SIZEOF消息,0)。新的\u fd是一个字符数组的套接字和消息。一次读取该消息会得到消息头,第二次读取会得到整个xml消息。根据iv read,java等效元素是一个bufferreader和lineread,但它将头读取为8个peices,将xml读取为一个,但如果执行9个reads,它将永远不会返回。如果我发送消息2,它会工作(2000比特),但消息1(3000比特)会挂起。我确实了解tcp/ip,但我可能在java中使用了错误的方法。谢谢你的帮助