簡單的 socket 代碼
阿新 • • 發佈:2018-06-17
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 #View Code接受歡迎消息 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(b‘exit‘) 23 s.close() 24 25 def main(): 26 socket_client() 27 28 if __name__ == ‘__main__‘: 29 main()
註意:若服務器需要同時響應多個客戶端請求,每個連接都需要一個新進程或新線程處理,否則服務器一次只能服務一個客戶端
服務端代碼
將從客戶端接收到的字符前面加上 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)View Code9 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()
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(b‘hello, %s‘ % data, addr) 21 22 23 def main(): 24 socket_udp_server() 25 26 27 if __name__ == ‘__main__‘: 28 main()View Code
簡單的 socket 代碼