【问题标题】:TCP Client can't read data from server [duplicate]TCP客户端无法从服务器读取数据[重复]
【发布时间】:2012-05-26 04:39:37
【问题描述】:

所以我有一个在 Androidt 平板电脑上运行的 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 );
}

我从 PC 发送的消息是:“StartDelayTest\n”

我知道服务器可以很好地发送消息,因为我用一个简单的 c++ TCP 客户端对其进行了测试,它工作得很好,但是当我在平板电脑上运行它时,平板电脑什么也得不到

编辑:

操作系统:Windows 7 64 位专业版

编辑 2:

我已经在我的电脑上运行了wireshark,我可以确认数据包正在发送到正确的地址IP,所以问题确实出在接收端(android应用程序)

【问题讨论】:

  • Windows 7 64 位专业版
  • 您可能想尝试从套接字 inputStream 读取原始字节,和/或以不等到收到'\n' 的方式读取,因为您提到的行为听起来像编码问题。
  • 我有同样的问题,但在我的情况下,我尝试使用另一台计算机(不是 java),我得到了相同的结果,所以我猜这是 LAN 而不是 android 的问题。但是,当我尝试通过我的 WAN IP 地址连接到服务器时,一切正常。

标签: java android tcp network-programming


【解决方案1】:

你在读行,但不是在写。 writeBytes() 只写入这些字节。行以换行符结束。 readLine() 将阻塞,直到收到一个。

【讨论】:

    【解决方案2】:

    我会尝试使用 public int read(char[] cbuf, int off, int len),这样您的代码将类似于:

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

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

    【讨论】:

    • 我试过了,结果没有改变
    • 尝试将缓冲区更改为一个字符。看看这是否改变了什么。
    猜你喜欢
    • 2021-09-05
    • 2020-01-28
    • 1970-01-01
    • 2020-12-03
    • 2012-09-21
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多