让pythontcp服务器在消息发送后发送和接收?

2024-05-16 06:05:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试使用python进行网络编程。为了教会自己如何做到这一点,我一直在玩多个版本的TCP聊天服务器和客户端。我最近的尝试让我想知道我刚刚写的代码有什么问题。只有当一条消息从我刚刚创建的客户机发送出去时,其他消息才会进来。我不知道为什么会这样。我一直在网上搜索,我不知道为什么会这样。我只知道这不是服务器的错误。我确信问题出在我刚创建的客户机上。在

import socket, thread, threading, os

def sendMsg():
    Message = raw_input('[-]You:')
    s.send(Message)

def recvMsg():
    data = s.recv(buff)
    print(data)

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

host = raw_input('[-]Target Ip-> ')
port = 5000
buff = 1024

try:
    s.connect((host, port))

except:
    print('[-]Failed to Connect')
    s.close()

loop = True
threads = []
while loop == True:
    try:
        t1 = threading.Thread(target=sendMsg())
        threads.append(t1)
        t1.start()

        t2 = threading.Thread(target=recvMsg())
        threads.append(t2)
        t2.start()

    except keyboardInterrupt:
        print('\n')
        break


s.close()
os.system('clear')

服务器代码

^{pr2}$

Tags: 代码服务器消息message客户机rawosdef
1条回答
网友
1楼 · 发布于 2024-05-16 06:05:01

我对socket编程还很陌生,所以这可能是一次冒险:

  • 客户机正在从阻塞套接字生成大量读写线程。看起来一次只能执行一个操作,一个线程在写操作时阻塞,或者一个线程在读取时阻塞,因为只有一个套接字,所以所有线程都在该单一资源上运行。您可以让您生成的每个线程打开自己的套接字连接,并从中读取,这应该可以解决这个问题。在
  • 对于客户端,套接字读/写线程安全吗??Yes
  • 在服务器上,accepted连接是否应标记为非阻塞??在

    sockfd, addr = server_socket.accept()

    sockfd.setblocking(0)

  • 在服务器上,您需要管理套接字何时可写吗?看起来套接字是在变得可读时写入的。我可以想象在readcall期间socket.send阻塞,因此在这段时间内不会处理新的连接。Python module of the week有一个非常清晰的例子,可以将select用于非阻塞服务器

相关问题 更多 >