我在自学Python网络,回想起我在自学线程时,碰到了该页面,所以我复制了脚本,将其更新为Python 3.1.1并运行了它们。他们工作得很好。
然后,我做了一些修改。我的目标是做一些简单的事情:
这是服务器:
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 不会产生。 这是我到目前为止所产生的代码