套接字纯文本响应中断

时间:2012-03-06 09:34:12

标签: c# android sockets

我在Android(客户端)和c#app(服务器)之间获取套接字连接时无法正确读取响应。

我已成功收到从android发送到c#的消息,并且我正在阅读它。但是当我尝试向android发送确认时,我不知道处理这个问题的正确方法,而且我不得不做一些假设,其中教程不清楚。我在Android中获得回复,但它不是100%正确。我已经通过Wireshark验证了c#正在发送我想要它发送的内容,并且文本看起来很好,直到它到达android。

C#:
    public void SendClientMessage()
    {
        NetworkStream clientStream = _Client.GetStream();
        ASCIIEncoding encoder = new ASCIIEncoding();
        byte[] buffer = encoder.GetBytes("Hello Client!");  //Static test message

        clientStream.Write(buffer, 0, buffer.Length);
        clientStream.Flush();
    }

...

Android:
    private void listenResponse()
    {
        Log.i(TAG, "listenRespose() Listening...");
        try
        {
           InputStream is = socket.getInputStream();
           BufferedInputStream bis = new BufferedInputStream(is);
           byte[] buffer = new byte[1024];
           int countBytesRead = bis.read(buffer, 0, 8);
           String response = new String(buffer);
           Log.i(TAG, "listenResponse() Heard: " + response);
        }
        catch (IOException e)
        {
           Log.e(TAG, "listenResponse() IOException", e);
           e.printStackTrace();
        }
        Log.i(TAG, "listenResponse() Done Listening.");
    }

...

WireShark shows:
    Hello Client!

...

Android LogCat shows:
    listenRespose() Listening...
    listenResponse() Heard: Hello Cl??????????????????????????? [... ?s continue for a long time]
    listenResponse() Done Listening.

相反,我会像这样初始化我的字符串:

String response = new String(buffer, 0, countBytesRead);

我至少没有得到所有的问号,但我仍然没有得到我应该得到的完整字符串。我初始化我的byte []错了,还是有不同的方法来做这个更适合纯文本?

1 个答案:

答案 0 :(得分:2)

这里只读了8个字节

int countBytesRead = bis.read(buffer, 0, 8);
//                     max bytes to read ^

相反,请尽快阅读:

int countBytesRead = bis.read(buffer, 0, Buffer.length);

您看到的问题是因为您的缓冲区未初始化。