1. 程式人生 > >5-4日 socket套接字

5-4日 socket套接字

詳解 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套接字