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
-------------====================分割线====================-------------
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!