python - 使用套接字编程在python中创建消息系统
问题描述
我是套接字编程的新手。我想在服务器和客户端(聊天)之间创建一个简单的消息传递系统。我在下面包含了我的代码。我希望它能够像聊天系统一样工作,但它不起作用。如果消息被发送,它应该接收并打印出来,但只有在给出输入之后才会打印接收到的字符串。我期望它应该并行运行(接收消息并发送消息)。
服务器 :
import socket
import time
import threading
def get(s):
tm = s.recv(1024)
print("\nReceived: ",tm.decode('ascii'))
def set_(s):
i=input("\nEnter : ")
s.send(i.encode('ascii'))
serversocket = socket.socket()
host = socket.gethostname()
port = 9981
serversocket.bind((host,port))
serversocket.listen(1)
clientsocket,addr = serversocket.accept()
while(1):
t1=threading.Thread( target = get , args = (clientsocket,) )
t1.start()
t2=threading.Thread( target = set_ , args = (clientsocket,) )
t2.start()
time.sleep(10)
clientsocket.close()
客户:
import socket
import threading
import time
def get(s):
tm = s.recv(1024)
print("\nReceived: ",tm.decode('ascii'))
def set_(s):
i=input("\nEnter : ")
s.send(i.encode('ascii'))
s = socket.socket()
host = socket.gethostname()
port = 9981
s.connect((host,port))
while(1):
t1=threading.Thread( target = get , args = (s,) )
t2=threading.Thread( target = set_ , args = (s,) )
t1.start()
t2.start()
time.sleep(10)
s.close()
输出(在客户端):
Enter: hello ------------------------------>(1)
Received: hello --------------------------->(3)
输出(在服务器):
Enter: hello ------------------------------>(2)
Received : hello ------------------------->(4)
预期输出:
输出(在客户端):
Enter: hello ------------------------------>(1)
Received: hello --------------------------->(4)
输出(在服务器):
Received : hello ------------------------->(2)
Enter: hello ------------------------------>(3)
数字代表执行顺序。
解决方案
您的程序的线程逻辑存在问题。您应该将while(True)
循环移动到线程工作者,并且只启动一次线程。就目前而言,您的代码每 10 秒只能发送/接收一条消息。
服务器:
import socket
import threading
def get(s):
while True:
tm = s.recv(1024)
print("\nReceived: ",tm.decode('ascii'))
def set_(s):
while True:
i=input("\nEnter : ")
s.send(i.encode('ascii'))
serversocket = socket.socket()
host = socket.gethostname()
port = 9981
serversocket.bind((host,port))
serversocket.listen(1)
clientsocket,addr = serversocket.accept()
t1=threading.Thread( target = get , args = (clientsocket,) )
t1.start()
t2=threading.Thread( target = set_ , args = (clientsocket,) )
t2.start()
客户:
import socket
import threading
def get(s):
while True:
tm = s.recv(1024)
print("\nReceived: ",tm.decode('ascii'))
def set_(s):
while True:
i=input("\nEnter : ")
s.send(i.encode('ascii'))
s = socket.socket()
host = socket.gethostname()
port = 9981
s.connect((host,port))
t1=threading.Thread( target = get , args = (s,) )
t2=threading.Thread( target = set_ , args = (s,) )
t1.start()
t2.start()
您需要以不同的方式处理关闭套接字,并且由于程序的多线程性质,在第一条消息之后输入/接收的打印不同步,但输入仍在等待。
推荐阅读
- asp.net-web-api - WebApi C#中上传函数的JSON输入
- modeling - 现在创建新的代数建模语言 (AML) 的主要好处和动机是什么?
- angular - 检索新 JWT 令牌的 Angular HttpInterceptor 请求导致无限循环
- javascript - join("") 在只有一个元素的字符串数组上调用。目的?
- python - 程序翻转数字的数字并始终打印出 3 位数字的答案
- java - android.support.v4.app.fragment 和 androidx.fragment.app.FragmentActivity 有什么区别
- java - 如何将 WebSocketMessageBrokerConfigurer 从应用程序的其余部分提取到单独的包中
- delphi - EReadError - 当我尝试创建 Delphi 单元时属性值无效
- sql - Oracle SQL 行成列
- asp.net-mvc - 我的实体框架更新是插入一个新行而不是更新我想要它的那一行