python socket 书籍_Python学习之路——socket
一、Socket通常也稱作"套接字",用于描述IP地址和端口,是一個(gè)通信鏈的句柄,可以用來(lái)實(shí)現(xiàn)不同虛擬機(jī)或不同計(jì)算機(jī)之間的通信。
socket服務(wù)端示例:
importsocket
ip_port= ('127.0.0.1',9999) #設(shè)定服務(wù)端的IP地址與端口。
sk= socket.socket() #調(diào)用socket構(gòu)造函數(shù)。
sk.bind(ip_port) #使用bind方法綁定服務(wù)端IP與端口。也可以理解成向系統(tǒng)注冊(cè)IP與端口信息。
sk.listen(5) #設(shè)定最多連接數(shù)。
whileTrue:print('server waiting...')
conn,addr= sk.accept() #服務(wù)器套接字通過(guò)socket的accept方法等待客戶請(qǐng)求一個(gè)連接。
client_data = conn.recv(1024) #設(shè)定每次最多能接受1024個(gè)字節(jié)
print(str(client_data,'utf8')) #打印服務(wù)端接收客戶端的信息。
conn.sendall(bytes('不要回答,不要回答,不要回答','utf8')) #使用sendall方法發(fā)信息給客戶端。
conn.close() #關(guān)閉連接。
socket服務(wù)端示例:
socket客戶端示例:
importsocket
ip_port= ('127.0.0.1',9999) #設(shè)定好服務(wù)端的IP與開(kāi)放的端口。
sk= socket.socket() #調(diào)用socket構(gòu)造函數(shù)
sk.connect(ip_port) #使用socket的connect方法連接服務(wù)器
sk.sendall(bytes('請(qǐng)求占領(lǐng)地球','utf8')) #使用sendall方法發(fā)信息給服務(wù)端。
server_reply = sk.recv(1024) #設(shè)定每次最多能接受1024個(gè)字節(jié)
print(str(server_reply,'utf8')) #打印出接收到的服務(wù)端反回信息。
sk.close() #關(guān)閉socket連接。
socket客戶端示例:
socket更多功能:
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
參數(shù)一:地址簇
socket.AF_INET IPv4(默認(rèn))
socket.AF_INET6 IPv6
socket.AF_UNIX 只能夠用于單一的Unix系統(tǒng)進(jìn)程間通信
參數(shù)二:類型
socket.SOCK_STREAM 流式socket , for TCP (默認(rèn))
socket.SOCK_DGRAM 數(shù)據(jù)報(bào)式socket , for UDP
socket.SOCK_RAW 原始套接字,普通的套接字無(wú)法處理ICMP、IGMP等網(wǎng)絡(luò)報(bào)文,而SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的IPv4報(bào)文;此外,利用原始套接字,可以通過(guò)IP_HDRINCL套接字選項(xiàng)由用戶構(gòu)造IP頭。
socket.SOCK_RDM 是一種可靠的UDP形式,即保證交付數(shù)據(jù)報(bào)但不保證順序。SOCK_RAM用來(lái)提供對(duì)原始協(xié)議的低級(jí)訪問(wèn),在需要執(zhí)行某些特殊操作時(shí)使用,如發(fā)送ICMP報(bào)文。SOCK_RAM通常僅限于高級(jí)用戶或管理員運(yùn)行的程序使用。
socket.SOCK_SEQPACKET 可靠的連續(xù)數(shù)據(jù)包服務(wù)
sk.bind(address)
s.bind(address) 將套接字綁定到地址。address地址的格式取決于地址族。在AF_INET下,以元組(host,port)的形式表示地址。
sk.listen(backlog)
開(kāi)始監(jiān)聽(tīng)傳入連接。backlog指定在拒絕連接之前,可以掛起的最大連接數(shù)量。
backlog等于5,表示內(nèi)核已經(jīng)接到了連接請(qǐng)求,但服務(wù)器還沒(méi)有調(diào)用accept進(jìn)行處理的連接個(gè)數(shù)最大為5
這個(gè)值不能無(wú)限大,因?yàn)橐趦?nèi)核中維護(hù)連接隊(duì)列
sk.setblocking(bool)
是否阻塞(默認(rèn)True),如果設(shè)置False,那么accept和recv時(shí)一旦無(wú)數(shù)據(jù),則報(bào)錯(cuò)。
sk.accept()
接受連接并返回(conn,address),其中conn是新的套接字對(duì)象,可以用來(lái)接收和發(fā)送數(shù)據(jù)。address是連接客戶端的地址。
接收TCP 客戶的連接(阻塞式)等待連接的到來(lái)
sk.connect(address)
連接到address處的套接字。一般,address的格式為元組(hostname,port),如果連接出錯(cuò),返回socket.error錯(cuò)誤。
sk.connect_ex(address)
同上,只不過(guò)會(huì)有返回值,連接成功時(shí)返回 0 ,連接失敗時(shí)候返回編碼,例如:10061
sk.close()
關(guān)閉套接字
sk.recv(bufsize[,flag])
接受套接字的數(shù)據(jù)。數(shù)據(jù)以字符串形式返回,bufsize指定最多可以接收的數(shù)量。flag提供有關(guān)消息的其他信息,通常可以忽略。
sk.recvfrom(bufsize[.flag])
與recv()類似,但返回值是(data,address)。其中data是包含接收數(shù)據(jù)的字符串,address是發(fā)送數(shù)據(jù)的套接字地址。
sk.send(string[,flag])
將string中的數(shù)據(jù)發(fā)送到連接的套接字。返回值是要發(fā)送的字節(jié)數(shù)量,該數(shù)量可能小于string的字節(jié)大小。即:可能未將指定內(nèi)容全部發(fā)送。
sk.sendall(string[,flag])
將string中的數(shù)據(jù)發(fā)送到連接的套接字,但在返回之前會(huì)嘗試發(fā)送所有數(shù)據(jù)。成功返回None,失敗則拋出異常。
內(nèi)部通過(guò)遞歸調(diào)用send,將所有內(nèi)容發(fā)送出去。
sk.sendto(string[,flag],address)
將數(shù)據(jù)發(fā)送到套接字,address是形式為(ipaddr,port)的元組,指定遠(yuǎn)程地址。返回值是發(fā)送的字節(jié)數(shù)。該函數(shù)主要用于UDP協(xié)議。
sk.settimeout(timeout)
設(shè)置套接字操作的超時(shí)期,timeout是一個(gè)浮點(diǎn)數(shù),單位是秒。值為None表示沒(méi)有超時(shí)期。一般,超時(shí)期應(yīng)該在剛創(chuàng)建套接字時(shí)設(shè)置,因?yàn)樗鼈兛赡苡糜谶B接的操作(如 client 連接最多等待5s )
sk.getpeername()
返回連接套接字的遠(yuǎn)程地址。返回值通常是元組(ipaddr,port)。
sk.getsockname()
返回套接字自己的地址。通常是一個(gè)元組(ipaddr,port)
sk.fileno()
套接字的文件描述符
二、SocketServer模塊:
SocketServer內(nèi)部使用 IO多路復(fù)用 以及 “多線程” 和 “多進(jìn)程” ,從而實(shí)現(xiàn)并發(fā)處理多個(gè)客戶端請(qǐng)求的Socket服務(wù)端。即:每個(gè)客戶端請(qǐng)求連接到服務(wù)器時(shí),Socket服務(wù)端都會(huì)在服務(wù)器是創(chuàng)建一個(gè)“線程”或者“進(jìn)程” 專門負(fù)責(zé)處理當(dāng)前客戶端的所有請(qǐng)求。
ThreadingTCPServer
ThreadingTCPServer實(shí)現(xiàn)的Soket服務(wù)器內(nèi)部會(huì)為每個(gè)client創(chuàng)建一個(gè) “線程”,該線程用來(lái)和客戶端進(jìn)行交互。
1、ThreadingTCPServer基礎(chǔ)
使用ThreadingTCPServer:
創(chuàng)建一個(gè)繼承自 SocketServer.BaseRequestHandler 的類
類中必須定義一個(gè)名稱為 handle 的方法
啟動(dòng)ThreadingTCPServer
importsocketserverclassmy_server(socketserver.BaseRequestHandler):defhandle(self):whileTrue:print('新的連接:',self.client_address)
data= self.request.recv(1024)if not data:break
print('客戶端說(shuō):',data.decode())
self.request.send(data)if __name__ == '__main__':
host,port= 'localhost',5000
#把剛才寫的類當(dāng)作一個(gè)參數(shù)傳給my_server類,下面代碼是創(chuàng)建一下多線程socket server
server =socketserver.ThreadingTCPServer((host,port),my_server)#啟動(dòng)server,這個(gè)server會(huì)一起運(yùn)行。
server.serve_forever()
服務(wù)器端代碼示例:
importsocket
ip_port= ('127.0.0.1',5000)
sk=socket.socket()
sk.connect(ip_port)whileTrue:
user_inpu= input('請(qǐng)輸入:').strip()
sk.sendall(bytes(user_inpu,'utf8'))
server_recv= sk.recv(1024)print('服務(wù)器回應(yīng):',str(server_recv,'utf8'))
sk.close()
客戶端代碼示例:
總結(jié)
以上是生活随笔為你收集整理的python socket 书籍_Python学习之路——socket的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么用盘做系统盘 用外接硬盘制作系统启动
- 下一篇: python dicom 器官分割_图像