1. 程式人生 > >簡單的 socket 代碼

簡單的 socket 代碼

none __main__ spl IV 協議 pen close udp 建立連接

TCP 編程

客戶端代碼

將鍵盤輸入的字符發送到服務端,並將從服務端接收到的字符輸出到終端

技術分享圖片
 1 #!/usr/python3
 2 
 3 import socket
 4 
 5 def socket_client():
 6     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 7 
 8     #獲取主機名
 9     host = socket.gethostname()
10     port = 9999
11 
12     #建立連接
13     s.connect((host, port))
14 
15     #
接受歡迎消息 16 print(s.recv(1024).decode(utf-8)) 17 while True: 18 data = input() 19 #發送數據 20 s.send(data.encode(utf-8)) 21 print(s.recv(1024).decode(utf-8)) 22 s.send(bexit) 23 s.close() 24 25 def main(): 26 socket_client() 27 28 if __name__ ==
__main__: 29 main()
View Code

註意:若服務器需要同時響應多個客戶端請求,每個連接都需要一個新進程或新線程處理,否則服務器一次只能服務一個客戶端

服務端代碼

將從客戶端接收到的字符前面加上 HELLO, 再發送回給客戶端

技術分享圖片
 1 #!/usr/bin/python3
 2 
 3 import socket
 4 import threading
 5 import time
 6 
 7 def tcp_link(sock, addr):
 8     print(Accept new connection from %s %s... % addr)
9 sock.send(歡迎學習 python 網絡編程.encode(utf-8)) 10 while True: 11 data = sock.recv(1024) 12 time.sleep(1) 13 if not data or data.decode(utf-8) == exit: 14 break 15 sock.send((HELLO, %s % data.decode(utf-8)).encode(utf-8)) 16 sock.close() 17 print(Connection from %s : %s closed. % addr) 18 19 20 def socket_server(): 21 #創建一個 socket 22 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#SOCK_STREAM 指定使用面向流的 TCP 協議 23 #其中 AF_INET 指定使用 IPv4 協議,若要使用 IPv6 則指定該參數為 AF_INET6 24 25 #獲取本地主機名 26 host = socket.gethostname() 27 28 #獲取本地主機名 29 host = socket.gethostname() 30 31 #設置端口號 32 port = 9999 33 34 #監聽端口 35 s.bind((host, port)) 36 37 #設置最大連接數,超過後排隊 38 s.listen(5) 39 40 while True: 41 #接受一個新連接 42 sock, addr = s.accept() 43 # 創建新線程處理TCP連接 44 t = threading.Thread(target = tcp_link, args = (sock, addr)) 45 t.start() 46 47 48 def main(): 49 socket_server() 50 51 52 if __name__ == __main__: 53 main()
View Code

UDP 編程

客戶端代碼

將鍵盤輸入的字符發送到服務端,並將從服務端接收到的字符輸出到終端

技術分享圖片
 1 #!/usr/bin/python3
 2 
 3 import socket
 4 
 5 def socket_udp_client():
 6     host = socket.gethostname()
 7     port = 9999
 8     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 9     while True:
10         data = input()
11 
12         #發送數據
13         s.sendto(data.encode(utf-8), (host, port))
14 
15         #接收數據
16         print(s.recv(1024).decode(utf-8))
17 
18 
19 def main():
20     socket_udp_client()
21 
22 
23 if __name__ == __main__:
24     main()
View Code

服務端代碼

將從客戶端接收到的字符前面加上 hello, 再發送回給客戶端

技術分享圖片
 1 #!/usr/bin/python3
 2 
 3 import socket
 4 
 5 def socket_udp_server():
 6     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #SOCK_DGRAM 參數指定 socket 的類型是 udp
 7     host = socket.gethostname()
 8     port = 9999
 9 
10     #綁定端口
11     s.bind((host, port))
12 
13     #不需要調用 listen 方法,直接接收來自任何客戶端的數據
14 
15     while True:
16         #接收數據
17         data, addr = s.recvfrom(1024)
18         #recvfrom 方法返回數據和客戶端的地址與端口。這樣,服務器收到數據後,直接調用 sendto 就可以把數據用 udp 發送給客戶端
19         print(received from %s: %s. % addr)
20         s.sendto(bhello, %s % data, addr)
21 
22 
23 def main():
24     socket_udp_server()
25 
26 
27 if __name__ == __main__:
28     main()
View Code

簡單的 socket 代碼