java - 套接字在关闭之前不会发送数据

标签 java python sockets

我有一个简单的应用程序,它在java(服务器)和python(客户端)之间创建一个套接字。 python代码的主要功能是从用户处获取数据并将其发送到服务器(java代码)

这是Python代码

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("localhost", 5000))

while True:
    data = input("Enter data to send : ")
    if(data == 'q'):
        break

    client_socket.sendall(data.encode('utf-8'))

client_socket.close()

这是java代码

    String fromclient;

    ServerSocket Server = new ServerSocket (5000);


    while(true) 
    {
        Socket connected = Server.accept();
        BufferedReader inFromClient = new BufferedReader(new InputStreamReader (connected.getInputStream()));
        fromclient = inFromClient.readLine();

        if ( fromclient.equals("q") ){
                connected.close();
                break;
            }else {
              System.out.println(fromclient);
         }
    }

当我编写任何文本并单击 Enter 时,没有任何内容进入 java 代码,也没有任何内容打印到控制台,但是当我从 python 发送“q”时,python 代码关闭,我编写的所有数据现在都打印在 java 控制台中。 我不知道这是什么原因,以及如何解决它。

最佳答案

Java 代码等待换行符,但 Python 部分不发送换行符(input 在其返回的字符串中不提供换行符)。

尝试

client_socket.sendall((data+'\n').encode('utf-8'))

<小时/> 正如 @Kayaman 所建议的,accept 位于错误的位置(也是 BufferedReader)。

Socket connected = Server.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader (connected.getInputStream()));
while(true) 
{
    fromclient = inFromClient.readLine();

会是一个更好的顺序。

此外,Python 客户端不会以当前形式发送“q”。因此,带有 fromclient.equals("q")if 不会关闭套接字,代码将在下一个 readLine() 处终止> 相反。对 Python 部分也重新排序:

data = input("Enter data to send : ")
client_socket.sendall((data+'\n').encode('utf-8'))

if(data == 'q'):
    break

关于java - 套接字在关闭之前不会发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47477492/

相关文章:

python - 在 TestCase.setUp() 中模拟

Silverlight 服务器套接字

python-3.x - 发送OpenCV图像并使用base64解码 : why not compatible?

javascript - Node.js 能否取代 java 作为 Web 应用程序中的服务器端技术

java - 如何在JAVA中使用JAXB正确生成XML

python - Matplotlib 字体与 LaTeX 常用字体

python - CountVectorizer、scikit-learn 中的标记模式

java - 小程序中gif动画闪烁

java - 如何全局获取Android中的鼠标位置

c - 使用可用端口号绑定(bind)套接字