在我的Java应用程序中,打开了一个Socket并正在从其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();
}
}
'while(true)'should' while(c!= -1)' – elias
你能改变数据的发送方式吗?如果是的话,你可以在发送的消息的末尾添加一个消息结束符dlimiter,你可以在接收数据时查找它(确保你选择的分隔符通常不能成为消息的一部分) – Attila