服務端提供服務python
客戶端請求服務編程
套接字是計算機網絡數據結構,它體現了「通訊端點」的概念。服務器
在任何類型的通訊開始以前,網絡應用程序必須建立套接字。網絡
能夠將它們比做電話插孔,沒有它將沒法進行通訊。數據結構
要建立套接字,必須使用 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 | 套接字協議 |
#!/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()
#!/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()
運行結果
#!/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()
#!/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()
運行結果