python - 使用多线程进行 Python Socket 编程
问题描述
所以,我今天学习了套接字编程和多线程的概念,并很快有了一个想法,通过创建一个 Messenger 类型的应用程序来实现它,两个连接的客户端可以在其中互相聊天。
服务器.py:
import socket
c = None #Client socket1
addr = None #Client address1
c2 = None #Client socket2
addr2 = None #Client address2
server_socket1 = socket.socket() #by default it is SOCK_STREAM (TCP) and has porotocal AF_INET (IPv4)
server_socket1.bind(('192.168.217.1',9999)) #server machine's ip and port on which it will send and recieve connections from
server_socket1.listen(2) #We will only accept two connections as of now , one for each client
print("Server started successfully!!!")
print("Waiting for connections...\n\n")
while (((c is None)and(addr is None)) and ((c2 is None) and (addr2 is None))):
if((c is None) and (addr is None)):
c,addr = server_socket1.accept()
print("User connected to client1 socket!!")
c.send(bytes("Connected to the apps server!!!","utf-8"))
name = c.recv(1024).decode()
print("Client connected with name "+name+ " ip address "+str(addr))
c.send(bytes("******Welcome to Messenger Lite "+name+" ******","utf-8"))
if((c2 is None) and (addr2 is None)):
c2,addr2 = server_socket1.accept()
print("\n\nUser connected to client2 socket!!")
c2.send(bytes("\n\nConnected to the apps server!!!","utf-8"))
name2 = c2.recv(1024).decode()
print("Client connected with name "+name2+ " ip address "+str(addr2))
c.send(bytes("******Welcome to Messenger Lite "+name2+" ******","utf-8"))
while True:
msg = c.recv(4096)
if(msg!=None):
msg = msg.decode()
c2.send(bytes(msg,"utf-8"))
msg2 = c2.recv(4096)
if(msg2!=None):
msg2 = msg2.decode()
c.send(bytes(msg2,"utf-8"))
客户端.py:
import socket
from threading import *
class recv_msg(Thread):
def run(self):
while True:
msg = client_socket.recv(4096)
if(msg!=None):
msg= client_socket.recv(4096).decode()
print("\n"+msg)
class send_msg(Thread):
def run(self):
while True:
message = input("You : ")
client_socket.send(bytes(name+" : "+message,"utf-8"))
client_socket = socket.socket() #by default it is SOCK_STREAM (TCP) and has porotocal AF_INET (IPv4)
client_socket.connect(('192.168.217.1',9999)) #server machine's ip and port on which it will send and recieve connections from
name = input ("Enter your name : ")
client_socket.send(bytes(name,"utf-8"))
print(client_socket.recv(1024).decode())
print(client_socket.recv(1024).decode())
t1 = recv_msg()
t2 = send_msg()
t1.start()
t2.start()
t2.join()
在这里,当我运行它时,两个客户端可以相互通信,但并非所有消息都按顺序打印。我想做的是有一次我希望客户要求输入消息,并且如果收到消息,还想同时打印一条消息。但是当我运行这些时,有时会打印消息,有时不会,输出流与预期的不同。
那么我怎样才能做点什么,当收到一条消息时,即使我没有提供任何输入,它也会被打印出来?或者还有什么我需要学习的概念,需要在这里实现吗?