在下面的代码中,我从服务器接收数据,但字符串未完全收到“我应该收到一个句子,但每次我收到不同长度的句子段”
uint8_t buf[1024];
unsigned int len = 0;
len = [inputStream read:buf maxLength:1024];
NSString *s;
if(len > 0) {
NSMutableData* data=[[NSMutableData alloc] initWithLength:0];
[data appendBytes: (const void *)buf length:len];
s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",s);
}
服务器端: 我正在使用DataOutputStream
发送到服务器 ServerSocket welcomeSocket=new ServerSocket(6789);
while(true){
Socket connectionSocket=welcomeSocket.accept();
DataOutputStream outToClient=new DataOutputStream(connectionSocket.getOutputStream());
outToClient.writeBytes("sign up accepted you can now sign in"+'\n');
如果我需要发送长文本,那该怎么办。
答案 0 :(得分:0)
你没有冲洗你的溪流。试试这样的事情
OutputStream outToClient = null;
try {
ServerSocket welcomeSocket = new ServerSocket(6789);
while (true) {
Socket connectionSocket = welcomeSocket.accept();
outToClient = new BufferedOutputStream(
connectionSocket.getOutputStream());
outToClient.write("sign up accepted you can now sign in\n"
.getBytes("UTF-8"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outToClient != null) {
try {
outToClient.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outToClient != null) {
try {
outToClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 1 :(得分:0)
除了冲洗发送方之外,接收方也不安全。
TCP是流协议,而不是消息协议。您必须处理接收方的消息框架。在您的情况下,您可以继续阅读,直到您收到换行符。
当您从接收器的角度观看时,网络可能会将您的信息分成几个部分,而不是任意。它实际上并不是随意的,但根据网络拓扑结构涉及很多因素。接收方必须收集这些部分,直到收到完整的消息。这称为框架。可以使用新行进行成帧,或者预先设置长度并保持读数直到满意,或任何其他解决方案让接收者知道会发生什么。