gpt4 book ai didi

python - TCP套接字函数recv()阻塞程序

转载 作者:可可西里 更新时间:2023-11-01 02:40:53 26 4
gpt4 key购买 nike

我正在编写一个简单的 TCP 服务器程序。一切正常,但函数 recv() 却不正常。

import socket
import threading

def connectionHandler(sock):
data="#1111#Welcome on Server!"
sock.sendall(data.encode('ascii'))
username = sock.recv(1024)
password = sock.recv(1024)
print('{}, {}'.format(username, password))
conn.close()
HOST = socket.gethostname()
PORT = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen(10)
while True:
conn, addr = s.accept()
print('Connected by', addr)
t = threading.Thread(target=connectionHandler, args=(conn,))
t.start()
conn.close()

当我评论所有对 recv() 的调用时,程序运行正常,但是当我想从我的客户端(智能手机上的 android 客户端)接收答案时,程序自身阻塞(我认为 recv() 正在等待消息)。我知道我必须设置超时,但这并不能解决我的问题。我想先发送消息,然后再接收一些东西。为什么 recv() 会阻塞 sendall()

安卓监听函数:

public String listener(Socket x) throws IOException{
try {
Log.d("Listener","Started");
String inp;
BufferedReader in = new BufferedReader(new InputStreamReader(x.getInputStream()));
inp = in.readLine();
Log.d("Listener","Ended");
return inp;

} catch (UnknownHostException e1) {
e1.printStackTrace();
return "ERROR";
} catch (IOException e1) {
e1.printStackTrace();
return "ERROR";
}
}`

最佳答案

在 Python 服务器上,您发送:

data="#1111#Welcome on Server!"
sock.sendall(data.encode('ascii'))

在 Java 客户端上,您可以这样阅读:

inp = in.readLine(); 

readLine 会一直读取,直到找到换行符。但是您永远不会发送换行符。所以它会一直读下去。


您还有其他问题需要在这里解决。

例如,当 they're actually byte streams 时,您的 Python 代码假定 TCP 套接字是消息流,所以你的 username = sock.recv(1024) 可能会同时获得用户名和密码,导致下一个 recv 永远阻塞,或者它可能获得一半的用户名并导致一个虚假的登录失败,或者任何你能想到的。 (当然,Android 代码甚至不发送它们中的任何一个是一个更大的问题,但我假设您知道这一点,只是还没有编写该代码。)

这个问题实际上指出了解决这个问题的一种方法:如果您的消息都不允许包含换行符,您可以只使用换行符作为消息的终止符。您已经在 J​​ava 端这样做了;你只需要记得在发送时添加一个 \n 。在 Python 方面,套接字上的 makefile 方法为您提供了一个类似文件的对象,与您在 Java 中所做的非常相似,它有一个 readline 方法,所以你可以在另一个方向做同样的事情。

关于python - TCP套接字函数recv()阻塞程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30080481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com