直接進(jìn)入正題。
今天在進(jìn)行一個(gè)socket編程時(shí),遇到了如題這樣的問(wèn)題。

這個(gè)問(wèn)題很常見(jiàn),有的是爬蟲(chóng)方面的,五花八門(mén)的,查了一圈發(fā)現(xiàn)沒(méi)有解決我的問(wèn)題的內(nèi)容,接下來(lái)就分享下我遇到的問(wèn)題和我的解決方案吧。
問(wèn)題背景
環(huán)境:win10,Pycharm,python
今天在進(jìn)行socket編程時(shí),遇到上圖的問(wèn)題。
我需要在本地客戶(hù)端與服務(wù)器端建立通信,簡(jiǎn)化后的情景如下:
服務(wù)器端程序:
# -*- coding: utf-8 -*-
import socket
hostname = socket.gethostname()
host = socket.gethostbyname(hostname)
# host = 服務(wù)器內(nèi)網(wǎng)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()
客戶(hù)端程序:
# -*- coding: utf-8 -*-
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "公網(wǎng)ip"
# host = 服務(wù)器公網(wǎng)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()
先運(yùn)行服務(wù)器端程序(使用Pycharm ssh連接到服務(wù)器):
start
運(yùn)行客戶(hù)端程序(本地),一會(huì)兒出現(xiàn):

首先查看騰訊云安全組:

該端口是開(kāi)放的,一切正常。
那是什么原因呢?我在的博客中寫(xiě)過(guò),Ubuntu 服務(wù)器利用Apache 2搭建一個(gè)簡(jiǎn)單的網(wǎng)站。在安裝完Apache 2后,有一步是在UFW上允許Apache,會(huì)不會(huì)是防火墻沒(méi)有開(kāi)放端口呢?
ssh連接到服務(wù)器
輸入:
sudo ufw status

發(fā)現(xiàn)Apache已經(jīng)在運(yùn)行中,但是服務(wù)器UFW并沒(méi)有允許預(yù)期端口8080,此時(shí),我們開(kāi)放8080端口。
sudo ufw allow 8080

再次查看UFW狀態(tài):

可以看到8080端口已經(jīng)開(kāi)放了。
再來(lái)試試之前的程序。
服務(wù)端:

客戶(hù)端:

類(lèi)似的,實(shí)現(xiàn)多個(gè)客戶(hù)端與服務(wù)端通信等等其他功能也可以相繼展開(kāi)了。
對(duì)于UFW,開(kāi)啟和關(guān)閉防火墻:
sudo ufw enable|disable
查看防火墻狀態(tài)
sudo ufw status
開(kāi)啟和禁用端口如下:
sudo ufw allow|deny [service]
至此,我的問(wèn)題解決了,標(biāo)題問(wèn)題出現(xiàn)的原因可能有很多,這里是我個(gè)人遇到我的問(wèn)題,以及自己的解決方案,解決了自己的問(wèn)題,對(duì)于同樣的問(wèn)題有可能就不適用了。