客户端未完全收到字符串

时间:2014-01-14 18:48:21

标签: java objective-c sockets

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

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

如果我需要发送长文本,那该怎么办。

2 个答案:

答案 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是流协议,而不是消息协议。您必须处理接收方的消息框架。在您的情况下,您可以继续阅读,直到您收到换行符。

当您从接收器的角度观看时,网络可能会将您的信息分成几个部分,而不是任意。它实际上并不是随意的,但根据网络拓扑结构涉及很多因素。接收方必须收集这些部分,直到收到完整的消息。这称为框架。可以使用新行进行成帧,或者预先设置长度并保持读数直到满意,或任何其他解决方案让接收者知道会发生什么。