解决 s.connect((host, port)) TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

直接进入正题。



今天在进行一个socket编程时,遇到了如题这样的问题。

image.png

这个问题很常见,有的是爬虫方面的,五花八门的,查了一圈发现没有解决我的问题的内容,接下来就分享下我遇到的问题和我的解决方案吧。

问题背景

环境:win10,Pycharm,python

今天在进行socket编程时,遇到上图的问题。
我需要在本地客户端与服务器端建立通信,简化后的情景如下:

服务器端程序:

# -*- coding: utf-8 -*-

import socket

hostname = socket.gethostname()
host = socket.gethostbyname(hostname)
# host = 服务器内网ip
port = 8080
# 端口
web = socket.socket()
web.bind((host, port))
web.listen(5)
print("start")
while True:
    conn, addr = web.accept()
    data = conn.recv(1024)
    print(data)
    conn.sendall(b'hello')
    conn.close()

客户端程序:

# -*- coding: utf-8 -*-

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "公网ip"
# host = 服务器公网ip
port = 8080
# 端口
s.connect((host, port))

send_data = input("input:")
s.send(send_data.encode())
rec_data = s.recv(1024).decode()
print("close scoket", rec_data)
s.close()

先运行服务器端程序(使用Pycharm ssh连接到服务器):

start

运行客户端程序(本地),一会儿出现:

image.png

首先查看腾讯云安全组:

image.png

该端口是开放的,一切正常。

那是什么原因呢?我在的博客中写过,Ubuntu 服务器利用Apache 2搭建一个简单的网站。在安装完Apache 2后,有一步是在UFW上允许Apache,会不会是防火墙没有开放端口呢?

ssh连接到服务器
输入:

sudo ufw status
image.png

发现Apache已经在运行中,但是服务器UFW并没有允许预期端口8080,此时,我们开放8080端口。

sudo ufw allow 8080
image.png

再次查看UFW状态:

image.png

可以看到8080端口已经开放了。

再来试试之前的程序。

服务端:

image.png

客户端:

image.png

类似的,实现多个客户端与服务端通信等等其他功能也可以相继展开了。

对于UFW,开启和关闭防火墙:

sudo ufw enable|disable

查看防火墙状态

sudo ufw status

开启和禁用端口如下:

sudo ufw allow|deny [service]



至此,我的问题解决了,标题问题出现的原因可能有很多,这里是我个人遇到我的问题,以及自己的解决方案,解决了自己的问题,对于同样的问题有可能就不适用了。

你可能感兴趣的:(解决 s.connect((host, port)) TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。)