Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多线程Python套接字编程_Python_Multithreading_Sockets_Network Programming - Fatal编程技术网

多线程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.

我正在尝试在python中使用套接字。现在,我正在尝试这样做,如果任何客户端发送任何消息,所有客户端都会收到它。然而,我得到了非常奇怪的结果。我想这是因为我使用了多个线程。每次运行程序时,程序的输出都会发生变化。这是线程问题还是其他问题

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()