這次就來講解一下用 Python 來實作 TCP/IP 的通訊
程式碼不長, 說明全寫在註解中
Server Side Source Code
可以直接執行, 先執行 Server, 再執行 Client
程式碼不長, 說明全寫在註解中
Server Side Source Code
# -*- coding: utf-8 -*- import socket import threading HOST = '' # 設定 Server Port PORT = 50008 # 紀錄 Client 傳送資料的 Thread threads = [] # 紀錄 Client 連線資訊 socketConn = {} global s # Receive Data From Client def thread_socket_conn_recv(connObj, addrObj): while True: # 等待接收 Client 傳送的資料 data = connObj.recv(1024) if not data: break msg = addrObj[0] + ':' + data print msg # Send To All Client This Message for key in socketConn: socketConn[key].send(msg) # Receive Client Connection def thread_socket_conn_accept(socketObj): while True: # 等待接收 Client 連線需求 conn, addr = socketObj.accept() print "Connected ", addr # 透過 Thread 收接 Client 傳送資料 t = threading.Thread(target=thread_socket_conn_recv, args=(conn, addr)) t.start() threads.append (t) socketConn[addr] = conn # Send To All Client This New Client Connect Alert for key in socketConn: msg = 'Welcome ' + addr[0] socketConn[key].send(msg) def main(): global s # socket.socket 有二個參數 # 第一個參數定義 socket 是屬於 Internet 還是 local # 分別為 socket.AF_INET(預設), socket.AF_INET6 與 socket.AF_UNIX(本機) # 第二個參數定義資料流通常只用 socket.SOCK_STREAM 或 socket.SOCK_DGRAM s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 挷定 address 跟 port s.bind((HOST, PORT)) # 設定 socket 最大連線佇列(Queue)數, 數值上限是與系統主機有關, 通常為 5 s.listen(0) # 透過 Thread 收接 Client 連線需求 mainT = threading.Thread (target=thread_socket_conn_accept, args=(s,)) mainT.start() if __name__ == '__main__': main()Client Side Source Code
# -*- coding: utf-8 -*- import socket import threading # 設定 Server IP HOST = '127.0.0.1' # 設定 Server Port PORT = 50008 global s def thread_socket_conn_recv(connObj): while True: # 等待接收 Server 傳送的資料 data = connObj.recv(1024) if not data: break print data def main(): global s # socket.socket 有二個參數 # 第一個參數定義 socket 是屬於 Internet 還是 local # 分別為 socket.AF_INET(預設), socket.AF_INET6 與 socket.AF_UNIX(本機) # 第二個參數定義資料流通常只用 socket.SOCK_STREAM 或 socket.SOCK_DGRAM s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 向 Server 請求連線 s.connect((HOST, PORT)) # 透過 Thread 收接 Server 傳送資料 recvT = threading.Thread (target=thread_socket_conn_recv, args=(s,)) recvT.start() if __name__ == '__main__': main()
可以直接執行, 先執行 Server, 再執行 Client