TCP綁定雙端口傳輸數據


參考:https://blog.csdn.net/weixin_33721344/article/details/89663010

1.環境

windows10
python3.6
網絡調試助手工具NetAssist
在這裏插入圖片描述

2.服務端代碼

# -*- coding: utf-8 -*-
"""
@desc: tcp兩個端口轉發,從一個端口發數據,可以從另一個端口接數據
"""
import socket
import threading
import signal
import sys

REMOTE_IP = ''#不綁定IP,遠程電腦可以訪問該機器
LOCAL_IP = ''
REMOTE_PORT = 10002
LOCAL_PORT = 10001
# 接收數據緩存大小
PKT_BUFF_SIZE = 4096

# 調試日誌封裝
def send_log(content):
    print (content)
    return

# 單向流數據傳遞
def tcp_mapping_worker(conn_receiver, conn_sender):
    while True:
        try:
            data = conn_receiver.recv(PKT_BUFF_SIZE)
        except Exception:#當與服務socket斷開連接時
            send_log('Event: Connection closed.')
            break
 
        if not data:
            send_log('Info: No more data is received.')
            break
     
        try:
            conn_sender.sendall(data)
        except Exception:
            send_log('Error: Failed sending data.')
            break
     
        # send_log('Info: Mapping data > %s ' % repr(data))
        send_log('Info: Mapping > %s -> %s > %d bytes.' % (conn_receiver.getpeername(), conn_sender.getpeername(), len(data)))
 
    conn_receiver.close()
    conn_sender.close()
    return

def main():
    local_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    remote_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    send_log("1.套接字創建完畢.") 

    local_server.bind((LOCAL_IP,LOCAL_PORT))
    remote_server.bind((REMOTE_IP,REMOTE_PORT))
    send_log("2.端口綁定完畢.")
    
    #監聽端口,最大連接數量128
    local_server.listen(128)
    remote_server.listen(128)
    send_log("3.監聽兩端端口.")

    while True: 
        # 接收到新的客戶端連接則創建服務套接字
        send_log("4.等待兩端客戶端連接 %s:%d %s:%d" %(LOCAL_IP,LOCAL_PORT,REMOTE_IP,REMOTE_PORT))
        (local_conn, local_addr) = local_server.accept()
        (remote_conn, remote_addr) = remote_server.accept()
        send_log("5.兩端客戶端連接端口成功.") 
        #LOCAL_PORT端口數據轉發給REMOTE_PORT端口
        thread1 = threading.Thread(target=tcp_mapping_worker, args=(local_conn, remote_conn))
        thread1.start()
        #REMOTE_PORT端口數據轉發給LOCAL_PORT端口
        thread2 = threading.Thread(target=tcp_mapping_worker, args=(remote_conn, local_conn))
        thread2.start()
        
        #join()作用爲主線程在所有子線程執行完之後才執行
        thread1.join()  
        thread2.join()    
    send_log("執行完成")
    
if __name__ == "__main__":
    main()

3.打開網絡調試工具

互相發送數據都可以。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章