Python | Socket01 - 创建一个TCP服务器(阻塞+单线程),将TCP客户端发过来的字符串原路返回
一、前言
使用Python可以很簡單地創(chuàng)建一個TCP服務(wù)器程序,該TCP服務(wù)器的程序目的是完成這個功能:TCP客戶端發(fā)送一段字符串給TCP服務(wù)端,TCP服務(wù)端將字符串原路返回去。
我是從該B站視頻教程學(xué)習(xí)python的socket編程:
https://www.bilibili.com/video/BV1Xx411R743?spm_id_from=333.999.0.0
二、代碼
import socketdef main():# 創(chuàng)建套接字tcp_Server_Sockettcp_Server_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 綁定本地信息tcp_Server_Socket.bind(("",7890))# 套接字對象tcp_Server進(jìn)入監(jiān)聽狀態(tài),等待TCP客戶端建立鏈接,最大連接數(shù)為1tcp_Server_Socket.listen(1)while True:print("等待一個新的客戶端的到來:")# 等待TCP客戶端的連接new_Client_Socket,client_addr = tcp_Server_Socket.accept()print("一個新的客戶端已經(jīng)到來:%s" % str(client_addr))# 循環(huán)目的:為同一個客戶端服務(wù)多次,直到客戶端斷開連接while True:# 進(jìn)入阻塞態(tài),等待TCP客戶端發(fā)送字符串(最大1024個字節(jié))過來recv_data = new_Client_Socket.recv(1024)# 打印信息到控制臺print("客戶端送過來的請求是: %s" % recv_data.decode("utf-8"))# 解除阻塞有兩種情況:if recv_data:# 將數(shù)據(jù)發(fā)回去之前增加一個換行recv_data += "\n".encode("utf-8") # 將收到的字符串原路返回給TCP客戶端 new_Client_Socket.sendall(recv_data)else:print(client_addr,"disconnected") # TCP客戶端斷開連接,打印信息。breaknew_Client_Socket.close()print("已經(jīng)為客戶端服務(wù)完畢.")tcp_Server_Socket.close() #可選,它永遠(yuǎn)不會被執(zhí)行if __name__ == "__main__":main()
三、測試代碼
3.1、網(wǎng)絡(luò)調(diào)試助手mNetAssist
在ubuntu使用網(wǎng)絡(luò)調(diào)試助手mNetAssist可以方便地測試socket程序,它可以充當(dāng)TCP服務(wù)器,TCP客戶端,UDP收發(fā)。
3.2、使用mNetAssist測試socket程序
接著,點擊“連接網(wǎng)絡(luò)”。TCP服務(wù)器檢測到有TCP客戶端連接過來,表示TCP服務(wù)器與TCP客戶端建立連接成功,可以發(fā)送字符串了。
最后,使用網(wǎng)絡(luò)調(diào)試助手(TCP客戶端)發(fā)送一串字符串“Hello,World"給TCP服務(wù)器。TCP服務(wù)器接收到”Hello,World"之后,將"Hello,World返回給TCP客戶端。
最后,TCP客戶端斷開連接。TCP服務(wù)器會繼續(xù)等待下一個TCP客戶端的連接。
此時,TCP客戶端也可以再次連接TCP服務(wù)器。
至此,使用python3開發(fā)的TCP服務(wù)器程序完成。
四、socket程序阻塞的位置
先說明一下,new_Client_Socket.recv(1024)就是阻塞的位置。TCP服務(wù)器跟TCP客戶端建立連接后,TCP服務(wù)器會馬上進(jìn)入接收的狀態(tài)(阻塞),直到TCP客戶端發(fā)送消息過來(解阻塞)才開始執(zhí)行后續(xù)的程序。
總結(jié)
以上是生活随笔為你收集整理的Python | Socket01 - 创建一个TCP服务器(阻塞+单线程),将TCP客户端发过来的字符串原路返回的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat 优化_浅谈Tomcat服务
- 下一篇: 在python中要表示一个空的代码块可以