以前實現了Java版本的TCP和UDP套接字編程的例子,因而決定結合Python的學習作一個Python版本的套接字編程實驗。編程
流程以下:服務器
1.一臺客戶機從其標準輸入(鍵盤)讀入一行字符,並經過其套接字將該行發送到服務器。socket
2.服務器從其鏈接套接字讀取一行字符。學習
3.服務器將該行字符轉換成大寫。ui
4.服務器將修改後的字符串(行)經過鏈接套接字再發回給客戶機。編碼
5.客戶機從其套接字中讀取修改後的行,而後將該行在其標準輸出(監視器)上打印出來。spa
【TCP】服務器端代碼:code
import socket import time import threading s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #建立socket (AF_INET:IPv4, AF_INET6:IPv6) (SOCK_STREAM:面向流的TCP協議) s.bind(('127.0.0.1', 10021)) #綁定本機IP和任意端口(>1024) s.listen(1) #監聽,等待鏈接的最大數目爲1 print('Server is running...') def TCP(sock, addr): #TCP服務器端處理邏輯 print('Accept new connection from %s:%s.' %addr) #接受新的鏈接請求 while True: data = sock.recv(1024) #接受其數據 time.sleep(1) #延遲 if not data or data.decode() == 'quit': #若是數據爲空或者'quit',則退出 break sock.send(data.decode('utf-8').upper().encode()) #發送變成大寫後的數據,需先解碼,再按utf-8編碼, encode()其實就是encode('utf-8') sock.close() #關閉鏈接 print('Connection from %s:%s closed.' %addr) while True: sock, addr = s.accept() #接收一個新鏈接 TCP(sock, addr) #處理鏈接
【TCP】客戶端代碼:blog
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #建立一個socket s.connect(('127.0.0.1', 10021)) #創建鏈接 while True: #接受屢次數據 data = input('請輸入要發送的數據:') #接收數據 if data == 'quit': #若是爲'quit',則退出 break s.send(data.encode()) #發送編碼後的數據 print(s.recv(1024).decode('utf-8')) #打印接收到的大寫數據 s.send(b'quit') #放棄鏈接 s.close() #關閉socket
運行結果:utf-8
UDP協議則不須要事先創建鏈接,直接互相發送數據便可。
【UDP】服務器端代碼:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #建立一個socket,SOCK_DGRAM表示UDP s.bind(('127.0.0.1', 10021)) #綁定IP地址及端口 print('Bound UDP on 10021...') while True: data, addr = s.recvfrom(1024) #得到數據和客戶端的地址與端口,一次最大接收1024字節 print('Received from %s:%s.' % addr) s.sendto(data.decode('utf-8').upper().encode(), addr)#將數據變成大寫送回客戶端 #不關閉socket
【UDP】客戶端代碼:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) addr = ('127.0.0.1', 10021) #服務器端地址 while True: data = input('請輸入要處理的數據:') #得到數據 if not data or data == 'quit': break s.sendto(data.encode(), addr) #發送到服務端 recvdata, addr = s.recvfrom(1024) #接收服務器端發來的數據 print(recvdata.decode('utf-8')) #解碼打印 s.close() #關閉socket
運行結果: