在我的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