python之socket模塊詳解--小白博客
主要是創建一個服務端,在創建服務端的時候,主要步驟如下:
創建socket對象socket——》綁定IP地址和端口bind——》監聽listen——》得到請求accept——》接收請求recv——》發送信息send——》關閉close
客戶端代碼就是連接服務器,接收和發送消息,具體流程如下:
創建socket對象socket——》connet連接服務器——》獲取消息recv——》發送消息send——關閉close
1、服務端代碼
#服務器端 import socket import subprocess import threading server = socket.socket() server.bind((‘‘, 8888)) server.listen(5) print(‘等待電話.....‘) conn, addr = server.accept() print(‘電話來了......‘) def recv(): while True: data = conn.recv(10240) print(data.decode(‘utf-8‘)) def send(): while True: data = input(‘===>:‘) conn.send(data.encode(‘utf-8‘)) t1 = threading.Thread(target=recv) t2 = threading.Thread(target=send) t1.start() t2.start()
2、客戶端代碼
#客戶端 import socket import threading client = socket.socket() client.connect((‘localhost‘, 8888)) def send(): while True: info = input(‘===>:‘) client.send(info.encode(‘utf-8‘)) def recv(): while True: data = client.recv(1024) print(data.decode(‘utf-8‘)) t1 = threading.Thread(target=send) t2 = threading.Thread(target=recv) t1.start() t2.start()
3、 基本描述
在使用socket模塊的時候,創建對象一般是使用如下的代碼:
s = socket.socket()
在使用默認值的時候,表示創建的是TCP 的socket,地址家族表示為socket.AF_INET,socket類型默認值為socket.SOCK_STREAM表示為TCP的,而UDP的為socket.SOCK_DGRAM,表示為數據包
綁定的代碼如下:
s.bind((IP,port))
註意在綁定的時候,參數只有一個表示為元組tuple,其中第一個元素為ip地址或者是hostname,第二個參數為port端口號,也就是開始監聽哪個IP地址的哪個端口
監聽的代碼如下:
s.listen(5)
其中的參數為整數,5表示阻塞五個連接,實際上,,經過測試,十幾個都沒問題,主要是阻塞式的,當有一個連接上的時候,那麽其他的都不會連接上,只有在第一個推出的時候,其他的才能進行連接,開始還以為是可以同時連接五個,然後測試下,發現不行,無論是同一個服務器上還是不同的機器上,是不能同時進行連接的,也就是所謂的阻塞式。
被動接受請求的代碼如下:
conn,addres = s.accept()
返回的是一個元組,也就是在接受客戶端的連接,返回的第一個元素是一個socket對象,可以認為是客戶端的socket對象,address表示為客戶端的地址,其實這個也就使用和客戶端進行通信的。
客戶端連接服務器端的代碼如下:
s.connect((ip,port))
參數為服務器的IP地址和服務器監聽的端口。
發送消息的代碼如下:
conn.send(‘string is send‘)
conn.sendall(‘send‘)
l兩個都是用來發送消息的,區別就是sendall盡量一次發送,而send的話主要看接收能力,如果超出範圍的話,那麽會進行發送兩次進行發送
接收消息的代碼如下:
conn.recv(1024)
主要方法是recv方法表示接收消息,最多接收的字節數為1024,那麽多余的字符將會在下次接收的過程中進行接收。
4、運行客服端和服務端
在運行客戶端和服務端代碼之後,發現是可以交互的,也就是客戶端和服務端進行說話,就想其他的一些交流軟件一樣,註意,在上述的代碼中還存在一些bug
python之socket模塊詳解--小白博客