應用程序兩端經過「套接字」向網絡發出請求或者應答網絡請求。能夠把socket理解爲通訊的把手(hand),是一個接口,封裝了大量方法html
socket起源於UNIX,在Unix一切皆文件哲學的思想下,socket是一種"打開—讀/寫—關閉"模式的實現,服務器和客戶端各自維護一個"文件",在創建鏈接打開後,能夠向本身文件寫入內容供對方讀取或者讀取對方內容,通信結束時關閉文件。socket的英文原義是「插槽」或「插座」,就像咱們家裏座機同樣,若是沒有網線的那個插口,電話是沒法通訊的。Socket是實現TCP,UDP協議的接口,便於使用TCP,UDP。java
注意:Socket不能發送爲空的字符[直接回車]編程
服務器端:服務器
# 服務端 import socket # family=AF_INET, 表明使用IPV4的IP協議 # type=SOCK_STREAM 表明使用TCP協議進行鏈接 server = socket.socket() # 建立socket ip_addr = ('127.0.0.1', 9999) # 1024以前的端口,默認是OS使用 server.bind(ip_addr) # 要求必須是一個元組 server.listen(3) # 開始監聽傳入鏈接。在拒絕鏈接以前,能夠掛起的最大鏈接數量。 while True: conn, addr = server.accept() # 接受鏈接並返回(conn,address) # 其中conn是新的套接字對象[客戶端],能夠用來接收和發送數據。 # address是鏈接客戶端的地址。 exit_flag = True while exit_flag: print('當前鏈接對象', addr) # 發送必定要有接收 try: data = conn.recv(1024) print('服務器:', str(data, 'utf-8')) inp = input('>>>:') if inp != 'bye': conn.send(bytes(inp, 'utf-8')) exit_flag = True else: conn.send(bytes(inp, 'utf-8')) exit_flag = False except Exception as e: print('已關閉當前鏈接對象', addr, '等待鏈接...') exit_flag = False finally: conn.close() server.close()
客戶端:網絡
# 客戶端 import socket # family=AF_INET, 表明使用IPV4的IP協議 # type=SOCK_STREAM 表明使用TCP協議進行鏈接 client = socket.socket() ip_addr = ('127.0.0.1', 9999) try: client.connect(ip_addr) exit_flag = True while exit_flag: # 發送必定要有接收 inp = input('>>>:') if inp != 'bye': client.send(bytes(inp, 'utf-8')) exit_flag = True else: client.send(bytes(inp, 'utf-8')) exit_flag = False info = client.recv(1024) # 最大接收1024K數據,# 傳送/接收的數據必定是byte類型 print('客戶端:', str(info, 'utf-8')) except Exception as e: print('客戶端關閉鏈接', e) finally: client.close()
Server:app
import socket
import select
sk=socket.socket()
sk.bind(("127.0.0.1",8801))
sk.listen(5)
inputs=[sk,]
while True:
r,w,e=select.select(inputs,[],[],5)
print(len(r))
for obj in r:
if obj==sk:
conn,add=obj.accept()
print(conn)
inputs.append(conn)
else:
data_byte=obj.recv(1024)
print(str(data_byte,'utf8'))
inp=input('回答%s號客戶>>>'%inputs.index(obj))
obj.sendall(bytes(inp,'utf8'))
print('>>',r)
client:socket
import socket sk=socket.socket() sk.connect(('127.0.0.1',8801)) while True: inp=input(">>>>") sk.sendall(bytes(inp,"utf8")) data=sk.recv(1024) print(str(data,'utf8'))