python 編寫簡單的服務器和客戶端時遇到的幾個問題
# 服務端
import socket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
print('Got connect from', addr)
c.send(b'Welcome!')
print(c.recv(1024).decode())
c.close()
# 客戶端
import socket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.connect((host, port))
s.send('you are a sb'.encode())
print(s.recv(1024).decode())
運行出現以下錯誤
socket.gaierror: [Errno 8] nodename nor servname provided, or not known
(一)使用gethostname()得到的hostname 沒有寫在host中
1.獲取hostname
>>> import socket
>>> socket.gethostname()
'liu******-Air.local'
2.修改host文件
- Mac host文件地址 /etc/hosts
進入host文件後添加一行:
127.0.0.1 liu******-Air.local # 將獲取到的hostname寫進來
3.mac中修改host文件有限制,參考鏈接
https://jingyan.baidu.com/article/f3ad7d0f55154309c3345bdd.html
(二)出現TypeError: a bytes-like object is required, not ‘str’ 錯誤
- 數據均以bytes的格式傳輸數據
如果出現typeError錯誤可能是因爲沒有編碼直接傳輸str。如:
c.send('Welcome!')
上面的語句運行時會報錯
str和bytes類型之間的常用轉碼方式
- str to bytes:(3種方式)
- bytes to str (3種方式)
(三)[Errno 48] Address already in use佔用端口報錯
1.方法一:結束佔用端口的程序
有時後關閉服務端,重新再啓動服務端會出現[Errno 48] Address already in use佔用端口的錯誤。
- Mac系統可以使用
lsof命令
lsof(list open files)是一個列出當前系統打開文件的工具。在類UNIX環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。
lsof -i 用以顯示符合條件的進程情況
我們使用如下命令即可查找出佔用了某個端口的程序和其對應的PID
sudo lsof -i:1234
Password:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Python 1366 ******* 3u IPv4 0***********9 0t0 TCP localhost:search-agent (LISTEN)
//因爲有些時候是以root身份運行,所以請務必加上sudo
1234端口占用的PID爲1366,然後用 kill PID 命令結束這個程序
sudo kill 1366
2.方法二:加入一條socket配置,重用ip和端口
#加入一條socket配置,重用ip和端口
s=socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
phone.bind(('127.0.0.1',1234))