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



*
*
* 实现思路: <https://blog.csdn.net/a19990412/article/details/79434194#实现思路>
* 技术概念 <https://blog.csdn.net/a19990412/article/details/79434194#技术概念>
* 使用方法 <https://blog.csdn.net/a19990412/article/details/79434194#使用方法>
* 测试结果 <https://blog.csdn.net/a19990412/article/details/79434194#测试结果>
* 代码 <https://blog.csdn.net/a19990412/article/details/79434194#代码>


实现思路:

通过一台有公网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()
最后,老套路,宣传一波自己的公众号!(求关注哇!)
本人中大一肥宅,欢迎大家关注,请扫下面的二维码(〃’▽’〃)





如果觉得有帮助的话,可以扫码,赞赏鼓励一下!谢谢!