5-4日 socket套接字
阿新 • • 發佈:2018-05-04
詳解 order server ret spa 對象 消息 idt table
1,socket定義
Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。
2,基於tcp協議的socket
tcp是基於鏈接的,必須先啟動服務端,然後再啟動客戶端去鏈接服務端。
server端
import socket sk = socket.socket()#創建服務端套接字 sk.bind((‘127.0.0.1‘,9090))#把地址綁定到套接字 sk.listen()#監聽鏈接 conn,addr= sk.accept()#接受客戶端鏈接 print(addr)#打印客戶端地址 conn.send(‘你好‘.encode(‘utf-8‘))#向客戶端發送信息 ret = conn.recv(1024)#接受客戶端信息 print(ret.decode(‘utf-8‘))#打印客戶端信息 conn.close()#關閉客戶端套接字 sk.close()#關閉服務器套接字(可選)
client端
import socket sk = socket.socket()#創建客戶端套接字 sk.connect((‘127.0.0.1‘,9090))# 嘗試連接服務器 ret = sk.recv(1024)#接受服務端信息print(ret.decode(‘utf-8‘))#打印服務端信息 sk.send(‘你也好‘.encode(‘utf-8‘))# 對話(發送/接收) sk.close()# 關閉客戶套接字
3,基於UDP協議的socket
udp是無鏈接的,啟動服務之後可以直接接受消息,不需要提前建立鏈接
server端
import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind((‘127.0.0.1‘,9090)) while True: msg,client_addr = sk.recvfrom(1024) print(msg.decode(‘utf-8‘)) inp = input(‘>>>‘) sk.sendto(inp.encode(‘utf-8‘),client_addr) sk.close()
client端
import socket sk= socket.socket(type=socket.SOCK_DGRAM) while True: inp = input(‘>>>‘) sk.sendto(inp.encode(‘utf-8‘),(‘127.0.0.1‘,9090)) msg,addr = sk.recvfrom(1024) print(msg.decode(‘utf-8‘)) sk.close()
qq輕聊版
server端
import socket lst = {‘egon‘:‘\031[1;31m‘,‘yuan‘:‘031[1;31m‘} sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind((‘127.0.0.1‘,9090)) while True: msg,client_addr = sk.recvfrom(1024) name,mesg = msg.decode(‘utf-8‘).split(‘:‘) color = lst.get(name.strip(),‘‘) print(‘%s%s\033[0m‘%(color,msg.decode(‘utf-8‘))) inp = input(‘>>>‘) sk.sendto(inp.encode(‘utf-8‘),client_addr) sk.close()
client端
import socket sk = socket.socket(type=socket.SOCK_DGRAM) name = input(‘name‘) while True: inp = input(‘>>>‘) sk.sendto((‘%s:%s‘%(name,inp)).encode(‘utf-8‘),(‘127.0.0.1‘,9090)) msg,addr = sk.recvfrom(1024) print(msg.decode(‘utf-8‘)) sk.close()
時間服務器
server端
import time import socket sk = socket.socket(type = socket.SOCK_DGRAM) sk.bind((‘127.0.0.1‘,9090)) while True: msg,addr = sk.recvfrom(1024) sk.sendto(time.strftime(msg.decode(‘utf-8‘)).encode(‘utf-8‘),addr) sk.close()
client端
import time import socket sk = socket.socket(type=socket.SOCK_DGRAM) while True: sk.sendto(‘%Y/%m/%d %H:%M:%S‘.encode(‘utf-8‘),(‘127.0.0.1‘,9090)) ret,addr = sk.recvfrom(1024) print(ret.decode(‘utf-8‘)) time.sleep(2) sk.close()
socket參數的詳解
socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None)
創建socket對象的參數說明:
family | 地址系列應為AF_INET(默認值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。 (AF_UNIX 域實際上是使用本地 socket 文件來通信) |
type |
套接字類型應為SOCK_STREAM(默認值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。 SOCK_STREAM 是基於TCP的,有保障的(即能保證數據正確傳送到對方)面向連接的SOCKET,多用於資料傳送。 SOCK_DGRAM 是基於UDP的,無保障的面向消息的socket,多用於在網絡上發廣播信息。 |
proto | 協議號通常為零,可以省略,或者在地址族為AF_CAN的情況下,協議應為CAN_RAW或CAN_BCM之一。 |
fileno |
如果指定了fileno,則其他參數將被忽略,導致帶有指定文件描述符的套接字返回。 與socket.fromfd()不同,fileno將返回相同的套接字,而不是重復的。 這可能有助於使用socket.close()關閉一個獨立的插座。 |
5-4日 socket套接字