2014-11-06 41 views
0

我有一个类需要我开发一个连接到服务器的客户端套接字脚本(在Python 2.x中),接收到一个字符串并发回res变量的这个练习。教授直上告诉我们,来查找有关类似的脚本和相关搜索后互联网我想出了非常完美的锻炼; Tibial基地脚本:Python:客户端脚本中有多个套接字?

from socket import * 
import string, sys, select 

HOST = '...' 
PORT = 5555 

s = socket(AF_INET,SOCK_STREAM) 
s.connect((HOST,PORT)) 

while 1: 

socket_list = [sys.stdin, s] 
read_sockets, write_sockets, error_sockets = select.select(socket_list , [], []) 
for sock in read_sockets: 
     if sock == s: 
      data = sock.recv(4096) 
      if not data : sys.exit() 
      else: 
       dec = map(ord,data) 
       res = max(dec) + min(dec) 
       print data+'\n(^min_max value in ascii: '+str(res)+')' 
     else : 
      msg = sys.stdin.readline() 
      s.send(msg) 

但是,因为我真的很新Python和脚本是从网络上随机页面为主,我不能完全理解如下:

socket_list = [sys.stdin, s] 
read_sockets, write_sockets, error_sockets = select.select(socket_list , [], []) 

for sock in read_sockets: 

什么是在这些线路发生了什么?我明白为什么我会使用这两个套接字,但第二行让我困惑。任何帮助?

PS:我尝试删除该行并与

for sock in socket_list 

改变循环语句,但是当我在服务器回信不接受正确的答案

回答

0

根据该文件是什么说选择[1],它返回准备读/写的套接字。如果你这样做for sock in socket_list你只是选择一个套接字,并尝试读取,即使该套接字没有准备好(意味着它没有任何数据)。

你可以尝试做的步骤一个接一个:

while 1: 

    socket_list = [sys.stdin, s] 
    #read_sockets, write_sockets, error_sockets = select.select(socket_list , [], []) 
    #for sock in read_sockets: 
    #if sock == s: 

    # read from stdin 
    msg = sys.stdin.readline() 

    # send string to the server 
    s.send(msg) 

    # Read from server (it should have data now) 
    data = sock.recv(4096) 
    if not data: 
     sys.exit() 

    dec = map(ord,data) 
    res = max(dec) + min(dec) 
    print data+'\n(^min_max value in ascii: '+str(res)+')' 

[1] https://docs.python.org/2/library/select.html#select.select