python网络编程—TCP协议(一)
一、TCP協議示意圖:
listen():監聽客戶端的連接,客戶端有鏈接,listen馬上就有返回。
accept():連接之后,會返回客戶端的信息(ip地址、端口號),如果沒有連接則一直堵塞。連接成功后,服務器就可以發數據,同時會創建一個新的socket
recvfrom:接收客戶端的數據,如果服務端沒有收到客戶端發來的數據,會滯留,下面的代碼不會執行。
read():讀取客戶端發過來的數據
write():將數據返回給客戶端
由new_socket來完成與客戶端數據的傳輸
如果new_socket關閉,則說明當前的這個客戶端請求結束,服務端服務完畢;如果有新的請求來了,服務器會創建新的new_socket與它通訊。
如果關掉第一個socket,則說明整個服務端程序關閉了
二、步驟
(1) socket創建一個套接字
(2) bind綁定ip和port
(3) listen使套接字變為可以被動鏈接
(4) accept等待客戶端的鏈接
(5) recv/send接收發送數據
三、代碼實現TCP協議
服務器端
from socket import *# todo 1、創建server-socket TCP協議 server_socket = socket(AF_INET, SOCK_STREAM)# todo 2、創建目標服務器,綁定一個IP和端口 服務器里面空的字符串代表server_socket綁定這臺機器下的任何ip地址 host_port = ('', 8088) server_socket.bind(host_port)# todo 3、監聽服務器的socket,listen讓socket處于被動。這時就可以接收客戶端的連接請求了 server_socket.listen(5) # 一般為5,表示客戶端線程掛起的個數# todo 4、等待客戶端的連接請求,當前函數是線程阻塞的函數,accept返回2個值,第一個:新的socket,第二個:客戶端地址 new_socket, client_addr = server_socket.accept() # todo 新創建的socket是server_socket中的子socket,只是和當前的客戶端(一個客戶端)收發數據# todo 5、服務器接收客戶端發送過來的數據,recv一般用于TCP協議的接收數據,recvfrom用于UDP data = new_socket.recv(1024) # data是字節數據print('服務器接收的數據是:', data.decode('utf-8'))# todo 6、服務器端發送數據給客戶端,在TCP中發送數據用send,UDP用sendto new_socket.send('THANK you'.encode('utf-8'))# 關閉套接字 new_socket.close() # todo new_socket關閉意味著當前客戶端的服務已經完成 server_socket.close() # todo server_socket關閉意味著整個服務器全部關閉代碼注釋:
1、host_port = (’’, 8088)
server_socket.bind(host_port)
創建目標服務器,綁定一個IP和端口 服務器里面空的字符串代表server_socket綁定這臺機器下的任何ip地址**
2、new_socket, client_addr = server_socket.accept()
等待客戶端的連接請求,當前函數是線程阻塞的函數,accept返回2個值,第一個:新的socket,第二個:客戶端地址,
新創建的socket是server_socket中的子socket,只是和當前的客戶端(一個客戶端)收發數據**
3、data = new_socket.recv(1024) # data是字節數據
服務器接收客戶端發送過來的數據,recv一般用于TCP協議的接收數據,recvfrom用于UDP**
4、new_socket.send(‘THANK you’.encode(‘utf-8’))
服務器端發送數據給客戶端,在TCP中發送數據用send,UDP用sendto**
客戶端:
代碼注釋:
send_data = input(‘請輸入:’)
client_socket.send(send_data.encode(‘utf-8’))
客戶端發送請求,用send不用sendto,客戶端知道服務器的ip和端口,服務器也知道客戶端的端口和ip,因為是面向連接的
總結
以上是生活随笔為你收集整理的python网络编程—TCP协议(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python—多线程之信号量
- 下一篇: TCP模拟QQ聊天案例