java - 分隔来自套接字的数据

标签 java sockets networking

在我的 Java 应用程序中,有一个打开的套接字,正在从其 InputStream 中读取数据。

在最佳条件下,每个数据包都会调用 read() 返回其应用层数据。这就是我想要得到的 - 每个数据包一条“消息”。

但是,根据 getReceiveBufferSize() 返回的内容,数据可能会缓冲在套接字中。如果发生这种情况并且从中读取流,则可能存在来自多个数据包的数据。

是否有另一种方法可以从单个数据包中获取数据,或者这是否违反了抽象层? 或者,是否可以为数据附加到缓冲区时设置某种分隔符?或者这是平台级别无法完成的事情?

下面是一些示例代码来演示我在做什么:

import java.io.InputStream;
import java.net.Socket;

public class Belnets {


public Belnets() {
    try{
        Socket s = new Socket("address", 23);
        System.out.println("platform will buffer this much: "+s.getReceiveBufferSize());
        InputStream sin = s.getInputStream();
        byte[] data = new byte[1024];
        int c;
        while(true){
            c = sin.read(data);
            for(int i=0; i<c; i++){
                System.out.print((char)data[i]);
            }
            System.out.println("=END OF READ=");

            //if you dont do this, read() seems to return once for each packet as this loop 
            //appears to be running fast enough to keep up with the rate of data that comes in.
            //otherwise data gets buffered and you get multiple packets worth of data before seeing
            //=END OF READ=
            Thread.sleep(1000);     

        }

    }catch(Exception e){
        e.printStackTrace();
    }
}   



public static void main(String args[]){
    new Belnets();
}

}

最佳答案

Java API 不提供任何读取 TCP 数据包的方法。它是基于流的,您绝对无法一次读取一个数据包。

如果你想发送和接收多条消息,你需要实现一个应用程序级协议(protocol),它可能在消息之间使用特定的分隔符,或者发送消息的长度后跟消息体本身,例如。

关于java - 分隔来自套接字的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11127939/

相关文章:

java - Java 内存方面的数组与矩阵

java - 拆分从 servlet 中的文本区域获取的 2 个句子

java - W/System.err : java.net.SocketException:套接字已关闭

c - sockaddr 和 IPv6 地址

java - TCP 发送/接收丢失的字节

linux - 驱动程序是否使用 Linux NAPI 接口(interface)?

java - 具有第三个值的 XYdataset Jfreechart 标签图

java - 函数式编程与面向对象编程

java - 从 HTTP 服务器中的套接字读取的推荐方法

java - 负载均衡器、套接字和 Java