多线程Python套接字编程
我正在尝试在python中使用套接字。现在,我正在尝试这样做,如果任何客户端发送任何消息,所有客户端都会收到它。然而,我得到了非常奇怪的结果。我想这是因为我使用了多个线程。每次运行程序时,程序的输出都会发生变化。这是线程问题还是其他问题多线程Python套接字编程,python,multithreading,sockets,network-programming,Python,Multithreading,Sockets,Network Programming,我正在尝试在python中使用套接字。现在,我正在尝试这样做,如果任何客户端发送任何消息,所有客户端都会收到它。然而,我得到了非常奇怪的结果。我想这是因为我使用了多个线程。每次运行程序时,程序的输出都会发生变化。这是线程问题还是其他问题 import socket import sys from thread import * from server import Server from client import Client s = Server() start_new_thread(s.
import socket
import sys
from thread import *
from server import Server
from client import Client
s = Server()
start_new_thread(s.acceptConnection,())
m = Client("m")
k = Client("k")
start_new_thread(m.recieveData,())
start_new_thread(k.recieveData,())
k.sendData("Hey!")
print "*"*100
print repr(k.data()), repr(m.data())
print "*"*100
m.sendData("okay okay")
print "*"*100
print repr(k.data()), repr(m.data())
print "*"*100
m.client.close()
k.client.close()
s.s.close()
服务器类:
import socket
import sys
from thread import *
class Server(object):
def __init__(self,port = 5555):
self.host = 'localhost' # '' means connect to all hosts
self.port = port
self.text = ""
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
self.s.bind((self.host, self.port))
except socket.error as e:
print(str(e))
self.s.listen(2)
print "Waiting for a connection.\n"
self.connections = []
def threaded_client(self,conn):
# conn.send("Connected to server\n")
while True:
try:
data = conn.recv(2048)
except:
data = ""
if(not data):
break
# conn.sendall(reply)
for c,a in self.connections:
try:
c.sendall(data + "\n")
except:
print "connection lost\n"
self.connections.remove((c,a))
conn.close()
def acceptConnection(self):
while True:
conn, addr = self.s.accept()
self.connections += [(conn,addr)]
start_new_thread(self.threaded_client,(conn,))
客户端类:
import socket
import sys
from thread import *
class Client(object):
def __init__(self,name):
self.host = 'localhost'
self.port = 5555
self.name = name
self.client= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client.connect((self.host,self.port))
self.text = ""
def sendData(self,data):
self.client.send(data)
def recieveData(self):
while True:
try:
data = self.client.recv(2048)
except:
break
if data:
self.text = data
self.client.close()
def data(self):
return self.text
def closeClient(self):
self.client.close()
无论如何,你没有关于数据的保证,当你试图打印数据时,数据已经返回给客户了。您应该引入一些条件,并使用wait和notifyAll来确保数据到达。。。。要检查我的猜测是否正确,请在测试中加入睡眠:
import time
k.sendData("Hey!")
print "*"*100
time.sleep(200)
print repr(k.data()), repr(m.data())
print "*"*100
m.sendData("okay okay")
print "*"*100
time.sleep(200)
print repr(k.data()), repr(m.data())
print "*"*100
如果有效,您应该使用条件并通知进行测试
此外,您必须通过锁来保护数据访问
其中,客户机的属性l由
你说输出改变是什么意思?每次我运行程序时的输出与上次不同的方式是什么?不同的顺序,损坏了吗?区别在于主程序中打印语句的输出,我在主程序中打印存储在客户机中的数据。有时,它们都是空字符串。有时他们中的一些人是嘿\n或有时有些是正常的\n。理想情况下,输出应该是两个“嘿!”然后是两个OK,因为这是我将数据发送到服务器的顺序。睡眠的想法很有效!如果我在发送数据后睡眠一秒钟,我就会得到所需的结果。谢谢关于这一点,我还有一个问题-在我的服务器和客户端类中,我是否正确关闭了服务器和客户端套接字?@meh123 close很好,但add shutdown更好。我必须睡觉了:
def recieveData(self):
while True:
try:
data = self.client.recv(2048)
except:
break
if data:
self.l.acquire()
self.text = data
self.l.release()
self.client.close()
def data(self):
self.l.acquire()
ret = self.text
self.l.release()
return ret
self.l=threading.Lock()