一、 伺服器server的寫法: 1. 創建 socket 套接字:網路編程介面 socket(family = AF_INET , type = SOCKET_STREM,proto = 0, fileno = None) 提供了多種socket family。AF_INET 是預設的family ...
一、 伺服器server的寫法:
1. 創建 socket 套接字:網路編程介面 socket(family = AF_INET , type = SOCKET_STREM,proto = 0, fileno = None) 提供了多種socket family。AF_INET 是預設的family,需要綁定IP和埠。 127.0.0.1是一個特殊的IP地址,表示本機地址。如果綁定到這個地址,客戶端必須同時在本機運行才能連接,也就是說,外部的電腦無法連接進來。
不同的協議family使用的地址形式不同,通常來說我們使用的是AF_INET-----地址是以(IP,PORT)形式存。在type 類型,我們常用的有兩種 SOCKET_STREM ,流式套接字,表示基於連接的TCP套接字,SOCKET_DGRAM, 數據報套接字,基於無連接的(UDP)介面。 如果不設定,預設就是 SOCKET_STREM 。
2. bind 綁定 使用方法:socket.bind(address) 把套接字綁定在 address 上,address的形式 根據 family 來設定。不管是client還是server,創建socket的時候都是通過一個本地的文件來進行的。
3. listen 監聽 使用方法:socket.listen([backlog]) 使能 socket 接收連接請求,listen(self,backlog = None) ,backlog需要大於0,指定了可以緩存的連接請求的數量。
4. accept 接受請求連接 在等待一個即將來臨的連接,會返回一個代表連接的新的socket,還會返回一個地址(host和port),可以用兩個東西接收,前一個代表新的socket,後一個就是接收地址。
寫的方法:connet_socket,client_addr = srv.accept() connet_socket就是新的socket,然後connet_socket開始接下來的傳輸。connet_socket,client_addr,前者表示接收的新的socket,後者就是地址,具體看程式第10行。
5. 接收數據 使用方法:socket.recv(bufsize[,flags]) 從 socket 中接收數據,返回的是 bytes ,是接收到的內容。bufsize指定了一次最多接收多少個數據,如果沒有數據接收,程式會阻塞,一直到有數據或者遠程終端斷開連接.
6. 發送數據 使用方法:socket.send(bytes[, flags]) 你的socket必須和遠程的socket建立了聯繫,返回值是發送的數量,可以判斷你的數據是否發送完畢,如果沒有,繼續send餘下來的數據
1 import socket 2 hostname = '127.0.0.1' #設置主機名 3 port = 6666 #設置埠號 要確保這個埠號沒有被使用,可以在cmd裡面查看 4 addr = (hostname,port) 5 srv = socket.socket() #創建一個socket 6 srv.bind(addr) 7 srv.listen(5) 8 print("waitting connect") 9 while True: 10 connect_socket,client_addr = srv.accept() 11 print(client_addr) 12 recevent = connect_socket.recv(1024) 13 print(str(recevent,encoding='gbk')) 14 connect_socket.send.send(bytes("你好,數據傳輸完成,這裡是gaby-yan--server",encoding='gbk')) 15 connect_socket.close()
二、 客戶端client的寫法:
客戶端的寫法相對比較簡單,只有1.創建socket 2. 建立連接 connect 3. 發送 send 4. 接收recv
這是由於他們的傳遞編程框架不同造成的,如圖。
1 import socket 2 hostname = '127.0.0.1' 3 port = 7777 4 addr = (hostname,port) 5 6 clientsock = socket.socket() ## 創建一個socket 7 clientsock.connect(addr) # 建立連接 8 9 say = input("輸入你想傳送的消息:") 10 clientsock.send(bytes(say,encoding='gbk')) #發送消息 11 recvdata = clientsock.recv(1024) #接收消息 recvdata 是bytes形式的 12 print(str(recvdata,encoding='gbk')) # 我們看不懂bytes,所以轉化為 str 13 clientsock.close()
註意:先運行server的代碼,再運行client的代碼。