当前位置: 首页 > 面试题库 >

为什么主机中止连接?

山森
2023-03-14
问题内容

我在自学Python网络,回想起我在自学线程时,碰到了该页面,所以我复制了脚本,将其更新为Python 3.1.1并运行了它们。他们工作得很好。

然后,我做了一些修改。我的目标是做一些简单的事情:

  1. 客户端腌制一个整数并将其发送到服务器。
  2. 服务器接收腌制的整数,对其进行腌制,将其加倍,然后腌制并将其发送回客户端。
  3. 客户端接收腌制(并加倍)的整数,对其进行腌制并输出。

这是服务器:

import pickle
import socket
import threading

class ClientThread(threading.Thread):
    def __init__(self, channel, details):
        self.channel = channel
        self.details = details
        threading.Thread.__init__ ( self )

    def run(self):
        print('Received connection:', self.details[0])
        request = self.channel.recv(1024)
        response = pickle.dumps(pickle.loads(request) * 2)
        self.channel.send(response)
        self.channel.close()
        print('Closed connection:', self.details [ 0 ])

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', 2727))
server.listen(5)

while True:
    channel, details = server.accept()
    ClientThread(channel, details).start()

这是客户:

import pickle
import socket
import threading

class ConnectionThread(threading.Thread):
    def run(self):
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect(('localhost', 2727))

        for x in range(10):
            client.send(pickle.dumps(x))
            print('Sent:',str(x))
            print('Received:',repr(pickle.loads(client.recv(1024))))

        client.close()

for x in range(5):
    ConnectionThread().start()

服务器运行良好,当我运行客户端时,它成功连接并开始发送整数,并按预期将接收到的整数加倍。但是,很快它就排除了:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "C:\Python30\lib\threading.py", line 507, in _bootstrap_inner
    self.run()
  File "C:\Users\Imagist\Desktop\server\client.py", line 13, in run
    print('Received:',repr(pickle.loads(client.recv(1024))))
socket.error: [Errno 10053] An established connection was aborted by the softwar
e in your host machine

服务器继续运行,并接收连接。只有客户端崩溃。是什么原因造成的?

编辑:我让客户端使用以下代码:

import pickle
import socket
import threading

class ConnectionThread(threading.Thread):
    def run(self):
        for x in range(10):
            client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            client.connect(('localhost', 2727))
            client.send(pickle.dumps(x))
            print('Sent:',str(x))
            print('Received:',repr(pickle.loads(client.recv(1024))))
            client.close()

for x in range(5):
    ConnectionThread().start()

但是,我仍然不知道发生了什么。这不是只是多次打开和关闭插座吗?难道不应该有时间限制吗?(关闭插座后不久就不能打开插座)?


问题答案:

您的客户端现在是正确的-您要打开套接字发送数据,接收答复,然后关闭套接字。

错误原始错误是由服务器在发送第一个响应后关闭套接字导致的,当客户端尝试在同一连接上发送第二条消息时,该消息导致客户端收到连接关闭消息。

但是,我仍然不知道发生了什么。这不是只是多次打开和关闭插座吗?

是。即使不是性能最高的处理方法,这也是可以接受的。

难道不应该有时间限制吗?(关闭插座后不久就不能打开插座)?

您可以根据需要尽快打开客户端套接字,就像每次打开套接字一样,您将获得一个新的本地端口号,这意味着连接不会受到干扰。在上面的服务器代码中,它将为每个传入的连接启动一个新线程。

每个IP连接(source_address,source_port,destination_address,destination_port)有4个部分,并且必须不断更改此四边形(众所周知)。除source_port之外的所有内容都已固定用于客户端套接字,因此操作系统会为您更改。

打开服务器套接字比较麻烦-如果您想快速打开新的服务器套接字,

server.bind(('', 2727))

在上面,您需要阅读SO_REUSEADDR。



 类似资料:
  • 问题内容: 我正在尝试使用H2OR内的库在具有7000万行和25个数字特征的训练集上使用随机森林分类模型。总文件大小为5.6 GB。 验证文件的大小为1 GB。 我的系统上有16 GB RAM和8核CPU。 系统成功读取了H2O对象中的两个文件。 然后,我给出以下命令来构建模型: 但是几分钟(不生成任何树)后,出现以下错误: “ .h2o.doSafeREST中的错误(conn = conn,h2

  • 我正在使用mac系统并启动hadoop系统,使用以下命令: 并且我的主机名是“hostname”命令返回的“ctpllt072.local”。但当连接启动name节点时,我会得到一个奇怪的主机名和消息,如下所示: yarn-site.xml

  • 问题内容: 如您所见,我在数据库连接上遇到问题。它给了我这个错误: …由于许多连接错误而被阻止 我搜索了一些答案,但无法解决问题。 我不知道我是否提供了您需要的所有信息,所以如果您需要其他信息,请告诉我。我有来自不同计算机的数据库连接,并且创建了一个用户来访问该数据库,但该用户位于主机行中,因此我想使用IP地址更改它以解决安全问题,因此出现了此错误,因此我卡住。 问题答案: MySQL会阻止连接时

  • 我有一个与Ms Sql连接的服务。连接正在从本地系统成功运行。但在部署后会引发以下错误。 无法获得查询元数据的连接:驱动程序无法使用安全套接字层(SSL)加密建立到SQL服务器的安全连接。错误:“客户端首选项不接受服务器选择的协议版本TLS10[TLS13, TLS12] Dockerfile中唯一的更改是最后3行: 即使在恢复更改之后,我也会遇到同样的错误。你能帮我解决这个问题吗?

  • 我刚刚开始使用rabbitmq,我目前正在rabbitmq网站上的教程中工作。我使用本地机器作为服务器完成了hello world教程。现在我想连接到另一台机器上的远程服务器。我的问题是我需要使用什么主机名来连接到这个服务器。它是安装rabbitmq服务器的机器的ip地址吗。

  • 问题内容: 我正在尝试通过对象读取命令。为了检查输入语法,我使用了(对于缺少命令的情况)。在许多情况下,它确实可以正常工作,但是现在我有了JavaAPI中描述为“ MAY块并等待输入”的情况。 该方法什么时候阻止,我该如何控制?有趣的是,在块之前有3个案例,它工作得很好。另外,JavaAPI还描述了检查是否存在另一个Input的正确方法,以使该Method 不会产生。 这是我到目前为止所产生的代码