Before, I have done the communication under the LAN. I found that I couldn't use the two computers on different LAN. I always want to realize something that can communicate in Wan! So there's this little project!
Through a server with public IP as a transit station. Transfer the computer under the LAN to the transfer server, and then the transfer server will transfer the received data to another computer.
The following technologies are all for full duplex, and they also need to be more synchronous during transmission (network IO)
- Server multithreaded, information received (divided into two threads)
- The client realizes multithreading, receiving information and multithreading input at the same time.
Run the server code on a server (on the public network). (what I use here is the server I rent in Alibaba cloud.)
Two people (in my case, only two people chat) run client code (or compiled client program (. exe format)) on their own computers.
Then, you can start chatting directly~
Enter a blank message to finish. (if one party ends, but the other party doesn't end, the other party can't receive ~ similar to sending information offline (although I don't set cache here...))
The following is a case of receiving a remote information and sending a message. In fact, this is a full duplex chat tool, but I'm not good at this demonstration. I didn't show hhh, and these are hand built wheel HHS, which are very suitable for learning
[Sat Mar 3 23:52:23 2018] : Hello
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 = 'Public network of server IP address' 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()
Server code ~ (running on a server)
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, Users, 1024)) trans1.start() while True: try: data = Users.recv(1024) except OSError: break if not data: Users.close() else: try: Users.send(data) except OSError: Users.close() break tcp.close()