美文网首页计算机技术杂类一起玩python程序员
TCP实现在不同局域网下的两台电脑网络通信(Python实现)

TCP实现在不同局域网下的两台电脑网络通信(Python实现)

作者: 肥宅_Sean | 来源:发表于2018-03-05 21:24 被阅读235次

    文章转自我的CSDN博客链接在这TCP实现在不同局域网下的两台电脑网络通信(Python实现)

    之前,我曾做过在局域网下进行通信的东西。(主要是我发现没有办法把那个东西用在不同的局域网的两台电脑)。心里一直想实现一个能在广域网上能通信的东西!所以就有这个小项目!

    实现思路:

    通过一台有公网IP的服务器作为中转站。将局域网下的电脑转给这个中转的服务器,然后这个中转的服务器将收到的数据转给另外的一台电脑就好了。

    技术概念

    下面的技术都是为了实现全双工嘿嘿,而且也要保证传输的时候较为同步(网络IO)

    • 服务器多线程,接受的信息(分两个线程)
    • 客户端实现多线程,接受信息的同时多线程输入。

    使用方法

    • 在一个服务器(在公网上)运行服务端代码。(这里我用的是,我在阿里云租的服务器)
    • 两个人(我这里,只实现了两个人聊天的情况),分别在自己的电脑上运行起客户端代码(或者编译好的客户端程序(.exe格式))。
    • 然后,直接就可以开始聊天了~
    • 可以在任何时候输入信息,敲回车就可以发出去了。
    • 输入空的信息就可以结束了,也就敲一个回车就好了。(如果一方结束了,但是另外一方没结束就是发了,对方也收不到~ 类比于离线状态发信息

    测试结果

    下面是一个受到一个远端的信息情况和发一个信息的情况。其实这是一个全双工聊天工具,只不过我这个演示有点不好,没展示出来 hhh 而且这些都是手工build-wheel型hh很适合学习~ 哈哈哈

    [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 = '服务器的公网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()
    
    

    服务端代码~(运行在一个服务器上)

    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()
    
    

    相关文章

      网友评论

        本文标题:TCP实现在不同局域网下的两台电脑网络通信(Python实现)

        本文链接:https://www.haomeiwen.com/subject/ncrkfftx.html