首页 > 解决方案 > 使用多线程进行 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()

在这里,当我运行它时,两个客户端可以相互通信,但并非所有消息都按顺序打印。我想做的是有一次我希望客户要求输入消息,并且如果收到消息,还想同时打印一条消息。但是当我运行这些时,有时会打印消息,有时不会,输出流与预期的不同。

如图所示,客户端首先等待输入,然后打印传入的消息。

那么我怎样才能做点什么,当收到一条消息时,即使我没有提供任何输入,它也会被打印出来?或者还有什么我需要学习的概念,需要在这里实现吗?

标签: pythonmultithreadingnetwork-programmingpython-multithreadingpython-sockets

解决方案


推荐阅读