TCP客户端无法从服务器读取数据。

3

我在安卓平板电脑上运行了一个TCP客户端,并且在PC上运行了一个C++服务器。

我可以从我的平板电脑向PC发送数据,并且PC可以正常读取,但是当PC尝试向平板电脑发送消息时,平板电脑就收不到任何消息。它会在readLine()调用中阻塞,尝试读取一些东西。

下面是Java方法发送并等待响应的代码:

@Override
protected Void doInBackground(Void... arg0)
{   
    String msg = "";
    Socket socket = null;
    DataOutputStream outToServer = null;
    BufferedReader msgFromServer = null;
    try 
    {
        // Socket used for I/O with the server
        socket = new Socket("192.168.20.100", 48501);

        // Writing to the server
        outToServer = new DataOutputStream( socket.getOutputStream() );

        // Reading from the server
        msgFromServer = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
        DataInputStream iStrReader = new DataInputStream( socket.getInputStream() );

        // Initial comm
        outToServer.writeBytes( "MainCamConnect" );

        msg = msgFromServer.readLine(); // Get stuck here
        Log.d( "NETWORK", msg );

        socket.close();

    } 
    catch( UnknownHostException e ) 
    {
        e.printStackTrace();
    } 
    catch( IOException e ) 
    {
        e.printStackTrace();
    }

    return( null );
}

我从电脑发送的消息是:“StartDelayTest\n”。我知道服务器可以正常发送消息,因为我用一个简单的C++ TCP客户端进行了测试,并且它工作得很好,但是当我在平板电脑上运行时,平板电脑无法接收任何内容。
编辑:
操作系统:Windows 7 64位专业版。
编辑2:
我在电脑上运行了Wireshark并确认数据包已被发送到正确的IP地址,因此问题确实出现在接收端(Android应用程序)上。

Windows 7 64位专业版 - TurnsCoffeeIntoScripts
1
你可能想尝试从socket inputStream中读取原始字节,或者以不等待接收'\n'的方式进行读取,因为你提到的行为听起来像是一个编码问题。 - matt b
我有同样的问题,但在我的情况下,我尝试使用另一台计算机(非Java)并获得了相同的结果,所以我猜测这与局域网有关,而不是Android。然而,当我尝试通过我的WAN IP地址连接到服务器时,一切都正常工作。 - 19greg96
2个回答

0

你正在读取行,但你没有写入它们。writeBytes()只是写入那些字节。行以换行符结束。readLine()会阻塞直到接收到一个。


-1

我建议尝试使用公共的int read(char[] cbuf, int off, int len),这样你的代码会变成:

char[] buffer = new char[256];
int count = read(buffer, 0, 256);

在典型的客户端服务器应用程序中,网络缓冲区的readline并不经常使用。


我尝试了,但结果没有改变。 - TurnsCoffeeIntoScripts
尝试将缓冲区更改为一个字符。看看是否有任何变化。 - Spencer Ruport

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接