2014-01-14 41 views
0

在下面的代码中,我从服务器接收数据,但没有完全收到字符串“我应该收到一个句子,但每次我收到一段不同长度的句子”未在客户端完全收到字符串

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'); 

而且如果我需要发送一个长文本发送到服务器。

+1

[字符编码](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#getBytes%28java.lang.String%29)! 'outToClient.writeBytes(“注册已接受,您现在可以登录\ n”.getBytes(“US-ASCII”))'另外,首先发送字符串长度是个好主意。 –

+0

还是没有发送整个句子..是生病尝试发送长度第一 – user3188822

+0

有人可以请指导我。 – user3188822

回答

0

你并没有冲洗你的Stream。试试像这样

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(); 
     } 
    } 
} 
+0

我试过这个,但现在在客户端“len = [inputStream read:buf maxLength:1024 ];”没有得到任何东西 – user3188822

+0

有一个小错误没有什么是你的代码错误。谢谢 – user3188822

0

除了冲洗发送端,接收端是不安全的。

TCP是一个流协议,而不是消息协议。你必须在接收端处理消息帧。在你的情况下,你可以继续阅读,直到你收到换行符。

网络可能会将您的消息拆分为多个部分,而不是从接收机的角度来看它。它并不是任意的,但取决于网络拓扑结构,涉及很多因素。接收器必须收集这些部分,直到收到完整的消息。这被称为取景。人们可以使用换行符进行组帧,或者预先确定长度并继续阅读直到满意,或者使接收机知道应该期望什么的任何其他解决方案。

相关问题