直接進入正題。
今天在進行一個socket編程時,遇到了如題這樣的問題。
這個問題很常見,有的是爬蟲方面的,五花八門的,查了一圈發現沒有解決我的問題,接下來就分享下我遇到的問題和我的解決方案吧。
問題背景
環境: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
運行客戶端程序(本地),一會兒出現:
首先查看騰訊雲安全組:
該端口是開放的,一切正常。
那是什么原因呢?我在的博客中寫過,Ubuntu 服務器利用Apache 2搭建一個簡單的網站。在安裝完Apache 2后,有一步是在UFW上允許Apache,會不會是防火牆沒有開放端口呢?
ssh連接到服務器
輸入:
sudo ufw status
發現Apache已經在運行中,但是服務器UFW並沒有允許預期端口8080,此時,我們開放8080端口。
sudo ufw allow 8080
再次查看UFW狀態:
可以看到8080端口已經開放了。
再來試試之前的程序。
服務端:
客戶端:
類似的,實現多個客戶端與服務端通信等等其他功能也可以相繼展開了。
對於UFW,開啟和關閉防火牆:
sudo ufw enable|disable
查看防火牆狀態
sudo ufw status
開啟和禁用端口如下:
sudo ufw allow|deny [service]
至此,我的問題解決了,標題問題出現的原因可能有很多,這里是我個人遇到我的問題,以及自己的解決方案,解決了自己的問題,對於同樣的問題有可能就不適用了。