首页 > 解决方案 > 使用套接字编程在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)

数字代表执行顺序。

标签: pythonmultithreadingsockets

解决方案


您的程序的线程逻辑存在问题。您应该将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()

您需要以不同的方式处理关闭套接字,并且由于程序的多线程性质,在第一条消息之后输入/接收的打印不同步,但输入仍在等待。


推荐阅读