PYTHON——TCPUDP:Socket初识
生活随笔
收集整理的這篇文章主要介紹了
PYTHON——TCPUDP:Socket初识
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、概述
套接字(socket)是用于網絡通信的數據結構。在任何類型的通信開始之前,都必須創建Socket,可以將它們比作電話插孔,沒有它們就無法進行通信。
Socket主要分為面向連接的Socket和無連接的Socket。面向連接的Socket使用的主要協議是傳輸控制協議,也就是我們常說的TCP,TCP的Socket名稱是SOCK_STREAM。無連接的Socket的主要協議是用戶數據報協議,也就是常說的UDP,UDP的Socket的名字是SOCK_DGRAM。
二、建立TCP服務端
(一)描述
在Python語言中創建Socket服務端程序,需要使用socket模塊中的socket類。創建Socket服務端程序的步驟如下:
1、創建Socket對象;(根據給定的IP地址類型,協議類型)
2、綁定端口號;
3、監聽端口號;
4、等待客戶端Socket的連接;
5、讀取從客戶端發送過來的數據;
6、向客戶端發送數據。
7、關閉客戶端Socket連接;
8、關閉服務端Socket連接。
上面的某些步驟可能會執行多次,例如,第4步等待客戶端Socket連接,可以放在一個循環中,當處理完一個客戶端請求后,再繼續等待另一個客戶端的請求。
關鍵字常量表示的意義:AF_INET:IPV4,AF_INET6:IPV6,SOCK_STREAM:TCP,SOCK_DGRAM:UDP
(二)實例1:最簡單的socket通信實例
Socket服務端代碼: 1 import socket 2 3 # 學socket的秘籍:一收一發 4 5 sk = socket.socket() 6 7 # family=AF_INET, type=SOCK_STREAM 8 # from socket import * 9 # sk = socket(AF_INET,SOCK_STREAM) 10 host='' #空表示本機,等效于127.0.0.1和localhost 11 port=8000 12 address = (host,port) 13 sk.bind(address) 14 sk.listen(3) 15 print('waiting......') 16 conn,addr = sk.accept() #這個conn是客戶端的socket對象。非常重要。 17 # inp = input('>>>') 18 # conn.send(bytes(inp,'utf8')) 19 data = str(conn.recv(1024),'utf8') 20 print(data) View Code
server下的方法:
bind()
listen()
accept()
recv()
send(string)
sendall()
client下的方法
connect()
recv()
send(string)
sendall()
常用函數如下: sk.bind(address)#s.bind(address) 將套接字綁定到地址。address地址的格式取決于地址族。在AF_INET下,以元組(host,port)的形式表示地址。 sk.listen(backlog)#開始監聽傳入連接。backlog指定在拒絕連接之前,可以掛起的最大連接數量。#backlog等于5,表示內核已經接到了連接請求,但服務器還沒有調用accept進行處理的連接個數最大為5#這個值不能無限大,因為要在內核中維護連接隊列 sk.setblocking(bool)#是否阻塞(默認True),如果設置False,那么accept和recv時一旦無數據,則報錯。 sk.accept()#接受連接并返回(conn,address),其中conn是新的套接字對象,可以用來接收和發送數據。address是連接客戶端的地址。#接收TCP 客戶的連接(阻塞式)等待連接的到來 sk.connect(address)#連接到address處的套接字。一般,address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤。 sk.connect_ex(address)#同上,只不過會有返回值,連接成功時返回 0 ,連接失敗時候返回編碼,例如:10061 sk.close()#關閉套接字 sk.recv(bufsize[,flag])#接受套接字的數據。數據以字符串形式返回,bufsize指定最多可以接收的數量。flag提供有關消息的其他信息,通常可以忽略。 sk.recvfrom(bufsize[.flag])#與recv()類似,但返回值是(data,address)。其中data是包含接收數據的字符串,address是發送數據的套接字地址。 sk.send(string[,flag])#將string中的數據發送到連接的套接字。返回值是要發送的字節數量,該數量可能小于string的字節大小。即:可能未將指定內容全部發送。 sk.sendall(string[,flag])#將string中的數據發送到連接的套接字,但在返回之前會嘗試發送所有數據。成功返回None,失敗則拋出異常。#內部通過遞歸調用send,將所有內容發送出去。 sk.sendto(string[,flag],address)#將數據發送到套接字,address是形式為(ipaddr,port)的元組,指定遠程地址。返回值是發送的字節數。該函數主要用于UDP協議。 sk.settimeout(timeout)#設置套接字操作的超時期,timeout是一個浮點數,單位是秒。值為None表示沒有超時期。一般,超時期應該在剛創建套接字時設置,因為它們可能用于連接的操作(如 client 連接最多等待5s ) sk.getpeername()#返回連接套接字的遠程地址。返回值通常是元組(ipaddr,port)。 sk.getsockname()#返回套接字自己的地址。通常是一個元組(ipaddr,port) sk.fileno()#套接字的文件描述符
套接字(socket)是用于網絡通信的數據結構。在任何類型的通信開始之前,都必須創建Socket,可以將它們比作電話插孔,沒有它們就無法進行通信。
Socket主要分為面向連接的Socket和無連接的Socket。面向連接的Socket使用的主要協議是傳輸控制協議,也就是我們常說的TCP,TCP的Socket名稱是SOCK_STREAM。無連接的Socket的主要協議是用戶數據報協議,也就是常說的UDP,UDP的Socket的名字是SOCK_DGRAM。
二、建立TCP服務端
(一)描述
在Python語言中創建Socket服務端程序,需要使用socket模塊中的socket類。創建Socket服務端程序的步驟如下:
1、創建Socket對象;(根據給定的IP地址類型,協議類型)
2、綁定端口號;
3、監聽端口號;
4、等待客戶端Socket的連接;
5、讀取從客戶端發送過來的數據;
6、向客戶端發送數據。
7、關閉客戶端Socket連接;
8、關閉服務端Socket連接。
上面的某些步驟可能會執行多次,例如,第4步等待客戶端Socket連接,可以放在一個循環中,當處理完一個客戶端請求后,再繼續等待另一個客戶端的請求。
關鍵字常量表示的意義:AF_INET:IPV4,AF_INET6:IPV6,SOCK_STREAM:TCP,SOCK_DGRAM:UDP
(二)實例1:最簡單的socket通信實例
Socket服務端代碼: 1 import socket 2 3 # 學socket的秘籍:一收一發 4 5 sk = socket.socket() 6 7 # family=AF_INET, type=SOCK_STREAM 8 # from socket import * 9 # sk = socket(AF_INET,SOCK_STREAM) 10 host='' #空表示本機,等效于127.0.0.1和localhost 11 port=8000 12 address = (host,port) 13 sk.bind(address) 14 sk.listen(3) 15 print('waiting......') 16 conn,addr = sk.accept() #這個conn是客戶端的socket對象。非常重要。 17 # inp = input('>>>') 18 # conn.send(bytes(inp,'utf8')) 19 data = str(conn.recv(1024),'utf8') 20 print(data) View Code
Socket客戶端代碼:
1 import socket 2 3 sk=socket.socket() 4 address = ('127.0.0.1',8000) 5 sk.connect(address) 6 7 # data = str(sk.recv(1024),'utf8') #會在此處阻塞住,等待返回值。 8 # print(data) 9 10 inp = input('>>>') 11 sk.send(bytes(inp,'utf8')) View Code (三)實例2:完善升級:socket實現單人聊天:可以同時開多個客戶端,但是同時只能一個客戶端與服務端通信,其他客戶端排隊中,等前面聊天的客戶端退出后,隊列中的一個客戶端開始可以聊天。 Socket服務端代碼: import socket# 學socket的秘籍:一收一發 sk = socket.socket() host='' #空表示本機,等效于127.0.0.1和localhost port=8000 address = (host,port) sk.bind(address) sk.listen(3) print('waiting......') # conn,addr = sk.accept() #這個conn是客戶端的socket對象。非常重要。while True:conn, addr = sk.accept() # 這個conn是客戶端的socket對象。非常重要。while True:data = str(conn.recv(1024),'utf8')if data=='': #客戶端退出時,最后還是會給服務端發送一個空串。即data為空。breakprint(data)inp = input('>>>')conn.send(bytes(inp,'utf8'))conn.close() Socket客戶端代碼:? import socketsk=socket.socket() address = ('127.0.0.1',8000) sk.connect(address)while True:inp = input('>>>')if inp=='exit':breaksk.send(bytes(inp,'utf8'))data = sk.recv(1024)print(str(data,'utf-8'))sk.close()?(四)實例3:不間斷聊天和退出處理
Socket服務端代碼: import socket# 學socket的秘籍:一收一發 sk = socket.socket() host='' #空表示本機,等效于127.0.0.1和localhost port=8000 address = (host,port) sk.bind(address) sk.listen(3) print('waiting......') # conn,addr = sk.accept() #這個conn是客戶端的socket對象。非常重要。while True:conn, addr = sk.accept() # 這個conn是客戶端的socket對象。非常重要。print(addr)while True:try:data = str(conn.recv(1024),'utf8')except Exception:breakprint(data)if data=='': #客戶端退出時,最后還是會給服務端發送一個空串。即data為空。breakinp = input('>>>')conn.send(bytes(inp,'utf8'))conn.close() Socket客戶端代碼: import socketsk=socket.socket() address = ('127.0.0.1',8000) sk.connect(address)while True:inp = input('>>>')if inp=='exit':breaksk.send(bytes(inp,'utf8'))data = sk.recv(1024)print(str(data,'utf-8'))sk.close()?
三、總結
在python3,socket傳送的內容(發送和接收都是)都是bytes類型。而已一定要遵循:一發一收原則。server下的方法:
bind()
listen()
accept()
recv()
send(string)
sendall()
client下的方法
connect()
recv()
send(string)
sendall()
常用函數如下: sk.bind(address)#s.bind(address) 將套接字綁定到地址。address地址的格式取決于地址族。在AF_INET下,以元組(host,port)的形式表示地址。 sk.listen(backlog)#開始監聽傳入連接。backlog指定在拒絕連接之前,可以掛起的最大連接數量。#backlog等于5,表示內核已經接到了連接請求,但服務器還沒有調用accept進行處理的連接個數最大為5#這個值不能無限大,因為要在內核中維護連接隊列 sk.setblocking(bool)#是否阻塞(默認True),如果設置False,那么accept和recv時一旦無數據,則報錯。 sk.accept()#接受連接并返回(conn,address),其中conn是新的套接字對象,可以用來接收和發送數據。address是連接客戶端的地址。#接收TCP 客戶的連接(阻塞式)等待連接的到來 sk.connect(address)#連接到address處的套接字。一般,address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤。 sk.connect_ex(address)#同上,只不過會有返回值,連接成功時返回 0 ,連接失敗時候返回編碼,例如:10061 sk.close()#關閉套接字 sk.recv(bufsize[,flag])#接受套接字的數據。數據以字符串形式返回,bufsize指定最多可以接收的數量。flag提供有關消息的其他信息,通常可以忽略。 sk.recvfrom(bufsize[.flag])#與recv()類似,但返回值是(data,address)。其中data是包含接收數據的字符串,address是發送數據的套接字地址。 sk.send(string[,flag])#將string中的數據發送到連接的套接字。返回值是要發送的字節數量,該數量可能小于string的字節大小。即:可能未將指定內容全部發送。 sk.sendall(string[,flag])#將string中的數據發送到連接的套接字,但在返回之前會嘗試發送所有數據。成功返回None,失敗則拋出異常。#內部通過遞歸調用send,將所有內容發送出去。 sk.sendto(string[,flag],address)#將數據發送到套接字,address是形式為(ipaddr,port)的元組,指定遠程地址。返回值是發送的字節數。該函數主要用于UDP協議。 sk.settimeout(timeout)#設置套接字操作的超時期,timeout是一個浮點數,單位是秒。值為None表示沒有超時期。一般,超時期應該在剛創建套接字時設置,因為它們可能用于連接的操作(如 client 連接最多等待5s ) sk.getpeername()#返回連接套接字的遠程地址。返回值通常是元組(ipaddr,port)。 sk.getsockname()#返回套接字自己的地址。通常是一個元組(ipaddr,port) sk.fileno()#套接字的文件描述符
?
轉載于:https://www.cnblogs.com/chenhaiming/p/9885413.html
總結
以上是生活随笔為你收集整理的PYTHON——TCPUDP:Socket初识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: @RequestMapping 和 @G
- 下一篇: 10.31NOIP模拟赛解题报告