Socket[C+;+;\Java]服务器套接字仅在客户端关闭时接收字符串

Socket[C+;+;\Java]服务器套接字仅在客户端关闭时接收字符串,java,c++,swing,sockets,serversocket,Java,C++,Swing,Sockets,Serversocket,我在C++中有一个应用程序将在Linux上运行。我用Java创建了一个日志GUI(选择Java是因为我已经使用过这种语言和JavaSwing)。简而言之,GUI创建了一个ServerSocket,我的应用程序使用日志服务作为客户端,并通过网络将日志发送到服务器 我的问题是,正如标题所说,当我关闭客户端(从Eclipse停止它)时,所有数据都会被接收 以下是我的代码: 服务器端[Java] ServerSocket serverSocket = new ServerSocket(3000); Sy

我在
C++
中有一个应用程序将在Linux上运行。我用
Java
创建了一个日志GUI(选择Java是因为我已经使用过这种语言和JavaSwing)。简而言之,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 (...)
    {

    }
}
while(true)
{
std::unique_lock lock{{u mutex};
_我空了。等等(锁,
[&]{return!_logs.empty();});
尝试
{
std::string logToSend=_logs.front();
char*messageToSendAsChar=新字符[logToSend.length()+1];
strcpy(messageToSendAsChar,logToSend.c_str());
if(write(_fileDescriptor,messageToSendAsChar,logToSend.length()+1)>0)
{
_logs.pop();
logToSend.clear();
}
删除[]messageToSendAsChar;
}
捕获(标准::异常&e)
{
}
捕获(…)
{
}
}

任何帮助都将不胜感激。谢谢大家!

> P>我猜你从C++应用程序发送的字符数组不包含< /P> 换行符(
'\n'
)、回车符(
'\r'
)或回车符 紧接着是换行符

-

然后,通过关闭C++客户端(从而关闭套接字),
readLine
方法可能会返回


(抱歉,我现在不允许直接向问题发表评论)

< P>我猜你从C++应用程序发送的字符数组不包含< /P> 换行符(
'\n'
)、回车符(
'\r'
)或回车符 紧接着是换行符

-

然后,通过关闭C++客户端(从而关闭套接字),
readLine
方法可能会返回


(很抱歉将此作为答案发布,但直到现在我还不允许直接对问题发表评论)

仍在解析问题的其余部分,但如果您是为C++11或更高版本构建的,您应该能够
编写(_fileDescriptor,logToSend.C_str(),logToSend.length()+1)
,并节省大量工作。终止null是有保证的。@user2896152,您是否检查了Eclipse在运行GUI时没有锁定您正在读取的日志文件?@MohammadKanan谢谢。GUI通过控制台使用命令sudo java-jar logApp.jar启动。这是通过Eclipse启动的C++应用程序。还有一个问题。
write()
函数不能保证在一次调用中写入(在本例中,发送)所有提供的数据:必须引入适当的循环。仍在解析问题的其余部分,但如果您是为C++11或更高版本构建的,您应该能够
写入(_fileDescriptor,logToSend.C_str(),logToSend.length()+1)
,节省大量工作。终止null是有保证的。@user2896152,您是否检查了Eclipse在运行GUI时没有锁定您正在读取的日志文件?@MohammadKanan谢谢。GUI通过控制台使用命令sudo java-jar logApp.jar启动。这是通过Eclipse启动的C++应用程序。还有一个问题。
write()
函数不能保证在一次调用中写入(在本例中,发送)所有提供的数据:必须引入适当的循环。完全同意你的观点。我不知道你为什么要道歉。这是一个正确的答案。完全同意你的看法。我不知道你为什么要道歉。这是一个正确的答案。