Sockets 如何使用按键关闭()服务器连接?(使用套接字进行简单联网)
因此,我对Python中的网络和Sockets 如何使用按键关闭()服务器连接?(使用套接字进行简单联网),sockets,python-2.7,networking,Sockets,Python 2.7,Networking,因此,我对Python中的网络和Socket模块非常陌生。所以我看了一些Youtube教程,找到了一个关于如何为简单服务器编写代码的教程。当服务器从客户端接收数据时,我的问题是正确的,服务器close()。我希望服务器自动断开与客户端的连接,但不要“关机”或close()。我想设置它(如果可能的话),这样当服务器在我的Python Shell中运行时,如果我想close()连接,我会使用热键,例如“Control+E”?以下是我目前的代码: #!/usr/bin/python import so
Socket
模块非常陌生。所以我看了一些Youtube教程,找到了一个关于如何为简单服务器编写代码的教程。当服务器从客户端接收数据时,我的问题是正确的,服务器close()。我希望服务器自动断开与客户端的连接,但不要“关机”或close()
。我想设置它(如果可能的话),这样当服务器在我的Python Shell中运行时,如果我想close()
连接,我会使用热键,例如“Control+E”?以下是我目前的代码:
#!/usr/bin/python
import socket
import sys
# Create a TCP/IP socket to listen on
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Prevent from "adress already in use" upon server restart
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# Bind the socket to port 8081 on all interfaces
server_address = ('localhost',8081)
print ('starting up on %s port %s')%(server_address)
server.bind(server_address)
#Listen for connections
server.listen(5)
#Wait for one incoming connection
connection, client_address = server.accept()
print 'connection from', connection.getpeername()
# Let's recieve something
data = connection.recv(4096)
if data:
print "Recived ", repr(data)
#send the data back nicely formatted
data = data.rstrip()
connection.send("%s\n%s\n%s\n"%('-'*80, data.center(80),'-'*80))
# lose the connection from our side (the Server side)
connection.shutdown(socket.SHUT_RD | socket.SHUT_WR)
connection.close()
print 'Connection closed'
# And stop listening
server.close()
==================================================================================
以下是我正在使用的代码(在服务器端):
下面是当我尝试向服务器发送字符串时它给我的错误:
data = s.recv(1024)
File "C:\Python27\lib\socket.py", line 170, in _dummy
raise error(EBADF, 'Bad file descriptor')
error: [Errno 9] Bad file descriptor
下面是一个非阻塞套接字读取的示例,其结构与您的类似
服务器将在本地主机中建立一个套接字
,并等待客户端连接。之后,它将开始轮询套接字以获取数据,并继续检查退出条件close\u socket\u条件
。处理ctrl-e
或其他退出事件将留作练习:)
首先,我们启动socket,方法与您非常相似:
#!/usr/bin/python
import socket, sys
import select
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#Let's set the socket option reuse to 1, so that our server terminates quicker
srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
srv.bind(("localhost", 8081))
srv.listen(5)
然后,我们宣布我们的外部退出条件关闭\u套接字\u条件
,并启动始终欢迎新客户的永恒while循环:
close_socket_condition = 0
while True:
print "Waiting for a client to connect"
(client, c_address) = srv.accept() #blocking wait for client
print "Client connected"
现在客户端已连接,我们应该启动服务循环:
在服务循环内,我们将继续轮询他的套接字以获取数据,如果没有数据到达,我们将检查退出条件:
ready_to_read, ready_to_write, in_error = select.select(client_list, [], [] , 1) #timeout 1 second
for s in ready_to_read: #Check if there is any socket that has data ready for us
data = client.recv(1024) # blocks until some data is read
if data:
client.send("echo:" + data)
client.close()
close_socket_condition = 1
这段代码是一个简化的示例,但服务器将继续接受新客户机,并始终重用连接。它不处理客户端终止等
希望它有帮助那么如果代码按预期执行?数据
是否充满了什么?如果您想保持连接的活动状态,并且只在某些外部事件中退出,那么您必须查看非阻塞套接字,并创建某种消息处理循环。是的,数据
是从我创建的客户端发送的(这两个客户端都在我的计算机上运行),而数据
只是一个字符串,表示“你好!”。嗯,难道我就不能简单地失去与客户机的连接,而让服务器继续运行吗?谢谢!代码中添加的注释真的很有帮助,特别是因为我对socket和所有东西都不熟悉。所以我试着运行这段代码,它就运行了。然后我运行了一个客户端,但是当我试图向服务器发送一些东西时,它给了我一个错误?我将编辑我的问题并发布我得到的错误和我的代码。不客气。只要注意一些逻辑,如果多个客户端连接(可能创建单独的处理程序线程?),如果有人永远不会发送数据等,会发生什么。现在也没有一般的异常处理。。
# Client has connected, add him to a list which we can poll for data
client_list = [client]
while close_socket_condition == 0:
ready_to_read, ready_to_write, in_error = select.select(client_list, [], [] , 1) #timeout 1 second
for s in ready_to_read: #Check if there is any socket that has data ready for us
data = client.recv(1024) # blocks until some data is read
if data:
client.send("echo:" + data)
client.close()
close_socket_condition = 1