socket實現簡單的伺服器端和客戶端的互動

2021-10-04 14:18:30 字數 2662 閱讀 6515

基於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...