python 編寫簡單的服務器和客戶端時遇到的幾個問題

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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章