TCP套接字函数recv()阻止程序

弗兰基

我正在编写一个简单的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()

Android侦听器功能:

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一直读取,直到找到一个换行符。但是您永远不会发送换行符。因此,它永远读下去。


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

例如,您的Python代码假设TCP套接字实际上是字节流时,它们是消息流,因此您username = sock.recv(1024)可能会同时获得用户名和密码,从而导致下一个recv永远被阻塞,或者可能会获得一半的用户名并导致虚假登录失败,或者您可以想象的其他任何事情。(当然,Android代码甚至都不会发送它们中的一个是一个更大的问题,但是我想您已经知道并且还没有编写该代码。)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python TCP套接字recv(1)与recv(n)的效率

来自分类Dev

套接字C ++:recv函数返回-1

来自分类Dev

如何使用Qt阻止tcp套接字?

来自分类Dev

是否可以使套接字仅对recv()函数无阻塞?

来自分类Dev

recv()函数不读取输入(套接字编程)

来自分类Dev

转到ZMQ4-关闭Recv上阻止的套接字吗?

来自分类Dev

TCP套接字-InvalidOperationException

来自分类Dev

Rails TCP套接字

来自分类Dev

套接字TCP连接

来自分类Dev

从应用程序重置TCP套接字连接

来自分类Dev

发送失败后关闭套接字不会导致recv函数返回错误状态

来自分类Dev

为什么套接字中的recv()函数不返回任何内容?

来自分类Dev

TCP阻止套接字-在不同数据包中接收少量字节的可能性

来自分类Dev

TCP阻止套接字-在不同数据包中接收少量字节的可能性

来自分类Dev

Linux套接字:如何使send()等待recv()

来自分类Dev

C套接字编程:recv总是失败

来自分类Dev

C套接字:recv并同时发送

来自分类Dev

同步对TCP套接字的读写

来自分类Dev

Swift中的TCP套接字

来自分类Dev

TCP套接字IO卡住

来自分类Dev

Android TCP套接字错误

来自分类Dev

记录TCP套接字事件

来自分类Dev

TCP / IP套接字广播

来自分类Dev

如何使TCP套接字超时

来自分类Dev

TCP和WEB套接字

来自分类Dev

无法从TCP套接字读取

来自分类Dev

nodejs tcp套接字写

来自分类Dev

TCP打开套接字延迟

来自分类Dev

异步 TCP 套接字问题