【问题标题】:Use of select() in a python client在 python 客户端中使用 select()
【发布时间】:2015-09-05 06:31:53
【问题描述】:

我目前正在为一个项目构建一个 python 客户端。我对python知之甚少。如果我的代码不是很好,很抱歉! 我的客户端工作正常,它连接到服务器,并与他“交谈”,很简单。但我想像在 C 中一样使用 select 。 所以现在我的客户看起来像这样:

p = GetOptions()
mess = MessageClass()
ic = InterpretClass()
cc = CommandClass()
s = None

def send_name_to_server(s):
  var = 'TEAM '
  var += p.getName()
  #var += '\r\n'                                                                                                                                                                                    
  mess.sendMessage(s, var)

def protocol(s):
  rec = mess.readMessage(s)
  if (ic.interpret_bienvenue(s, rec, p) == 1):
    send_name_to_server(s)
  rec = mess.readMessage(s)
  ic.interpret_num_client(s, rec, p)
  rec = mess.readMessage(s)
  ic.interpret_size(s, rec, p)
  var = 'OK'
  mess.sendMessage(s, var)

def main():
  try:
    p.parseOpt()
    if not p.getName():
        print('Exception : You need a name to start')
        sys.exit()
    mc = ModuleConnect()
    s = mc.connect(p.getHost(), p.getPort())
    protocol(s)
    s.close()
  except ConnectionRefusedError:
    print('Exception : The server has refused the connection')
  except getopt.GetoptError:
    print('Usage : client.py -n [NAME] -h [HOST] -p [PORT]')
  except:                                                                                                                                                                                          
    print('Exception : An error has occured')                                                                                                                                                    

if __name__ == "__main__":
  main()

我的类 ModuleConnect 看起来像这样:

导入套接字

class ModuleConnect(object):

  """ Create connexion """

  def connect(self, host, port):
    s = socket.socket()
    s.connect((host, int(port)))
    return s

那么它是如何工作的呢?我用 parseOpt 方法解析从命令行收到的参数(这里不重要),然后用 ModuleConnect 的方法 connect 初始化我的连接,然后用协议方法与我的服务器交谈。我认为简单吗?在 C 中为了使用 select 我会做这样的事情:

FD_SET(0, &(c->read_fds));
FD_SET(c->sd, &(c->read_fds));
  if (select(c->sd + 1, &(c->read_fds), NULL, NULL, NULL) == -1)                                                                                                                                      
{
  perror("Client-select() error ! ");
  exit(1);
}
if (FD_ISSET(c->sd, &(c->read_fds)))
  read_message_from_server(c);
if (FD_ISSET(0, &(c->read_fds)))
  send_message(c);

如果我的服务器先与我交谈,我会阅读他告诉我的内容,否则我会发送我必须发送给他的消息。但我找不到在 python 中做到这一点的方法..

再次抱歉,我是 python 的菜鸟,即使按照教程我也找不到方法。

感谢您的帮助!

【问题讨论】:

  • 你不应该使用 SocketServer 库吗?
  • 那个库中没有使用 select ,这对我有什么帮助?

标签: python sockets select network-programming


【解决方案1】:

为了避免这个问题,我一直(几乎)同时阅读和发送,当我读到一些我不知道的东西时,我就把它扔掉了。所以没有使用选择,只是读/写。

【讨论】:

    猜你喜欢
    • 2013-10-04
    • 1970-01-01
    • 2015-04-20
    • 2015-09-10
    • 2016-12-08
    • 2011-04-25
    • 2020-08-07
    • 2022-10-19
    • 2016-04-19
    相关资源
    最近更新 更多