TCP實現(xiàn)在不同局域網(wǎng)下的兩臺電腦網(wǎng)絡(luò)通信(Python實現(xiàn))

文章轉(zhuǎn)自我的CSDN博客鏈接在這TCP實現(xiàn)在不同局域網(wǎng)下的兩臺電腦網(wǎng)絡(luò)通信(Python實現(xiàn))

之前,我曾做過在局域網(wǎng)下進行通信的東西。(主要是我發(fā)現(xiàn)沒有辦法把那個東西用在不同的局域網(wǎng)的兩臺電腦)。心里一直想實現(xiàn)一個能在廣域網(wǎng)上能通信的東西!所以就有這個小項目!

實現(xiàn)思路:

通過一臺有公網(wǎng)IP的服務(wù)器作為中轉(zhuǎn)站。將局域網(wǎng)下的電腦轉(zhuǎn)給這個中轉(zhuǎn)的服務(wù)器,然后這個中轉(zhuǎn)的服務(wù)器將收到的數(shù)據(jù)轉(zhuǎn)給另外的一臺電腦就好了。

技術(shù)概念

下面的技術(shù)都是為了實現(xiàn)全雙工嘿嘿,而且也要保證傳輸?shù)臅r候較為同步(網(wǎng)絡(luò)IO)

  • 服務(wù)器多線程,接受的信息(分兩個線程)
  • 客戶端實現(xiàn)多線程,接受信息的同時多線程輸入。

使用方法

  • 在一個服務(wù)器(在公網(wǎng)上)運行服務(wù)端代碼。(這里我用的是,我在阿里云租的服務(wù)器)
  • 兩個人(我這里,只實現(xiàn)了兩個人聊天的情況),分別在自己的電腦上運行起客戶端代碼(或者編譯好的客戶端程序(.exe格式))。
  • 然后,直接就可以開始聊天了~
  • 可以在任何時候輸入信息,敲回車就可以發(fā)出去了。
  • 輸入空的信息就可以結(jié)束了,也就敲一個回車就好了。(如果一方結(jié)束了,但是另外一方?jīng)]結(jié)束就是發(fā)了,對方也收不到~ 類比于離線狀態(tài)發(fā)信息

測試結(jié)果

下面是一個受到一個遠端的信息情況和發(fā)一個信息的情況。其實這是一個全雙工聊天工具,只不過我這個演示有點不好,沒展示出來 hhh 而且這些都是手工build-wheel型hh很適合學(xué)習(xí)~ 哈哈哈

[Sat Mar 3 23:52:23 2018] : Hello
what?

代碼

客戶端代碼:

from socket import *
import threading
from time import ctime


def recv(sock, BUFSIZ):
    try:
        data = sock.recv(BUFSIZ)
    except OSError:
        return  # find it was close, then close it
    if data.decode() is '[CHAT]BEGIN':
        print(data.decode())
    elif data.decode() is '[CHAT]END':
        sock.close()
    else:
        print('[%s]' % ctime(), ':', data.decode())


if __name__ == '__main__':
    HOST = '服務(wù)器的公網(wǎng)IP地址'
    POST = 21567
    ADDR = (HOST, POST)
    tcpCli = socket(AF_INET, SOCK_STREAM)

    tcpCli.connect(ADDR)

    threadrev = threading.Thread(target=recv, args=(tcpCli, 1024))
    threadrev.start()
    while True:
        data = input()
        if not data:
            break
        tcpCli.send(data.encode())
    tcpCli.close()

服務(wù)端代碼~(運行在一個服務(wù)器上)

from socket import *
import threading


def trans(sock1, sock2, BUFSIZ):
    while True:
        try:
            data = sock1.recv(BUFSIZ)
        except OSError:
            break
        if not data:
            sock1.close()
        else:
            try:
                sock2.send(data)
            except OSError:
                sock1.close()
                break


if __name__ == '__main__':
    HOST = ''
    POST = 21567
    ADDR = (HOST, POST)
    tcp = socket(AF_INET, SOCK_STREAM)
    tcp.bind(ADDR)
    tcp.listen(3)

    Users = []
    Addrs = []
    Trans = []
    while len(Users) != 2:
        tcpCli, addr = tcp.accept()
        Users.append(tcpCli)
    trans1 = threading.Thread(target=trans, args=(Users[0], Users[1], 1024))
    trans1.start()

    while True:
        try:
            data = Users[1].recv(1024)
        except OSError:
            break
        if not data:
            Users[1].close()
        else:
            try:
                Users[0].send(data)
            except OSError:
                Users[1].close()
                break
    tcp.close()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容