C ++套接字服务器从Java客户端接收消息,但不是

时间:2014-03-22 12:35:35

标签: c# java android c++ sockets

我刚开始学习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客户端,直到我关闭服务器进程或套接字。 < / p>

C ++ serverside:

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();
}

我坚持这个问题好几周了,谢谢。

2 个答案:

答案 0 :(得分:1)

你有input.readLine(),除非检测到换行符,否则不会返回。如果您的服务器发送通过换行符终止的消息,那么您的Java客户端应该选择它。

以下是代码打印从服务器接收的内容。使用BufferedInputStream而不是BufferedReader。 Haven未对以下代码进行测试,但每次最多可从服务器读取10个字节。因为它是缓冲的,我不确定&#34;实时&#34;它是。例如,服务器发送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);
}

答案 1 :(得分:0)

我遇到了同样的问题一个月,甚至重做整个项目不同仍然没有帮助我,问题是如此简单。 in.readline()函数期望行结束继续,因此您应该将它附加到缓冲区。

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

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