Python-網絡編程

客戶端/服務器架構

服務端提供服務python

客戶端請求服務編程

套接字:通訊端點

套接字是計算機網絡數據結構,它體現了「通訊端點」的概念。服務器

在任何類型的通訊開始以前,網絡應用程序必須建立套接字。網絡

能夠將它們比做電話插孔,沒有它將沒法進行通訊。數據結構

Python 中的網絡編程

socket()模塊函數

要建立套接字,必須使用 socket.socket()函數,它通常的語法以下。架構

socket(socket_family, socket_type, protocol=0)

socket_family 是 AF_UNIX 或 AF_INETsocket

socket_type 是 SOCK_STREAM或 SOCK_DGRAM函數

protocol 一般省略,默認爲 0ui

使用如下方式建立TCP/UDP套接字spa

from socket import *

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

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

套接字對象(內置)方法

常見的套接字對象方法和屬性

名 稱 描 述
服務器套接字方法  
s.bind() 將地址(主機名、端口號對)綁定到套接字上
s.listen() 設置並啓動 TCP 監聽器
s.accept() 被動接受 TCP 客戶端鏈接,一直等待直到鏈接到達(阻塞)
客戶端套接字方法  
s.connect() 主動發起 TCP 服務器鏈接
s.connect_ex() connect()的擴展版本,此時會以錯誤碼的形式返回問題,而不是拋出一個異常
普通的套接字方法  
s.recv() 接收 TCP 消息
s.recv_into()① 接收 TCP 消息到指定的緩衝區

(續表)

名 字 描 述
s.send() 發送 TCP 消息
s.sendall() 完整地發送 TCP 消息
s.recvfrom() 接收 UDP 消息
s.recvfrom_into()① 接收 UDP 消息到指定的緩衝區
s.sendto() 發送 UDP 消息
s.getpeername() 鏈接到套接字( TCP)的遠程地址
s.getsockname() 當前套接字的地址
s.getsockopt() 返回給定套接字選項的值
s.setsockopt() 設置給定套接字選項的值
s.shutdown() 關閉鏈接
s.close() 關閉套接字
s.detach() 在未關閉文件描述符的狀況下關閉套接字,返回文件描述符
s.ioctl() 控制套接字的模式(僅支持 Windows)
面向阻塞的套接字方法  
s.setblocking() 設置套接字的阻塞或非阻塞模式
s.settimeout() 設置阻塞套接字操做的超時時間
s.gettimeout() 獲取阻塞套接字操做的超時時間
面向文件的套接字方法  
s.fileno() 套接字的文件描述符
s.makefile() 建立與套接字關聯的文件對象
數據屬性  
s.family 套接字家族
s.type 套接字類型
s.proto 套接字協議

建立TCP服務器

#!/usr/bin/env/python3
#-*- coding:utf8 -*-
import socket
import sys

Server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 建立服務端套接字

HOST = '127.0.0.1'
PORT = 9999
ADDRS=(HOST,PORT)
Server.bind(ADDRS)  #綁定IP,Port
Server.listen(2)    #最大鏈接數
print("正在監聽:%s:%d"%(HOST,PORT))

while True: #服務器無限循環
   Client, addr = Server.accept()  #接受客戶端鏈接
   print("鏈接來自:%s" % str(addr))    #打印客戶端鏈接IP
   msg = 'Wlecome to here!\n'
   #send()和recv()的數據格式都是bytes。
   # (str和bytes的相互轉化,用encode()和decode(),或者用bytes()和str())
   while True:
       Client.send(msg.encode("utf-8")) # 發送歡迎標語
       msg = Client.recv(1024)    #接受並輸出信息
       print("接收到客戶端數據:%s" % msg.decode("utf-8"))
       msg=input('輸入>')    # 輸入信息
   Client.close()
Server.close()

建立TCP客戶端

#!/usr/bin/env/python3
#-*- coding:utf8 -*-
import socket

Client= socket.socket(socket.AF_INET,socket.SOCK_STREAM)    # 建立客戶端套接字

HOST = '127.0.0.1'
PORT = 9999
ADDRS=(HOST,PORT)
Client.connect(ADDRS)  # 鏈接服務器
while True:
   msg = Client.recv(1024)
   print("接受到服務端數據:%s" % msg.decode("utf-8"))
   msg = input('輸入>')
   Client.send(msg.encode("utf-8"))
Client.close()

運行結果

建立UDP服務器

#!/usr/bin/env python3
#-*- coding:utf8 -*-
import socket

HOST='127.0.0.1'
PORT=9999
ADDR=(HOST,PORT)
BUFSIZE=1024

Server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
Server.bind(ADDR)
print("正在監聽 %s:%d" % (HOST,PORT) )
while True:
   msg,ADDR=Server.recvfrom(BUFSIZE)
   print("接收到來自客戶端的數據:%s" % msg.decode("utf-8"))
   msg=input('輸入>')
   Server.sendto(msg.encode("utf-8"),ADDR)
Server.close()

建立UDP客戶端

#!/usr/bin/env python3
#-*- coding:utf8 -*-

import socket

HOST='127.0.0.1'
PORT=9999
ADDR=(HOST,PORT)
BUFSIZE=1024

Client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
   msg = input('輸入>')
   Client.sendto(msg.encode("utf-8"),ADDR)
   msg,ADDR=Client.recvfrom(BUFSIZE)
   print("接收到服務端的數據:%s" % msg.decode("utf-8"))
Client.close()

運行結果

相關文章
相關標籤/搜索