Socket模塊學習

Socket是什麼呢?
     Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket去組織數據,以符合指定的協議。python

如何使用socket?設計模式

  先從服務器端提及。服務器端先初始化Socket,而後與端口綁定(bind),對端口進行監聽(listen),調用accept阻塞,等待客戶端鏈接。在這時若是有個客戶端初始化一個Socket,而後鏈接服務器(connect),若是鏈接成功,這時客戶端與服務器端的鏈接就創建了。客戶端發送數據請求,服務器端接收請求並處理請求,而後把迴應數據發送給客戶端,客戶端讀取數據,最後關閉鏈接,一次交互結束。
服務器

建立socket對象socket

socket.socket(family=AF_INET, type=SOCK_STREAM)spa

  family的值能夠是AF_UNIX(Unix域,用於同一臺機器上的進程間通信),也能夠是AF_INET(對於IPV4協議的TCP和UDP)設計

  type參數能夠爲SOCK_STREAM(流套接字)或者 SOCK_DGRAM(數據報文套接字),SOCK_RAW(raw套接字)。server

Socket對象的主要屬性和方法:對象

socket.bind(address)blog

  address通常狀況下爲一個雙元素元組, ((host,port)) ,主機名或者ip地址+端口號。接口

socket.listen(backlog)

  socket的監聽鏈接數,定義了最大隊列,最大值依賴於主系統(通常狀況下爲5)

socket.accept()

  調用accept方法時,socket會進入'waiting'(或阻塞)狀態。客戶請求鏈接時,方法創建鏈接並返回服務器。accept方法返回一個含有倆個元素的元組,形如(connection,address)。第一個元素(connection)是新的socket對象,服務器經過它與客戶通訊;第二個元素(address)是客戶的internet地址。

socket.connect(address)

  鏈接到address定義的遠程socket

socket.send(bytes[, flags])

  發送信息到遠程socket

socket.recv(bufsize[, flags])

  

  服務器端經過socket獲取data信息,bufsize定義了一次性接收的最大值

  

TCP

Server.py

import socket

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.bind(("",8081))
s.listen(1)

while True: 
    connection,address = s.accept()
    data = connection.recv(1024)
    print('Received:',data)

 Client.py

import socket
from pip.backwardcompat import raw_input

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

port = 8081
host = "localhost"

s.connect((host,port))

while True:
    msg = raw_input()
    s.send(bytes(msg,'utf-8'))
    s.close()

 

 

UDP

server端代碼

import socket

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

s.bind(("",8081))

while True: 
    data,host=s.recvfrom(1024)
    print('Received:',data,'from',host)

 Client端代碼

import socket
from pip.backwardcompat import raw_input

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

port = 8081
host = "localhost"
while True:
    msg = raw_input()
    print(msg)
    s.sendto(bytes(msg,encoding = "utf-8"), (host, port))
相關文章
相關標籤/搜索