|
|
|
@ -1,12 +1,11 @@
|
|
|
|
|
import hashlib
|
|
|
|
|
import ipaddress
|
|
|
|
|
import json
|
|
|
|
|
import selectors
|
|
|
|
|
import socket
|
|
|
|
|
import threading
|
|
|
|
|
from time import sleep
|
|
|
|
|
from entity.Letter import Letter,json_to_obj
|
|
|
|
|
import select
|
|
|
|
|
|
|
|
|
|
import sender
|
|
|
|
|
from entity.Letter import Letter, json_to_obj
|
|
|
|
|
from recv import recv
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -26,16 +25,17 @@ from recv import recv
|
|
|
|
|
# pass
|
|
|
|
|
|
|
|
|
|
class sender_net():
|
|
|
|
|
def __init__(self,port=8424,client_host='127.0.0.1',client_port=8424):
|
|
|
|
|
def __init__(self, port=8424, client_host='127.0.0.1', client_port=8424):
|
|
|
|
|
self.client_host = client_host
|
|
|
|
|
self.client_port = client_port
|
|
|
|
|
self.letter = Letter()
|
|
|
|
|
self.port=port
|
|
|
|
|
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
|
|
self.server.bind(('0.0.0.0', self.port))
|
|
|
|
|
self.port = port
|
|
|
|
|
self.server = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
|
|
|
|
|
# 设置socket选项以允许IPv4映射到IPv6
|
|
|
|
|
self.server.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
|
|
|
|
|
self.server.bind(('::', self.port))
|
|
|
|
|
self.server.listen(10)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def recver_thread(self):
|
|
|
|
|
while True:
|
|
|
|
|
conn, addr = self.server.accept()
|
|
|
|
@ -66,7 +66,6 @@ class sender_net():
|
|
|
|
|
except ValueError:
|
|
|
|
|
print("[x] Error, please enter a valid number.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def send_data(self, conn, msg):
|
|
|
|
|
conn.sendall(msg)
|
|
|
|
|
|
|
|
|
@ -90,25 +89,30 @@ class sender_net():
|
|
|
|
|
letter: Letter = json_to_obj(data)
|
|
|
|
|
recv.handleLetter(letter)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
|
threading.Thread(target=self.main).start()
|
|
|
|
|
a = threading.Thread(target=self.main)
|
|
|
|
|
a.start()
|
|
|
|
|
a.join()
|
|
|
|
|
|
|
|
|
|
def main(self):
|
|
|
|
|
while True:
|
|
|
|
|
try:
|
|
|
|
|
client = socket.socket() # 定义协议类型,相当于生命socket类型,同时生成socket连接对象
|
|
|
|
|
client.connect((self.client_host, self.client_port))
|
|
|
|
|
client = socket.create_connection(
|
|
|
|
|
(self.client_host, self.client_port)) # 定义协议类型,相当于生命socket类型,同时生成socket连接对象
|
|
|
|
|
print(" [*] Connected...")
|
|
|
|
|
print("[*] if you want to send data, enter 0, if you want to send file, enter 1.")
|
|
|
|
|
sleep(1)
|
|
|
|
|
break
|
|
|
|
|
except socket.error:
|
|
|
|
|
except socket.error as e:
|
|
|
|
|
print(e)
|
|
|
|
|
print("[*] Waiting for ...")
|
|
|
|
|
#加入线程
|
|
|
|
|
threading.Thread(target=self.recver_thread, ).start()
|
|
|
|
|
threading.Thread(target=self.send_thread, args=(client,)).start()
|
|
|
|
|
|
|
|
|
|
# 加入线程
|
|
|
|
|
a = threading.Thread(target=self.recver_thread, )
|
|
|
|
|
b = threading.Thread(target=self.send_thread, args=(client,))
|
|
|
|
|
a.start()
|
|
|
|
|
b.start()
|
|
|
|
|
a.join()
|
|
|
|
|
b.join()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def input_verify():
|
|
|
|
@ -121,22 +125,35 @@ def input_verify():
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
addr = input("[*] Enter the address to connect to(127.0.0.1:8424): ")
|
|
|
|
|
# 检查输入是否包含冒号
|
|
|
|
|
if ':' in addr:
|
|
|
|
|
client_host, client_port = addr.split(":")
|
|
|
|
|
if client_host and client_port.isdigit():
|
|
|
|
|
try:
|
|
|
|
|
# 分割地址和端口
|
|
|
|
|
client_host, client_port = addr.rsplit(':', 1)
|
|
|
|
|
# 验证端口是否为数字
|
|
|
|
|
if client_port.isdigit():
|
|
|
|
|
client_port = int(client_port)
|
|
|
|
|
if 0 <= client_port <= 65535: # 检查端口范围
|
|
|
|
|
# 检查端口范围
|
|
|
|
|
if 0 <= client_port <= 65535:
|
|
|
|
|
# 尝试解析IP地址
|
|
|
|
|
try:
|
|
|
|
|
# 使用ipaddress模块来检查地址的有效性
|
|
|
|
|
ipaddress.ip_address(client_host)
|
|
|
|
|
break # 输入有效,跳出循环
|
|
|
|
|
except ValueError:
|
|
|
|
|
print("Invalid IP address format.")
|
|
|
|
|
else:
|
|
|
|
|
print("Port must be between 0 and 65535.")
|
|
|
|
|
else:
|
|
|
|
|
print("Port number is not a valid integer.")
|
|
|
|
|
except ValueError:
|
|
|
|
|
print("Invalid address format. Please enter in the format 'host:port'.")
|
|
|
|
|
else:
|
|
|
|
|
print("Invalid address format. Please enter in the format 'host:port'.")
|
|
|
|
|
return port, client_host, client_port
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#test
|
|
|
|
|
# test
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
port, client_host, client_port = input_verify()
|
|
|
|
|
a = sender_net(port, client_host, client_port)
|
|
|
|
|