【问题标题】:Simple Python 3 Chat; Sending and receiving at the same time简单的 Python 3 聊天;同时发送和接收
【发布时间】:2017-09-12 12:56:55
【问题描述】:

我是 Python 的初学者,今天我尝试创建一个简单的聊天程序。到目前为止,它并没有太糟糕,但我无法在服务器和客户端之间进行通信。我只能从服务器发送到客户端,但不能从另一个方向发送。我尝试了多线程,结果如下:

服务器:

import socket
import threading

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

host = "127.0.0.1"
port = 4444

s.bind((host, port))
s.listen(3)

conn, addr = s.accept()
print("Connection from: "+str(addr[0])+":"+str(addr[1]))

def recv_data():
    while True:
        data = s.recv(2048).decode('utf-8')
        print(data)

def send_data():
    while True:
        msg = input(str(socket.gethostname())+"> ")
        msg = str(host + "> ").encode('utf-8') + msg.encode('utf-8')
        conn.send(msg)

#t1 = threading.Thread(target=recv_data)
t2 = threading.Thread(target=send_data)
#t1.start()
t2.start()

客户:

import socket
import threading

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

host = "127.0.0.1"
port = 4444

s.connect((host, port))
print("Connected to: "+ host)

def recv_data():
    while True:
        data = s.recv(2048)
        data = data.decode('utf-8')
        print(data)

def send_data():
    while True:
        msg = input(str(host)+"> ").encode('utf-8')
        s.send(msg)

t1 = threading.Thread(target=recv_data)
#t2 = threading.Thread(target=send_data)
t1.start()
#t2.start()

此代码有效;服务器可以发送,客户端可以接收,但是每当我取消注释第二个线程,以便它可以同时执行这两个线程时,我都会收到错误消息:

OSError: [WinError 10057] A request to send or receive data was disallowed because the socket is not connected  and (when sending on a datagram socket using a sendto call) no address was supplied

我似乎找不到解决方案,所以请帮忙,我做错了什么? :D

【问题讨论】:

  • 我不是专家,但是您是否尝试过为两个通信方向使用两个不同的套接字(在不同的端口上)?

标签: python multithreading python-3.x sockets chat


【解决方案1】:
conn, addr = s.accept()

def recv_data():
    while True:
        data = s.recv(2048).decode('utf-8')
        print(data)

conn实际上是你想要sendrecv的socket。发生错误是因为您试图从服务器套接字recv,这是非法操作。因此,如果要使其正常工作,您需要将s 更改为conn

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多