5-4日 socket套接字
生活随笔
收集整理的這篇文章主要介紹了
5-4日 socket套接字
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1,socket定義
Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設(shè)計(jì)模式中,Socket其實(shí)就是一個(gè)門面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對(duì)用戶來說,一組簡(jiǎn)單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。
2,基于tcp協(xié)議的socket
tcp是基于鏈接的,必須先啟動(dòng)服務(wù)端,然后再啟動(dòng)客戶端去鏈接服務(wù)端。
server端
import socket sk = socket.socket()#創(chuàng)建服務(wù)端套接字sk.bind(('127.0.0.1',9090))#把地址綁定到套接字 sk.listen()#監(jiān)聽鏈接conn,addr = sk.accept()#接受客戶端鏈接 print(addr)#打印客戶端地址 conn.send('你好'.encode('utf-8'))#向客戶端發(fā)送信息 ret = conn.recv(1024)#接受客戶端信息 print(ret.decode('utf-8'))#打印客戶端信息conn.close()#關(guān)閉客戶端套接字 sk.close()#關(guān)閉服務(wù)器套接字(可選)client端
import socketsk = socket.socket()#創(chuàng)建客戶端套接字 sk.connect(('127.0.0.1',9090))# 嘗試連接服務(wù)器 ret = sk.recv(1024)#接受服務(wù)端信息 print(ret.decode('utf-8'))#打印服務(wù)端信息 sk.send('你也好'.encode('utf-8'))# 對(duì)話(發(fā)送/接收)sk.close()# 關(guān)閉客戶套接字3,基于UDP協(xié)議的socket
udp是無鏈接的,啟動(dòng)服務(wù)之后可以直接接受消息,不需要提前建立鏈接
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 socketsk= 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()時(shí)間服務(wù)器
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 socketsk = 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參數(shù)的詳解
socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None) 創(chuàng)建socket對(duì)象的參數(shù)說明:| family | 地址系列應(yīng)為AF_INET(默認(rèn)值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。 (AF_UNIX 域?qū)嶋H上是使用本地 socket 文件來通信) |
| type | 套接字類型應(yīng)為SOCK_STREAM(默認(rèn)值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。 SOCK_STREAM 是基于TCP的,有保障的(即能保證數(shù)據(jù)正確傳送到對(duì)方)面向連接的SOCKET,多用于資料傳送。 SOCK_DGRAM 是基于UDP的,無保障的面向消息的socket,多用于在網(wǎng)絡(luò)上發(fā)廣播信息。 |
| proto | 協(xié)議號(hào)通常為零,可以省略,或者在地址族為AF_CAN的情況下,協(xié)議應(yīng)為CAN_RAW或CAN_BCM之一。 |
| fileno | 如果指定了fileno,則其他參數(shù)將被忽略,導(dǎo)致帶有指定文件描述符的套接字返回。 與socket.fromfd()不同,fileno將返回相同的套接字,而不是重復(fù)的。 這可能有助于使用socket.close()關(guān)閉一個(gè)獨(dú)立的插座。 |
轉(zhuǎn)載于:https://www.cnblogs.com/yzxing/p/8992043.html
總結(jié)
以上是生活随笔為你收集整理的5-4日 socket套接字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生成器与文档结合
- 下一篇: SPFA的两个优化:SLF与LLL