1.socket_service
| import socket |
| import threading |
| import struct |
| import os |
| |
| def socket_service(ipv4,port,stat): |
| |
| try: |
| s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
| |
| |
| |
| |
| s.bind((ipv4,port)) |
| |
| s.listen(10) |
| print("服务器Ipv4地址是127.0.0.1,服务器的端口是80") |
| except socket.error as msg: |
| print(msg) |
| os.sys.exit(1) |
| print('服务端已启动,等待客户端连接...') |
| |
| while True: |
| |
| conn, addr = s.accept() |
| |
| if str(stat) == 'send': |
| t = threading.Thread(target=deal_data_send_service, args=(conn,addr)) |
| elif str(stat) == 'receive': |
| t = threading.Thread(target=deal_data_receiver_service, args=(conn,addr)) |
| else: |
| print("warning:stat参数错误,服务端未能启动,请选择send 或者 receive") |
| break |
| t.start() |
| |
| |
| |
| def deal_data_receiver_service(conn, addr): |
| print('已连接地址为: {0}'.format(addr)) |
| |
| |
| conn.send('新消息:已成功连接'.encode('utf-8')) |
| while True: |
| |
| fileinfo_size = struct.calcsize('128sl') |
| |
| buf = conn.recv(fileinfo_size) |
| |
| if buf: |
| |
| filename, filesize = struct.unpack('128sl', buf) |
| fn = filename.strip(b'\00') |
| fn = fn.decode() |
| print('数据名为: {0}, 数据大小为: {1} bytes'.format(str(fn), filesize)) |
| |
| recvd_size = 0 |
| |
| fp = open('./receive/' + str(fn), 'wb') |
| print('开始接收客户端数据...'+'文件名:'+str(fn)) |
| |
| |
| while not recvd_size == filesize: |
| if filesize - recvd_size > 1024: |
| data = conn.recv(1024) |
| recvd_size += len(data) |
| else: |
| data = conn.recv(filesize - recvd_size) |
| recvd_size = filesize |
| fp.write(data) |
| fp.close() |
| print('数据接收完成...') |
| break |
| |
| |
| def deal_data_send_service(conn, addr): |
| print('已连接地址为: {0}'.format(addr)) |
| |
| |
| conn.send('新消息:已成功连接'.encode('utf-8')) |
| while True: |
| print('发送数据...') |
| fn = input('请输入文件名') |
| path = './send/' |
| file_path = os.path.join(path, str(fn)).replace('\\', '/') |
| fp = open(file_path, 'rb') |
| fhead = struct.pack('128sl', os.path.basename(file_path).encode('utf-8'), os.stat(file_path).st_size) |
| conn.send(fhead) |
| while True: |
| data = fp.read(1024) |
| if not data: |
| print('{0} 数据传输完成...'.format(os.path.basename(file_path))) |
| break |
| conn.send(data) |
| |
| |
| break |
| |
| |
| def deal_data_receiver_client(ipv4, port): |
| try: |
| s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| s.connect((ipv4, port)) |
| except socket.error as msg: |
| print(msg) |
| sys.exit(1) |
| print(s.recv(1024).decode()) |
| print('已连接地址为: {0}'.format(ipv4)) |
| |
| |
| |
| while True: |
| |
| fileinfo_size = struct.calcsize('128sl') |
| |
| buf = s.recv(fileinfo_size) |
| |
| if buf: |
| |
| filename, filesize = struct.unpack('128sl', buf) |
| fn = filename.strip(b'\00') |
| fn = fn.decode() |
| print('数据名为: {0}, 数据大小为: {1} bytes'.format(str(fn), filesize)) |
| |
| recvd_size = 0 |
| |
| fp = open('./receive/' + str(fn), 'wb') |
| print('开始接收客户端数据...'+'文件名:'+str(fn)) |
| |
| |
| while not recvd_size == filesize: |
| if filesize - recvd_size > 1024: |
| data = s.recv(1024) |
| recvd_size += len(data) |
| else: |
| data = s.recv(filesize - recvd_size) |
| recvd_size = filesize |
| fp.write(data) |
| fp.close() |
| print('数据接收完成...') |
| break |
| |
| |
| def deal_data_send_client(ipv4, port): |
| try: |
| s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| s.connect((ipv4, port)) |
| except socket.error as msg: |
| print(msg) |
| sys.exit(1) |
| print(s.recv(1024).decode()) |
| print('已连接地址为: {0}'.format(ipv4)) |
| |
| |
| print('发送数据...') |
| while True: |
| fn = input('文件名') |
| path = './send/' |
| file_path = os.path.join(path, str(fn)).replace('\\', '/') |
| fp = open(file_path, 'rb') |
| fhead = struct.pack('128sl', os.path.basename(file_path).encode('utf-8'), os.stat(file_path).st_size) |
| s.send(fhead) |
| while True: |
| data = fp.read(1024) |
| if not data: |
| print('{0} 数据传输完成...'.format(os.path.basename(file_path))) |
| break |
| s.send(data) |
| |
| |
| break |
| |
| |
| def file_manager(): |
| if os.path.exists('./receive//'): |
| pass |
| else: |
| os.makedirs('./receive//') |
| if os.path.exists('./send//'): |
| pass |
| else: |
| os.makedirs('./send//') |
| |
| |
| import socket |
| import os |
| import sys |
| import struct |
| |
| def socket_client(ipv4,port,stat): |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| if str(stat) == 'send': |
| deal_data_send_client(ipv4,port) |
| elif str(stat) == 'receive': |
| deal_data_receiver_client(ipv4,port) |
| else: |
| print("warning:stat参数错误,服务端未能启动,请选择send 或者 receive") |
| |
| |
| def port_To_port(): |
| os.system('python ./Natter-master/natter.py -c ./Natter-master/natter-config.templete.json') |
| """ |
| // 注意:JSON 配置文件不支持代码注释,此处为说明配置用途。 |
| { |
| "logging": { |
| "level": "info", // 日志等级:可选值:"debug"、"info"、"warning"、"error" |
| "log_file": "./natter.log" // 将日志输出到指定文件,不需要请留空:"" |
| }, |
| "status_report": { |
| // 当外部IP/端口发生改变时,会执行下方命令。 |
| // 大括号 {...} 为占位符,命令执行时会被实际值替换。 |
| // 不需要请留空:"" |
| "hook": "bash ./natter-hook.sh '{protocol}' '{inner_ip}' '{inner_port}' '{outer_ip}' '{outer_port}'", |
| "status_file": "./natter-status.json" // 将实时端口映射状态储存至指定文件,不需要请留空:"" |
| }, |
| "open_port": { |
| // 此处设置 Natter 打洞IP:端口。(仅打洞) |
| // 此处地址为 Natter 绑定(监听)的地址,Natter 仅对这些地址打洞,您需要手动设置端口转发。 |
| // 注意:使用默认出口IP,请使用 0.0.0.0 ,而不是 127.0.0.1 。 |
| "tcp": [ |
| "0.0.0.0:3456", |
| "0.0.0.0:3457" |
| ], |
| "udp": [ |
| "0.0.0.0:3456", |
| "0.0.0.0:3457" |
| ] |
| }, |
| "forward_port": { |
| // 此处设置需要 Natter 开放至公网的 IP:端口。(打洞 + 内置转发) |
| // Natter 会全自动打洞、转发,您无需做任何干预。 |
| // 注意:使用本机IP,请使用 127.0.0.1,而不是 0.0.0.0 。 |
| "tcp": [ |
| "127.0.0.1:80", |
| "192.168.1.100:443" |
| ], |
| "udp": [ |
| "127.0.0.1:53", |
| "192.168.1.100:51820" |
| ] |
| }, |
| "stun_server": { |
| // 此处设置公共 STUN 服务器。 |
| // TCP 服务器请确保 TCP/3478 端口开放可用; |
| // UDP 服务器请确保 UDP/3478 端口开放可用。 |
| "tcp": [ |
| "stun.stunprotocol.org", |
| "stun.voip.blackberry.com" |
| ], |
| "udp": [ |
| "stun.miwifi.com", |
| "stun.qq.com" |
| ] |
| }, |
| "keep_alive": "www.qq.com" // 此处设置 HTTP Keep-Alive 服务器。请确保该服务器 80 端口开放,且支持 HTTP Keep-Alive。 |
| } |
| http://www.hackdig.com/03/hack-951107.htm |
| """ |
| |
| |
| |
| |
| |
| if __name__ == '__main__': |
| file_manager() |
| |
| ipv4 = input('ipv4:127.0.0.1') |
| port = input('port:80') |
| try: |
| socket_service(ipv4=ipv4,port=int(port),stat='send') |
| |
| except: |
| pass |
输出结果:
ipv4:127.0.0.1192.168.1.100
port:8080
服务器Ipv4地址是127.0.0.1,服务器的端口是80
服务端已启动,等待客户端连接…
已连接地址为: (‘192.168.1.103’, 49907)
发送数据…
请输入文件名爬虫数据.rar
爬虫数据.rar 数据传输完成…
2 socket_client
| import socket |
| import threading |
| import struct |
| import os |
| |
| def socket_service(ipv4,port,stat): |
| |
| try: |
| s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
| |
| |
| |
| |
| s.bind((ipv4,port)) |
| |
| s.listen(10) |
| print("服务器Ipv4地址是127.0.0.1,服务器的端口是80") |
| except socket.error as msg: |
| print(msg) |
| os.sys.exit(1) |
| print('服务端已启动,等待客户端连接...') |
| |
| while True: |
| |
| conn, addr = s.accept() |
| |
| if str(stat) == 'send': |
| t = threading.Thread(target=deal_data_send_service, args=(conn,addr)) |
| elif str(stat) == 'receive': |
| t = threading.Thread(target=deal_data_receiver_service, args=(conn,addr)) |
| else: |
| print("warning:stat参数错误,服务端未能启动,请选择send 或者 receive") |
| break |
| t.start() |
| |
| |
| |
| def deal_data_receiver_service(conn, addr): |
| print('已连接地址为: {0}'.format(addr)) |
| |
| |
| conn.send('新消息:已成功连接'.encode('utf-8')) |
| while True: |
| |
| fileinfo_size = struct.calcsize('128sl') |
| |
| buf = conn.recv(fileinfo_size) |
| |
| if buf: |
| |
| filename, filesize = struct.unpack('128sl', buf) |
| fn = filename.strip(b'\00') |
| fn = fn.decode() |
| print('数据名为: {0}, 数据大小为: {1} bytes'.format(str(fn), filesize)) |
| |
| recvd_size = 0 |
| |
| fp = open('./receive/' + str(fn), 'wb') |
| print('开始接收客户端数据...'+'文件名:'+str(fn)) |
| |
| |
| while not recvd_size == filesize: |
| if filesize - recvd_size > 1024: |
| data = conn.recv(1024) |
| recvd_size += len(data) |
| else: |
| data = conn.recv(filesize - recvd_size) |
| recvd_size = filesize |
| fp.write(data) |
| fp.close() |
| print('数据接收完成...') |
| break |
| |
| |
| def deal_data_send_service(conn, addr): |
| print('已连接地址为: {0}'.format(addr)) |
| |
| |
| conn.send('新消息:已成功连接'.encode('utf-8')) |
| while True: |
| print('发送数据...') |
| fn = input('请输入文件名') |
| path = './send/' |
| file_path = os.path.join(path, str(fn)).replace('\\', '/') |
| fp = open(file_path, 'rb') |
| fhead = struct.pack('128sl', os.path.basename(file_path).encode('utf-8'), os.stat(file_path).st_size) |
| conn.send(fhead) |
| while True: |
| data = fp.read(1024) |
| if not data: |
| print('{0} 数据传输完成...'.format(os.path.basename(file_path))) |
| break |
| conn.send(data) |
| |
| |
| break |
| |
| |
| def deal_data_receiver_client(ipv4, port): |
| try: |
| s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| s.connect((ipv4, port)) |
| except socket.error as msg: |
| print(msg) |
| sys.exit(1) |
| print(s.recv(1024).decode()) |
| print('已连接地址为: {0}'.format(ipv4)) |
| |
| |
| |
| while True: |
| |
| fileinfo_size = struct.calcsize('128sl') |
| |
| buf = s.recv(fileinfo_size) |
| |
| if buf: |
| |
| filename, filesize = struct.unpack('128sl', buf) |
| fn = filename.strip(b'\00') |
| fn = fn.decode() |
| print('数据名为: {0}, 数据大小为: {1} bytes'.format(str(fn), filesize)) |
| |
| recvd_size = 0 |
| |
| fp = open('./receive/' + str(fn), 'wb') |
| print('开始接收客户端数据...'+'文件名:'+str(fn)) |
| |
| |
| while not recvd_size == filesize: |
| if filesize - recvd_size > 1024: |
| data = s.recv(1024) |
| recvd_size += len(data) |
| else: |
| data = s.recv(filesize - recvd_size) |
| recvd_size = filesize |
| fp.write(data) |
| fp.close() |
| print('数据接收完成...') |
| break |
| |
| |
| def deal_data_send_client(ipv4, port): |
| try: |
| s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| s.connect((ipv4, port)) |
| except socket.error as msg: |
| print(msg) |
| sys.exit(1) |
| print(s.recv(1024).decode()) |
| print('已连接地址为: {0}'.format(ipv4)) |
| |
| |
| print('发送数据...') |
| while True: |
| fn = input('文件名') |
| path = './send/' |
| file_path = os.path.join(path, str(fn)).replace('\\', '/') |
| fp = open(file_path, 'rb') |
| fhead = struct.pack('128sl', os.path.basename(file_path).encode('utf-8'), os.stat(file_path).st_size) |
| s.send(fhead) |
| while True: |
| data = fp.read(1024) |
| if not data: |
| print('{0} 数据传输完成...'.format(os.path.basename(file_path))) |
| break |
| s.send(data) |
| |
| |
| break |
| |
| |
| def file_manager(): |
| if os.path.exists('./receive//'): |
| pass |
| else: |
| os.makedirs('./receive//') |
| if os.path.exists('./send//'): |
| pass |
| else: |
| os.makedirs('./send//') |
| |
| |
| import socket |
| import os |
| import sys |
| import struct |
| |
| def socket_client(ipv4,port,stat): |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| if str(stat) == 'send': |
| deal_data_send_client(ipv4,port) |
| elif str(stat) == 'receive': |
| deal_data_receiver_client(ipv4,port) |
| else: |
| print("warning:stat参数错误,服务端未能启动,请选择send 或者 receive") |
| |
| |
| def port_To_port(): |
| os.system('python ./Natter-master/natter.py -c ./Natter-master/natter-config.templete.json') |
| """ |
| // 注意:JSON 配置文件不支持代码注释,此处为说明配置用途。 |
| { |
| "logging": { |
| "level": "info", // 日志等级:可选值:"debug"、"info"、"warning"、"error" |
| "log_file": "./natter.log" // 将日志输出到指定文件,不需要请留空:"" |
| }, |
| "status_report": { |
| // 当外部IP/端口发生改变时,会执行下方命令。 |
| // 大括号 {...} 为占位符,命令执行时会被实际值替换。 |
| // 不需要请留空:"" |
| "hook": "bash ./natter-hook.sh '{protocol}' '{inner_ip}' '{inner_port}' '{outer_ip}' '{outer_port}'", |
| "status_file": "./natter-status.json" // 将实时端口映射状态储存至指定文件,不需要请留空:"" |
| }, |
| "open_port": { |
| // 此处设置 Natter 打洞IP:端口。(仅打洞) |
| // 此处地址为 Natter 绑定(监听)的地址,Natter 仅对这些地址打洞,您需要手动设置端口转发。 |
| // 注意:使用默认出口IP,请使用 0.0.0.0 ,而不是 127.0.0.1 。 |
| "tcp": [ |
| "0.0.0.0:3456", |
| "0.0.0.0:3457" |
| ], |
| "udp": [ |
| "0.0.0.0:3456", |
| "0.0.0.0:3457" |
| ] |
| }, |
| "forward_port": { |
| // 此处设置需要 Natter 开放至公网的 IP:端口。(打洞 + 内置转发) |
| // Natter 会全自动打洞、转发,您无需做任何干预。 |
| // 注意:使用本机IP,请使用 127.0.0.1,而不是 0.0.0.0 。 |
| "tcp": [ |
| "127.0.0.1:80", |
| "192.168.1.100:443" |
| ], |
| "udp": [ |
| "127.0.0.1:53", |
| "192.168.1.100:51820" |
| ] |
| }, |
| "stun_server": { |
| // 此处设置公共 STUN 服务器。 |
| // TCP 服务器请确保 TCP/3478 端口开放可用; |
| // UDP 服务器请确保 UDP/3478 端口开放可用。 |
| "tcp": [ |
| "stun.stunprotocol.org", |
| "stun.voip.blackberry.com" |
| ], |
| "udp": [ |
| "stun.miwifi.com", |
| "stun.qq.com" |
| ] |
| }, |
| "keep_alive": "www.qq.com" // 此处设置 HTTP Keep-Alive 服务器。请确保该服务器 80 端口开放,且支持 HTTP Keep-Alive。 |
| } |
| http://www.hackdig.com/03/hack-951107.htm |
| """ |
| |
| |
| |
| |
| |
| if __name__ == '__main__': |
| file_manager() |
| |
| ipv4 = input('ipv4:127.0.0.1') |
| port = input('port:80') |
| try: |
| socket_client(ipv4=ipv4,port=int(port),stat='receive') |
| except: |
| pass |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2022-06-29 DID的使用指南,原理