当前位置: 首页 > 面试题库 >

Java客户端和C ++服务器通过TCP套接字发送和接收

沈运恒
2023-03-14
问题内容

我有一个C ++服务器和两个客户端(红宝石和Java)。一切都在64位linux机器(java
1.7.0_17)上运行。ruby客户端可以正常工作,但是java版本会出现问题。

在Java中,我尝试将字符串从客户端发送到服务器。实际上,服务器收到了整个字符串,但是服务器认为还有更多东西要接收。

红宝石客户端看起来像这样:

socket = TCPSocket.open(@options[:host],@options[:port])
test = "Hello, World"
socket.puts test
socket.shutdown 1
response = socket.gets

这里的一切工作正常。红宝石客户端发送一个字符串。服务器接收该字符串并发送答复。

Java版本如下所示:

String ip = "127.0.0.1";
int port = 6686;
java.net.Socket socket = new java.net.Socket(ip,port);
OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
InputStreamReader in = new InputStreamReader(socket.getInputStream());

String msg = "Hello, world!";

//send
PrintWriter pw = new PrintWriter(out, true);
pw.print(msg);
pw.flush();
// I also tried: out.write(msg); out.flush(); nothing changed

//receive the reply
BufferedReader br = new BufferedReader(in);
char[] buffer = new char[300];
int count = br.read(buffer, 0, 300);
String reply = new String(buffer, 0, count);
System.out.println(reply);

socket.close();

另一方面,有一台C ++服务器:

string receive(int SocketFD) {
   char buffer[SOCKET_BUFFER_SIZE];
   int recv_count;

   // empty messagestring
   string message = "";

   // empty buffer
   memset(buffer, 0, sizeof(buffer));

   while ((recv_count = recv(SocketFD, buffer, sizeof(buffer) - 1, 0)) > 0) {
      /*if (recv_count == -1) {
         cout << "failed." << endl;
         break;
      }*/
      cout << recv_count << endl;
      if (ECHO_SOCKETS) cout << "received: " << buffer << endl;

      message.append(buffer);
      memset(buffer, 0, sizeof(buffer));

      if (ECHO_SOCKETS) cout << "message is now: " << message << endl;

   }
   return message;
}

Java消息的服务器输出是:

13
received: Hello, world!
message is now: Hello, world!

然后什么也没有发生。问题是:

recv(SocketFD, buffer, sizeof(buffer) - 1, 0)

陷入无限循环(或类似的循环)中。如果我杀死了Java客户端进程,或者输入了类似的内容:

pw.print(msg);
out.close();

服务器端的输出是:

_sending reply: "Request unrecognized/invalid" request="Hello, world!"
send reply success
now close connection

此输出是正确的(“发送答复成功”除外),但是在添加的情况下:

out.close();

客户端无法收到服务器的回复。因为套接字是关闭的。

java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:864)
at MyServer.writeMessage(MyServer.java:56)
at MyServer.test(MyServer.java:42)
at MyServer.main(MyServer.java:30)

我试图调用pw.flush(); 以及不同的定界符,例如“ \ n”,“ \ r”,“ \ r \ n”和“ \ n \
r”,但服务器仍然认为仍然需要读取一些内容。我也尝试使用DatagramSockets:

java.net.DatagramSocket dSocket = new java.net.DatagramSocket();
InetAddress address = InetAddress.getByName("localhost");
String msg = "Hello, world!";
byte[] buf = msg.getBytes();
java.net.DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 6686);

但是服务器无法接受该数据包。

ruby-client做类似socket.shutdownOutput();的事情。(红宝石:socket.shutdown
1)在看跌期权调用之后。我更改了java-client-code:

out.write(msg);
socket.shutdownOutput();

而且有效!

正如@Charly所说:我必须定义一个“协议”。就我而言,我不允许更改任何与通信相关的代码(在服务器和ruby客户端中),因为另一组研究人员使用了此功能。所以我修改这样我的Java客户端,它确实的
确切 同样的事情在 精确的 同时红宝石客户端(如协议的东西)。


问题答案:

仅通过调用println或printf来刷新PrintWriter缓冲区(当true为true时)。调用print可能不会刷新缓冲区(Javadoc)。尝试调用println或直接使用OutputStreamWriter和flush()。请注意使用正确的字符集(可以在OutputStreamWriter构造函数中进行设置)。



 类似资料:
  • 真的需要你帮忙。 我的项目是通过电缆连接两台PC机,并使用tcp套接字将客户端文本框形式的字符串发送到服务器。问题是ATI只能发送一个字符串,然后连接就会关闭。 注意:某个端口上的连接将在表单加载中建立并成功。

  • 问题内容: 我试图用没有gui的服务器连接带有gui的客户端。连接已完成,但我看不到这两个应用程序之间的任何消息。(我应该在客户端中找到SERVER HERE,在服务器中找到CLIENT HERE) 客户端连接代码: (输入和输出在此客户端类扩展到的GUI类中定义。定义为“受保护的BufferedReader输入;受保护的PrintWriter输出;”) 另外,服务器代码: 连接似乎还可以,所以我

  • 我正在尝试连接一个带有gui的客户端和一个没有gui的服务器。连接正在进行中,但我看不到这两个应用程序之间的任何消息。(我应该将服务器放在客户端中,而将客户端放在服务器中) 客户端连接代码: PS:我也在服务器中尝试了PrintWriter,也尝试了try catch in stream语句,问题仍然存在。

  • 我正在使用网络库和浏览器上的WebSocket实现一个套接字节点服务器。我正在成功使用telnet,但浏览器工作不正常。浏览器成功连接到套接字服务器并发送消息。我的服务器实现了一个事件,并立即触发和事件<代码>关闭,事件在断开连接时执行删除客户端(关闭浏览器,连接松动…)。 我不希望浏览器发送消息,然后断开连接。有人知道问题出在哪里吗? 套接字服务器 客户端(浏览器) 浏览器连接到服务器时的输出

  • 我有以下情况, TCP服务器将接受来自客户端的连接 客户端将发送第一个请求,服务器将响应该请求,服务器必须在同一套接字上等待接收来自同一客户端的下一个请求 请参阅我所做的代码,使用此代码,服务器无法接收服务器发送的第二个请求,而客户端也在第二个接收中接收来自服务器的第一个响应。 请对此提出建议,代码中的问题是什么。 我试着模拟这个案例,如果有人以前遇到过,请尽快建议。