当前位置: 首页 > 知识库问答 >
问题:

C套接字客户端保持接收来自Java服务器的东西,即使输出流是关闭的

郭胤
2023-03-14

我有一个java服务器和一个c客户端,c客户端有问题。客户的工作方式如下:

  1. 客户端等待服务器发送消息1
  2. 当它这样做时,客户端调用接收文件方法,并从java服务器接收文件(一切正常,文件被正确接收)。
  3. 客户端关闭了文件,然后返回到同时循环,应该等待服务器,所以发送一条新消息。

问题是,在收到文件并返回后,客户端只是在发送“等待服务器指示”的垃圾邮件。以下是代码:

    void getInstructions(SOCKET s)
{
    SOCKET connectSocket = s;
    // Get instructions from server
    while (true)
    {
        cout << "Waiting for server for instructions" << endl;
        int rec;
        char buff[1024];
        //
        if ((rec = recv(connectSocket, buff, sizeof(buff)-1, 0)) == SOCKET_ERROR)
        {
            cout << "Error at socket: " << WSAGetLastError() << endl;
            cin.get();
            continue;
        }

        buff[rec] = 0;

        switch (buff[0])
        {
        case '1':
            receiveFile(connectSocket);
            break;
        default:
            cout << "THIS LINSE IS GETTING SPAMMED TOO" << endl;
            break;
        }

    }
}

奇怪的是,java服务器没有发送任何其他内容,但保持了连接。它似乎不是套接字错误,因为它没有打印“套接字错误”和错误。在Java服务器中,我只关闭outputstream,而不是套接字。

可能出了什么问题?如果您从Java部件请求代码或任何其他信息,只需留下注释,我将直接修复它。

共有1个答案

龚浩宕
2023-03-14

以下是它出错的地方:

在Java服务器中,我只关闭outputstream,而不是套接字。

事实上,你们两个都要关门了。在用于套接字的JavaDoc中。getOutputStream,上面写着:

关闭返回的OutputStream将关闭相关的套接字。

所以,事实上,插座是正确关闭的。实际上,在关闭输出流后,您不再有办法与客户端通信。

我承认我不是C专家,但是我相信在C端发生的事情是,当套接字关闭时,返回的值为零。这里记录了Windows,这里记录了Linux:如果套接字在另一边关闭,返回的recv值为零。

您应该检查您是否收到零,当这种情况发生时,您应该清理C端的所有内容——套接字将不再可用。

如果您的html" target="_blank">设计是让客户机一直等待这个套接字,直到它收到一条新消息,那么一旦您关闭Java端的输出流,这是不可能的。您应该重新设计协议,使Java不会关闭流(例如,如果服务器应该提前向客户端发送文件的字节数,客户端就可以读取准确的字节数,Java不必关闭流来让它知道文件已完成)。

 类似资料:
  • 我正在开发一个非常简单的Java客户机/服务器系统(只是为了让我的脚沾满套接字)。由于某种原因,我一直收到“套接字已关闭”错误。。。这是我的密码。。 服务器文件 客户端文件 我在客户端的第41行得到了错误,然后在第46行得到了NullPointerException。。 提前感谢您的帮助。我只是想在这里学习。

  • 我正在编写一个简单的客户端/服务器套接字程序,其中客户端与服务器连接并通信,然后它们向服务器发送退出消息,然后服务器关闭连接。代码如下所示。 服务器.py client.py 我想要的是万一服务器通过ctrl-c或任何其他方式退出,我希望关闭所有客户端套接字,并将msg发送给客户端,他们也应该在其上关闭套接字。 我在下面除部分之外的部分做了一些工作,但由于某些原因,客户端没有收到服务器发送的消息。

  • 我想用java写一个传输文件套接字程序。但我有问题,如何取消时传输文件。 当我在客户端关闭inputstream时,服务器如何知道它关闭了outputstream。 这是我的代码:客户 ...... 服务器 ...... 但当我关闭inputstream时没有显示任何内容

  • 我正在尝试创建一个非常基本的JavaFTP服务器。 处理传入套接字、接受它并将其转换为客户机线程的代码似乎工作得很好,但由于某些原因,当我尝试发送欢迎消息时,数据似乎没有到达客户机。 我在控制台中看到它正在运行并试图发送欢迎消息,但是FileZilla(我用来连接的FTP客户端)通常位于: === 编辑 欢迎信息非常基本:发送(“220欢迎使用FTP服务器”); 我试图只包含相关的代码,因为在这里

  • 我有一个Python服务器使用unix数据报套接字连接与一个C客户端通信。下面的代码设置一个套接字,然后从客户端发送和接收一条消息。这个脚本在python 2.7中工作,但是,当在python 3中测试它时,对recv()的调用会超时等待来自客户端的消息。然而,客户端确实从服务器接收消息而没有问题。我已经用3.5.2和3.7.1在两台不同的机器上测试过了,结果相同。 更新:我添加了一个ioloop

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