【发布时间】: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