我的问题更笼统而不是具体。我想实现一个简单的客户机-服务器应用程序,只需将消息从客户机传递到服务器并从服务器获取确认。
我想知道在使用sockets时需要考虑什么,我需要实现自己的通信接口并在同一个连接上管理消息传递,还是为每个消息创建一个新的连接?
(请假设当前的消息小于缓冲区大小)
代码如下:
服务器.py
server_info = (HOST, PORT)
sock = socket.socket(family=AF_INET, type=SOCK_STREAM)
sock.bind(server_info)
sock.listen(NUMBER_OF_SOCKETS)
try:
while True:
connection, client_address = sock.accept()
try:
while True:
data = connection.recv(BUFFER_SIZE)
print('message received: {data}'.format(data=data))
connection.send("ok")
finally:
connection.close()
客户端.py
server_info = (HOST, PORT)
sock = socket.socket(family=AF_INET, type=SOCK_STREAM)
sock.connect(server_info)
try:
print("connection established")
while True:
print("Please enter a message you want to pass to the server")
msg = raw_input()
print('sending "{message}"'.format(message=msg))
sock.send(msg)
while True:
data = sock.recv(constants.BUFFER_SIZE)
print('received "{data}"'.format(data=data))
break
finally:
print('closing socket')
sock.close()
这段代码使我能够在服务器端接收多条消息,并从客户端发送多条消息。这是正确的方法吗?为此,我必须在客户端创建两个无限循环,关闭连接如何?当我发送0字节的消息时,服务器和客户端都会卡住。
非常感谢!
在双向通信中,默认情况下,客户端可以知道何时完成发送,但无法知道是否完成接收。而且,服务器也不知道客户端是否已经完成发送。
代码:
您可以在数据前面放置一个字节计数,或者有一个结束标记,这样服务器就可以知道它是否得到了所有字节。
然而,这带来了一个问题。如果字节计数错误或结束标记从未到达怎么办?使用
socket.close()
时,服务器无法告诉客户端“奇怪。你已经把数据发送给我了,但是我没有得到所有的数据”,因为客户端发送完后,客户端连接没有保持打开状态。使用
socket.shutdown(1
)服务器仍然可以告诉客户端有问题,并采取适当的措施。shutdown命令有三个选项:
在上面的代码中,重点放在1上,以消除关闭操作中的隐式发送。请注意,在send_data中,close操作与关机的距离(相对而言)较远。这允许服务器告诉客户端任何临别赠言。
只需运行代码启动服务器。出于演示目的,服务器一次设置为recv only2 bytes(应该是8192)。要向它发送数据,请导入它(调用shut_srv或其他名称),并为客户端调用send_data。
你会得到这样的反应:
connected sent a1234 shutdown ERROR:no end! connected sent b1234 shutdown ERROR:no end! connected sent c1234 shutdown ERROR:no end! connected sent d1234 shutdown ERROR:no end! connected sent e1234 shutdown ERROR:no end!
如果你做的记号一样。响应应该是:
connected sent a123456789 shutdown a1234a1234 connected sent b1234 shutdown b1234b1234 connected sent c1234 shutdown c1234c1234 connected sent d1234 shutdown d1234d1234 connected sent e1234 shutdown e1234e1234
添加两种类型的服务器客户端一种是多进程的,另一种是异步的,它们做的事情几乎相同,异步的更健壮,请阅读此处的原因: Threads vs. Async。
我的例子: 使用多进程:
委托人:
下一个服务器要健壮得多!!!数据不会丢失!!! 服务器:
异步客户端:
还有一个小配置文件:
我也遇到了同样的问题,请尝试以下服务器:
相关问题 更多 >
编程相关推荐