這次就來講解一下用 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


