Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何使用按键关闭()服务器连接?(使用套接字进行简单联网)_Sockets_Python 2.7_Networking - Fatal编程技术网

Sockets 如何使用按键关闭()服务器连接?(使用套接字进行简单联网)

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

因此,我对Python中的网络和
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