一.說明
在開始之前呢,先用一張圖表示他們之間的關系
Socket對象方法:
類型 | 函數 | 描述 |
---|---|---|
服務端 | .bind() | 綁定地址關鍵字,AF_INET下以元組的形式表示地址。常用bind((host,port)) |
.accept() | 被動接受TCP客戶端的連接 | |
客戶端 | .connect() | 初始化服務器連接 |
.connect_ex() | 是對connect()函數的擴展,當出錯時返回出錯碼,不報異常 | |
其它函數 | .recv() | 接收數據,數據以字符串的形式返回,bufsize指定接收的最大數據量 |
.send() | 發送數據,將string中的數據發送到連接的套接字,返回值是要發送的字節數量,通常使用.encode()函數對數據進行轉碼 | |
.senddall() | 發送完整的數據,在返回之前會嘗試發送所有數據,成功返回None,失敗則拋出異常 | |
.recvfrom() | 與recv()函數類似,不同的是返回值是(data,address),其中data是包含接收數據的字符串,address是發送數據的套接字地址 | |
.sendto() | 發送UDP數據,將數據發送到套接字,形式是(ipaddr,port)的元組 | |
.close() | 關閉套接字 |
二.服務端
使用socket函數來創建一個socket對象,並設置一個socket服務,然后通過bind(hostname,port)函數來指定一個端口,使用socket對象的accept方法,等待客戶端的連接,並返回connection對象。
#創建服務端套接字
serversocket=socket()
#把地址綁定到套接字
serversocket.bind()
#對連接進行監聽
serversocket.listen()
#使用一個while進行循環,並接收客戶端的連接
while True:
serverclient=serversocket.accept()
while True:
#接收已發送
serverclient.recv()
serverclient.send()
#關閉客戶端套接字
serverclient.close()
#關閉服務端套接字
serversocket.close()
實現功能:通過while實現循環接收客戶端發送的數據,並對客戶端發送的數據進行顯示並返回給客戶端數據,返回給客戶端的數據信息后加入時間戳。
import socket
import sys
import time
serversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=socket.gethostname()#獲取本地主機名
port=9999
#綁定端口號
serversocket.bind((host,port))
#設置最大連接數
serversocket.listen(5)
while True:
print('服務器啟動,監聽客戶端鏈接')
clientsocket,addr=serversocket.accept()
print('鏈接地址:%s' % str(addr))
while True:
try:
data=clientsocket.recv(1024)
except Exception:
print('斷開的客戶端:',addr)
break
print('客戶端發送內容:',data.decode('utf-8'))
reply=input('回復:').strip()
if not reply:
break
msg=time.strftime('%Y-%m-%d %X')#獲取結構化時間戳
msg1='[%s]:%s'% (msg,reply)
clientsocket.send(msg1.encode('utf-8'))
clientsocket.close()
serversocket.closel()
三.客戶端
創建一個客戶端用來連接以上服務的的服務,使用socket.connect()方法打開一個TCP連接到主機,連接后可以從服務端獲取數據,在操作完成后關閉連接
#創建客戶端的套接字
client=socket()
#嘗試連接服務器
client.connect()
#發送並接收數據
client.send()
client.recv()
#關閉客戶端套接字
client.close()
具體代碼:
import socket, sys
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=socket.gethostname()
port=9999
s.connect((host,port))
while True:
data= input('>>').strip()
if not data:
break
s.send(data.encode('utf-8'))
msg=s.recv(1024)
if not msg:
break
print(msg.decode('utf-8'))
s.close()