戳人痛处

导航

python初步实现socket服务端数据流转(1对1网络聊天室)

关键词:管道、多进程、socket、内网穿透

程序运行流程示意图:

 

 附code如下;

 1 import socket as sk
 2 import multiprocessing as mp
 3 import time as t
 4 
 5 
 6 def c_s_s(sock, addr,conn1,conn2): #client to sever_sockfile1 to sever_sockfile2 
 7     while True:
 8         conn2.close()
 9         readdata = sock.makefile().readline() #进程1读取客户端1发来的信息
10         if readdata != "":
11             print(readdata)
12             conn1.send(readdata) #发送至管道内
13         t.sleep(0.2) 
14             
15 def s_c(sock, addr,conn1,conn2): #sever_file2 to client
16     while True:
17         conn1.close()
18         recvdata = conn2.recv() #进程2读取管道信息
19         if recvdata != "":
20             print(recvdata)
21             sock.send(recvdata.encode()) #进程2发送信息至客户端2
22             #sock.send(b'1212\x0d')
23         t.sleep(0.2) 
24 def main():
25     while True:
26         conn1,conn2 = mp.Pipe() #创建管道
27         s = sk.socket(sk.AF_INET ,sk.SOCK_STREAM)
28         s.bind(('10.238.2.208',2333))
29         s.listen(5)
30         sock,addr = s.accept()
31         sock.send(b"hello-usr1")
32         t1 = mp.Process(target=c_s_s, args=(sock, addr,conn1,conn2))
33         t1.start()
34         t11 = mp.Process(target=s_c, args=(sock, addr,conn2,conn1))
35         t11.start()
36         #t1.join()
37         sock,addr = s.accept()
38         sock.send(b"hello-usr2")
39         t22 = mp.Process(target=c_s_s, args=(sock, addr,conn2,conn1))
40         t22.start()
41         t2 = mp.Process(target=s_c, args=(sock, addr,conn1,conn2))
42         t2.start()
43         #t2.join()
44 
45 if __name__ == '__main__':
46     main()
47         

函数C_S_S()功能示意图如下:

 

 函数S_C()功能示意图如下;

 

准备两个客户端

 

 

 运行服务程序后连接

客户端1:

 

 客户端2:

 

 互相通信:

 

 将服务端放入公网服务器,可实现类似内网穿透的功能~

 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

如下为优化版本1.1

 1 import socket as sk
 2 import multiprocessing as mp
 3 import time as t
 4 
 5 
 6 def c_s_s(sock, addr,conn1,conn2): #client to sever_sockfile1 to sever_sockfile2 
 7     while True:
 8         conn2.close()
 9         #readdata = sock.makefile().readline() #进程1读取客户端1发来的信息
10         readdata = sock.recv(1024)
11         print(readdata)
12         if readdata != "":
13             print(readdata)
14             conn1.send(readdata) #发送至管道内
15         #t.sleep(0.2) 
16             
17 def s_c(sock, addr,conn1,conn2): #sever_file2 to client
18     while True:
19         conn1.close()
20         recvdata = conn2.recv() #进程2读取管道信息
21         if recvdata != "":
22             print(recvdata)
23             sock.send(recvdata) #进程2发送信息至客户端2
24             #sock.send(b'1212\x0d')
25         #t.sleep(0.2) 
26 def main():
27     while True:
28         conn1,conn2 = mp.Pipe() #创建管道
29         s = sk.socket(sk.AF_INET ,sk.SOCK_STREAM)
30         s.bind(('10.238.2.208',2333))
31         s.listen(5)
32         sock,addr = s.accept()
33         sock.send(b"hello-usr1")
34         t1 = mp.Process(target=c_s_s, args=(sock, addr,conn1,conn2))
35         t1.start()
36         t11 = mp.Process(target=s_c, args=(sock, addr,conn2,conn1))
37         t11.start()
38         #t1.join()
39         sock,addr = s.accept()
40         sock.send(b"hello-usr2")
41         t22 = mp.Process(target=c_s_s, args=(sock, addr,conn2,conn1))
42         t22.start()
43         t2 = mp.Process(target=s_c, args=(sock, addr,conn1,conn2))
44         t2.start()
45         #t2.join()
46 
47 if __name__ == '__main__':
48     main()
49         

 优化版本1.2

进程断开自动杀进程;

 1 import socket as sk
 2 import multiprocessing as mp
 3 import time as t
 4 import os
 5 
 6 def c_s_s(sock, addr,conn1,conn2): #client to sever_sockfile1 to sever_sockfile2 
 7     while True:
 8         conn2.close()
 9         readdata = sock.recv(1024) #进程1读取客户端1发来的信息
10         if readdata:            #判断TCP是否断开和是否接收信息-----------
11             print(readdata)
12             conn1.send(readdata) #发送至管道内
13         else:                   #断开的处理部分-----------
14             conn1.send(b"212") #告知另一端已断开
15             sock.close()
16             os._exit(0)         #强制退出进程
17             break
18         t.sleep(0.2) 
19             
20 def s_c(sock, addr,conn1,conn2): #sever_file2 to client
21     while True:
22         conn1.close()
23         recvdata = conn2.recv() #进程2读取管道信息
24         if recvdata == b"212":  #另一端断开的处理部分--------------
25             print(recvdata)
26             sock.send(b"break") #告知另一端已断开
27             sock.close()
28             os._exit(0)         #强制退出进程
29             break
30         else:
31             sock.send(recvdata) #另一端未断开 进行信息转发
32             #sock.send(b'1212\x0d')
33         t.sleep(0.2) 
34 def main():
35     s = sk.socket(sk.AF_INET ,sk.SOCK_STREAM)
36     s.bind(('10.238.2.208',2333))
37     s.listen()
38     while True:
39         conn1,conn2 = mp.Pipe() #创建管道
40         sock,addr = s.accept()
41         sock.send(b"hello-usr1")
42         t1 = mp.Process(target=c_s_s, args=(sock, addr,conn1,conn2))
43         t1.start()
44         t11 = mp.Process(target=s_c, args=(sock, addr,conn2,conn1))
45         t11.start()
46         #t1.join()
47         sock,addr = s.accept()
48         sock.send(b"hello-usr2")
49         t22 = mp.Process(target=c_s_s, args=(sock, addr,conn2,conn1))
50         t22.start()
51         t2 = mp.Process(target=s_c, args=(sock, addr,conn1,conn2))
52         t2.start()
53         #t2.join()
54 
55 if __name__ == '__main__':
56     main()
57         

 

posted on 2021-01-05 10:04  戳人痛处  阅读(249)  评论(0编辑  收藏  举报