基於socket在本機上實現最簡單的伺服器端和客戶端的互動,在實現過程中遇到問題:
伺服器端和客戶端都在執行的時候,客戶端突然停止,伺服器端會報錯:
traceback (most recent call last):
file "e:/python_learn/python_cord/day29/伺服器.py", line 41, in data=conn.recv(buffer_size)#收訊息
connectionreseterror: [winerror 10054] 遠端主機強迫關閉了乙個現有的連線。
**如下:
伺服器端
#import socket
#當寫import socket時,下面需要寫成socket.socket(socket.af_inet,socket.sock_stream)
#可以用from socket import *,此時下面可以寫成socket(af_inet,sock_stream)
from socket import *
ip_port=('127.0.0.1', 8000)
back_log=5
buffer_size=1024
tcp_server=socket(af_inet, sock_stream)
tcp_server.bind(ip_port)
tcp_server.listen(back_log)
print('服務端開始執行')
conn,addr=tcp_server.accept()#伺服器端阻塞
print('雙向連線是',conn)
print('客戶端位址是',addr)
while true:
print('伺服器開始執行了')
data=conn.recv(buffer_size)#收訊息
print('客戶端發來的訊息',data)
conn.send(data.upper())
conn.close()#socket關閉掉
tcp_server.close()
客戶端
import socket
tcp_client=socket.socket(socket.af_inet, socket.sock_stream)
tcp_client.connect(('127.0.0.1', 8000))
while true:
msg=input('>>:').strip()
tcp_client.send(msg.encode('utf-8'))
data=tcp_client.recv(1024)
print('收到伺服器端發來的訊息:',data)
產生錯誤原因分析:
在客戶端斷掉之後,伺服器端的本次conn異常結束,data=conn.recv(buffer_size)接收不到東西。程式丟擲異常。
優化(解決辦法)
雖然我們設定了接收池back_log為5,但是我們的tcp_server.accept()只有乙個。意味著只能接收一次connect。接收完之後就開始跟這一次的connect進行通訊,通訊完成之後就關閉掉了。此時伺服器端只服務乙個人。但是伺服器端的目的是迴圈服務很多人。簡單來說來乙個鏈結就能接收住。
當本次conn異常結束後,會丟擲異常。我們可以用python提供的異常處理來抓住此次異常,並使用break結束此次的迴圈,讓它可以再等待下乙個客戶端訊息得到來。
改進後**:
#伺服器端
from socket import *
ip_port=('127.0.0.1', 8000)
back_log=5
buffer_size=1024
tcp_server=socket(af_inet, sock_stream)
tcp_server.bind(ip_port)
tcp_server.listen(back_log)
while true:
conn, addr = tcp_server.accept() # 伺服器端阻塞
print('雙向連線是', conn)
print('客戶端位址是', addr)
while true:
print('伺服器開始執行了')
try:
data=conn.recv(buffer_size)#收訊息
print('客戶端發來的訊息',data)
conn.send(data.upper())
except exception:
print('*****')
break
data=conn.recv(buffer_size)#收訊息
print('客戶端發來的訊息',data)
conn.send(data.upper())
conn.close()#socket關閉掉
tcp_server.close()
外層迴圈的目的:使伺服器可以為多個客戶端提供服務
裡層迴圈的目的:使伺服器可以完成對同乙個客戶端傳送的多條訊息的收發工作
socket伺服器端
伺服器 include winsock2.h include string.h include stdio.h include time.h include stdarg.h include stdlib.h pragma comment lib,ws2 32 void errexit const ...
socket程式設計,實現簡單的客戶端伺服器端傳送資料
套接字模組是乙個非常簡單的基於物件的介面,它提供對低層bsd套接字樣式網路的訪問。使用該模組可以實現客戶機和伺服器套接字。要在python 中建立具有tcp和流套接字的簡單伺服器,需要使用socket模組。利用該模組包含的函式和類定義,可生成通過網路通訊的程式。一般來說,建立伺服器連 接需要六個步驟...
SOCKET伺服器端的操作
1 確定socket版本 word tsocketverno wsadata tverdata tsocketverno makeword 2,0 wsastartup tsocketverno,tverdata 2.建立乙個socket socket serversock serversock s...