社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
之前,我曾做过在局域网下进行通信的东西。(主要是我发现没有办法把那个东西用在不同的局域网
的两台电脑)。心里一直想实现一个能在广域网上能通信的东西!所以就有这个小项目!
通过一台有公网IP的服务器作为中转站。将局域网下的电脑转给这个中转的服务器,然后这个中转的服务器将收到的数据转给另外的一台电脑就好了。
下面的技术都是为了实现全双工嘿嘿,而且也要保证传输的时候较为同步(网络IO)
下面是一个受到一个远端的信息情况和发一个信息的情况。其实这是一个全双工聊天工具,只不过我这个演示有点不好,没展示出来 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()
最后,老套路,宣传一波自己的公众号!(求关注哇!)
本人中大一肥宅,欢迎大家关注,请扫下面的二维码(〃’▽’〃)
如果觉得有帮助的话,可以扫码,赞赏鼓励一下!谢谢!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!