Socket [C++\Java] ServerSocket只有在客户端关闭时才会收到一个字符串
Socket [C++\Java] The ServerSocket receives a string only when the client closes
我在 C++
中有一个应用程序将在 Linux 上 运行。我用 Java
创建了一个日志 GUI(选择 Java 因为我已经使用过这种语言和 Java swing)。简而言之,GUI创建了一个ServerSocket
,我的应用程序使用日志服务作为客户端,通过网络将日志发送到服务器。
我的问题是,正如标题所说,当我关闭客户端(从 Eclipse 停止它)时,所有数据都被接收到。
这些是我的代码片段:
服务器端[Java]
ServerSocket serverSocket = new ServerSocket(3000);
System.out.println("ServerSocket created");
Socket socket = serverSocket.accept();
System.out.println("Connection received");
if (socket != null)
{
java.io.InputStream is = socket.getInputStream();
java.io.InputStreamReader isr = new java.io.InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String a;
do
{
a = br.readLine();
System.out.println(a + " received");
}
while (a != null);
}
客户端 [C++]
while(true)
{
std::unique_lock<std::mutex> lock {_mutex};
_isLogEmpty.wait(lock,
[&]{return !_logs.empty();});
try
{
std::string logToSend = _logs.front();
char* messageToSendAsChar = new char[logToSend.length()+1];
strcpy(messageToSendAsChar, logToSend.c_str());
if (write(_fileDescriptor, messageToSendAsChar, logToSend.length()+1) > 0)
{
_logs.pop();
logToSend.clear();
}
delete[] messageToSendAsChar;
}
catch (std::exception &e)
{
}
catch (...)
{
}
}
如有任何帮助,我们将不胜感激。谢谢!
我猜测您从 C++ 应用程序发送的字符数组不包含
a line feed ('\n'
), a carriage return ('\r'
), or a carriage return
followed immediately by a linefeed.
然后通过关闭 C++ 客户端(从而关闭套接字),readLine
方法可能 return.
(很抱歉 post 将此作为答案,但直到现在我还不能 post 直接对问题发表评论)
我在 C++
中有一个应用程序将在 Linux 上 运行。我用 Java
创建了一个日志 GUI(选择 Java 因为我已经使用过这种语言和 Java swing)。简而言之,GUI创建了一个ServerSocket
,我的应用程序使用日志服务作为客户端,通过网络将日志发送到服务器。
我的问题是,正如标题所说,当我关闭客户端(从 Eclipse 停止它)时,所有数据都被接收到。
这些是我的代码片段:
服务器端[Java]
ServerSocket serverSocket = new ServerSocket(3000);
System.out.println("ServerSocket created");
Socket socket = serverSocket.accept();
System.out.println("Connection received");
if (socket != null)
{
java.io.InputStream is = socket.getInputStream();
java.io.InputStreamReader isr = new java.io.InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String a;
do
{
a = br.readLine();
System.out.println(a + " received");
}
while (a != null);
}
客户端 [C++]
while(true)
{
std::unique_lock<std::mutex> lock {_mutex};
_isLogEmpty.wait(lock,
[&]{return !_logs.empty();});
try
{
std::string logToSend = _logs.front();
char* messageToSendAsChar = new char[logToSend.length()+1];
strcpy(messageToSendAsChar, logToSend.c_str());
if (write(_fileDescriptor, messageToSendAsChar, logToSend.length()+1) > 0)
{
_logs.pop();
logToSend.clear();
}
delete[] messageToSendAsChar;
}
catch (std::exception &e)
{
}
catch (...)
{
}
}
如有任何帮助,我们将不胜感激。谢谢!
我猜测您从 C++ 应用程序发送的字符数组不包含
a line feed (
'\n'
), a carriage return ('\r'
), or a carriage return followed immediately by a linefeed.
然后通过关闭 C++ 客户端(从而关闭套接字),readLine
方法可能 return.
(很抱歉 post 将此作为答案,但直到现在我还不能 post 直接对问题发表评论)