2015-07-05 15 views
0

我的服务器和客户端在Python中的套接字连接,关于Python的插座模块,你怎么有客户端始终接收数据

客户端:

import socket 
import sys 
from sys import stdin 

serv = 'ip goes here' 
port = 8888 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect((serv, port)) 


def prompt(): 
    sys.stdout.write('<You> ') 
    sys.stdout.flush() 


def send(x): 
    sock.sendall(x) 
    rec = 0 
    ex = len(x) 
    while rec < ex: 
     data = sock.recv(16) 
     rec += len(data) 

while 1: 
    if sock: 
     data = sock.recv(16) 
     if len(data) == 0: 
      pass 
     print '<Server> %s' % data 
     prompt() 
     msg = stdin.readline() 
     sock.sendall(msg) 

我现在有它的方式,如果你在一个客户端上说些什么,它会向两个客户端发送“字母”,但其他客户端在发送新消息之前不会收到该消息,因为它正在等待stdin.readline()发生。我想知道如何做到这一点,所以客户端将始终接收来自服务器的数据,并且无需首先执行stdin.readline()就可以看到它。

感谢

+0

的建议你是新的所以这里有一些建议。首先,pastebin不好。您需要包含您的代码,请参阅MCVE:http://stackoverflow.com/help/mcve。其次,您需要挑出与您的问题相关的代码中的一小部分(再次参见MCVE)。 – CrazyCasta

+0

要回答你如何做到这一点的问题,通常例外的方法是使用线程。在一个线程中,你将拥有'stdin.readline()',而在另一个线程中你将拥有'data = sock.recv(16)'。你将不得不在线程之间进行协调,以决定如何打印出来,因此你不会同时打印两件东西。 – CrazyCasta

+0

啊,对不起。下次我会跟着MCVE。让它像你说的线程一样工作,谢谢。 – user2896775

回答

1

取得的成绩,我想通过使用线程通过CrazyCasta

def receiving(): 
    while 1: 
     if sock: 
      data = sock.recv(16) 
      if len(data) == 0: 
       pass 
      print '<Server> %s' % data 


def sending(): 
    while 1: 
     msg = stdin.readline() 
     sock.sendall(msg) 

t1 = Thread(target=receiving) 
t2 = Thread(target=sending) 

t1.start() 
t2.start()