【问题标题】:C++ socket server receive msg from Java client, but not otherwiseC++ 套接字服务器从 Java 客户端接收消息,但不是其他的
【发布时间】:2014-03-22 12:35:34
【问题描述】:

我刚刚开始学习 C++ 和 Java。对于我的第一个项目,我制作了一个 C++ TCP 套接字服务器。不幸的是,它没有按我的预期工作。

它是如何工作的:

如果我启动 Java Android 客户端,我的 C++ 服务器会立即检测到新连接。

protected void onCreate(Bundle savedInstanceState)   {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.intrologin_layout);
    client = new TCPClient("10.0.2.2", 50120);

    try {
        new Thread() {
            public void run() {
                try {
                    client.startClient();
                }
                catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

发送字节也可以通过 Java Android 客户端工作:

output = new DataOutputStream(connectionSocket.getOutputStream());
output.write(Packet);
output.flush();

我的 C++ 服务器在控制台返回自动接收的数据包,效果很好, 但后来我尝试发回回复,recv 在我的 C++ 客户端上工作,但这是主要问题,它不在我的 Java 客户端上直到我关闭服务器进程或套接字。

C++ 服务器端:

pd->SendPacket("BYE\0", 4);

...

void Desc::SendPacket(const char* c_cpBuffer, int Length)
{
  int BytesSended = send(m_Socket, c_cpBuffer, Length, 0);

  if (BytesSended <= 0)
  {
    printf("Packet send failed with error: %d\n", WSAGetLastError());
  }
}

Java Android 客户端:

public void startClient() throws Exception
{
    connectionSocket = new Socket(ip, port);
    input = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
    output = new DataOutputStream(connectionSocket.getOutputStream());

    messageReceiver = new Thread() {
        public void run()
        {
            while(connectionSocket.isConnected()) {
                try {
                    String receivedMessage = input.readLine();
                    input.toString();

                    if(receivedMessage != null) {
                        Log.e("ERROR", "ERROR");
                        Log.d("Received Message: ", receivedMessage);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    messageReceiver.start();
}

几周以来我一直在这个问题上,谢谢。

【问题讨论】:

  • 也许我解释得不够清楚,Java Android 客户端,只有在我杀死 C++ 服务器进程或关闭套接字时才会收到消息。
  • input.toString();实际代码中不存在。
  • @mah 刚试了一下,没用。虽然如果我终止进程,它会收到它。 :(
  • @mah 非常感谢,这是真正的方向。最后,匿名用户的回答是正确的: pd->SendPacket("BYE\n", 4);像魅力一样工作。
  • 很高兴你解决了这个问题。我会删除我以前的 cmets,因为他们真的没有提供任何帮助。

标签: c# java android c++ sockets


【解决方案1】:

你有 input.readLine() 并且除非检测到换行,否则它不会返回。如果您的服务器发送由换行符终止的消息,您的 java 客户端应该接收它。

以下是打印从服务器接收到的内容的代码。使用 BufferedInputStream 而不是 BufferedReader。还没有测试过下面的代码,但它每次都会从服务器读取多达 10 个字节。因为它是缓冲的,所以我不确定它有多“实时”。例如,服务器发送 3 个字符然后休眠 5 秒并发送 7 个字符。客户端是立即接收 3 个字符并在 5 秒后打印 7 个字符,还是客户端将等待并在 5 秒后接收 10 个字符并一次打印所有 10 个字符,您需要对此进行测试。

BufferedInputStream input = new BufferedInputSream(socket.getInputStream());
byte[] buffer = new byte[10]; // 10 bytes buffer
int bytesRead = 0;
while( (bytesRead=input.read(buffer)) !=-1 ) { // read up to 10 bytes
    String str = new String(buffer,0,bytesRead); // convert bytes to String using default encoding
    System.out.println("Data received: " + str);
}

【讨论】:

  • input.toString();实际代码中不存在。我错误地添加了它,但它在这里不相关。顺便问一下,什么是换行?
  • 换行是字符“\n”。
  • 刚知道是什么,我去试试谢谢。
  • 哇,非常感谢你,伙计。有用!如此简单,难以置信。
  • 我还有一个问题,有没有什么方法可以不用换行,或者另一种功能?
【解决方案2】:

我在 Month 中遇到了同样的问题,即使以不同的方式重做整个项目仍然没有帮助我,而且问题很简单。 in.readline() 函数期望行尾继续,所以你应该将它附加到你的缓冲区。

 pd->SendPacket("BYE\0\n", 4);

希望它有所帮助,就像它帮助了我一样。

【讨论】:

    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多