Python:套接字未读取字节输入

丹尼

我正在用python做一个本地主机套接字项目,我目前只有线程实现,因此多个客户端可以连接到同一服务器。我从客户端收到一条特定消息,要求断开与服务器的连接,即DISSCONECT_MESSAGE = b'0'当服务器识别出字节零时,它应关闭服务器与发送该字节的客户端之间的连接。我通过使用if语句捕获零字节来处理此问题。

客户端的send函数总是对消息进行编码,以将其发送到服务器,因此,如果用户输入是0通过编码传递的,现在我有了b'0',当服务器接收到此消息后,它又将其解码0,这就是为什么在if语句中我进行编码再次知道消息是否为0

if msg.encode() == DISSCONECT_MESSAGE:
connected = False

handle_client通过在conn.close ()函数之前添加打印来进行测试但是它从不显示该打印,因此它永远不会退出while循环,因此永远不会关闭与客户端的连接。

这是我的代码:

server.py

import socket
import threading

HEADER = 64
PORT = 65500
SERVER = ''
ADDRESS = (SERVER,PORT)
FORMAT = 'utf-8'
DISSCONECT_MESSAGE = b'0'

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDRESS)

def handle_client(conn, addr):
    print(f"[NEW CONNECTION] {addr} connected")

    connected = True

    while connected:
        msg_length = conn.recv(HEADER).decode(FORMAT)
        if msg_length:
            msg_length = int(msg_length)
            msg = conn.recv(msg_length).decode(FORMAT)
            if msg.encode() == DISSCONECT_MESSAGE:
                connected = False

            if msg[:2] == "10":
                conn.send("[CODE 10] Log in request".encode(FORMAT))

            print(f"[{addr}] {msg}")
            conn.send("Message recived".encode(FORMAT))

    
    print(f"[{addr}] DISSCONNECTED")
    conn.close()



def start():
    server.listen()
    print(f"[LISTENING] Server is listening on {SERVER}")
    while True:
        conn, addr = server.accept() # Wait to a new connection
        thread = threading.Thread(target=handle_client, args=(conn, addr))
        thread.start()
        print(f"[ACTIVE CONNECTIONS] {threading.activeCount()-1}")


print("[STARTING] Server is starting...")
start()

client.py

import socket

HEADER = 64
PORT = 65500
FORMAT = 'utf-8'
DISSCONECT_MESSAGE = b'0'
SERVER = 'localhost'
ADDRESS = (SERVER,PORT)

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect(('localhost', 65500))

def send(msg):
    message = msg.encode(FORMAT)
    msg_length = len(message)
    send_length = str(msg_length).encode(FORMAT)
    send_length += b' ' * (HEADER - len(send_length))
    client.send(send_length)
    client.send(message)
    print(client.recv(1024).decode(FORMAT))

while True:
    msg = input()
    if msg.encode() == DISSCONECT_MESSAGE:
        print("[DISSCONECTED FROM SERVER]")
        client.send(DISSCONECT_MESSAGE)
    else:
        send(msg)

谁能告诉我我在做什么错?

马克·托洛宁

首先,检查返回值sendrecv无法保证所有字节均已发送(try sendall)并recv返回0(套接字关闭)或请求的1个长度的字节,不一定是请求的总数。

就您的主要错误而言,您已将字符零('0')发送给服务器,并且服务器收到的字符长度为:

msg_length = conn.recv(HEADER).decode(FORMAT)

结果是长度为0。msg然后成为一个空字符串,其中:

msg = conn.recv(msg_length).decode(FORMAT)

msg.encode() == b''(空字符串),而不是b'0'长度为1的字符串,其中包含零个字符。

取而代之的是,您可以在长度为0时放弃。或者断开连接的正常方法是关闭连接。然后,服务器接收到b''(长度为零recv)指示关闭的连接。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Python中从套接字读取原始字节?

来自分类Dev

如何从Python中的套接字读取字节数组

来自分类Dev

如何从Python中的套接字读取字节数组

来自分类Dev

在Python中从字符串读取字节

来自分类Dev

从Java套接字读取比Python慢

来自分类Dev

java.io.IOException:流关闭或底层输入流返回零字节,同时从request.getInputStream()中读取字符

来自分类Dev

我应该向套接字读取/写入多少字节?

来自分类Dev

套接字InputStream出现故障,同时读取块中的字节

来自分类Dev

从套接字通道读取字符串

来自分类Dev

将输入从C套接字客户端读取到Java套接字服务器

来自分类Dev

如何使用线程JAVA从套接字读取输入

来自分类Dev

boost :: asio从套接字读取n个字节到streambuf

来自分类Dev

在Dart中向套接字数据写入字节/从套接字数据读取字节数

来自分类Dev

PHP:如何从套接字读取N个字节?

来自分类Dev

Python通过套接字写入字节

来自分类Dev

从Servlet请求输入流读取时套接字超时

来自分类Dev

Java套接字从C#读取字节

来自分类Dev

当套接字在Java中读取输入时,while循环失败

来自分类Dev

在Python中从字符串读取字节

来自分类Dev

Matlab从Python套接字读取

来自分类Dev

java.io.IOException:流关闭或底层输入流返回零字节,同时从request.getInputStream()中读取字符

来自分类Dev

将输入从C套接字客户端读取到Java套接字服务器

来自分类Dev

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

来自分类Dev

套接字未从服务器读取所有字节

来自分类Dev

UDP-无法在python中从套接字读取字节吗?

来自分类Dev

读取套接字的输入流

来自分类Dev

从客户端套接字读取数据似乎缺少字节(从 java 到 python)

来自分类Dev

使用套接字 Python 从网站读取文本

来自分类Dev

套接字未连接 Python

Related 相关文章

  1. 1

    如何在Python中从套接字读取原始字节?

  2. 2

    如何从Python中的套接字读取字节数组

  3. 3

    如何从Python中的套接字读取字节数组

  4. 4

    在Python中从字符串读取字节

  5. 5

    从Java套接字读取比Python慢

  6. 6

    java.io.IOException:流关闭或底层输入流返回零字节,同时从request.getInputStream()中读取字符

  7. 7

    我应该向套接字读取/写入多少字节?

  8. 8

    套接字InputStream出现故障,同时读取块中的字节

  9. 9

    从套接字通道读取字符串

  10. 10

    将输入从C套接字客户端读取到Java套接字服务器

  11. 11

    如何使用线程JAVA从套接字读取输入

  12. 12

    boost :: asio从套接字读取n个字节到streambuf

  13. 13

    在Dart中向套接字数据写入字节/从套接字数据读取字节数

  14. 14

    PHP:如何从套接字读取N个字节?

  15. 15

    Python通过套接字写入字节

  16. 16

    从Servlet请求输入流读取时套接字超时

  17. 17

    Java套接字从C#读取字节

  18. 18

    当套接字在Java中读取输入时,while循环失败

  19. 19

    在Python中从字符串读取字节

  20. 20

    Matlab从Python套接字读取

  21. 21

    java.io.IOException:流关闭或底层输入流返回零字节,同时从request.getInputStream()中读取字符

  22. 22

    将输入从C套接字客户端读取到Java套接字服务器

  23. 23

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

  24. 24

    套接字未从服务器读取所有字节

  25. 25

    UDP-无法在python中从套接字读取字节吗?

  26. 26

    读取套接字的输入流

  27. 27

    从客户端套接字读取数据似乎缺少字节(从 java 到 python)

  28. 28

    使用套接字 Python 从网站读取文本

  29. 29

    套接字未连接 Python

热门标签

归档