import socket # 1.建立流式套接字實例 # server = socket.socket() server = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) # 2.使用bind方法綁定端口號。服務端綁定的ip和port(參數是元組) server.bind(("127.0.0.1", 8832)) # 3.調用listen方法監聽,並指定最大的鏈接數量。設置監聽套接字,建立監聽隊列 server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 設置端口重用 server.listen(5) # 4.等待客戶端連接 while True: print("正在等待客戶端連接...") conn, addr = server.accept() print("client connent...{0}:{1}".format(addr[0], addr[1])) # python3.x以上,網絡數據的發送接收都是byte類型,若是發送的數據是str類型的則須要進行編碼. conn.send(("鏈接成功,服務端端口:%s,客戶端端口:%s" % (8832, addr[1])).encode()) # 5.收發消息 while True: data = conn.recv(1024) # 接收客戶端發來的消息 # if not data or data.decode("utf-8") == "exit": if not data or data == b"exit": break print(data.decode()) conn.send(("服務端返回信息:%s" % data.decode()).encode()) # 處理客戶端數據 conn.close() # 主動關閉鏈接 # 6.關閉套接字 server.close()
知識點1:設置端口重用:server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)。python
知識點2:conn, addr = server.accept()的返回值是一個元組:返回的conn表明一個新的套接字用來和客戶端通訊。返回的addr是鏈接的客戶端的地址(也是元組,包含ip與端口)。python3.x
知識點3:發送send()函數,與接收recv()函數,操做的都是字節串。recv()函數是阻塞函數。服務器
知識點4:Socket()函數的參數有三個:網絡
import socket # 1.socket實例初始化 # client = socket.socket() client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2.發起鏈接:根據服務端綁定的ip和端口,進行鏈接訪問服務端 client.connect(("127.0.0.1", 8832)) # 3.與服務端交互,接收發送信息 while True: data = client.recv(1024) # 接收主機信息 print(data.decode()) # 打印接收的數據,此處的byte類型數據特指python3.x以上 msg = input("請輸入要發送的信息...") client.send(msg.encode()) if not msg or msg == "exit": break # 4.關閉套接字 client.close()
1.服務端與客戶端能夠一直通訊,收發消息。直到客戶端輸入"exit",客戶端退出,服務端等待下一個客戶端鏈接。socket
2.當第一個客戶端與服務端一直連着的時候,第二個客戶端沒法與服務器鏈接。直到第一個客戶端退出與服務器的鏈接,第二個客戶端才能與服務器鏈接。tcp
3.當第一個客戶端退出時,服務器會立馬鏈接第二個客戶端。第二個客戶端以前發的信息,服務器就會收到,並返回信息。可能第二個發送端發的信息都在發送緩衝區裏。函數
參考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017788916649408編碼