nginx虽然高性能,但是配置麻烦
没有公网IP地址使得很多老游戏根本没办法进行联机,但是又不想买 腾讯云/阿里云/华为云,而且通过上面的nginx转发性能也有损耗。
直接从公网上访问IPv4:端口号不太现实,因为运营商的NAT
所以想到用 IPv4-IPv6-IPv4 即IPv6充当两个IPv4服务器的桥梁。
于是在AI的帮助下,写了一套IPv4-IPv6-IPv4的程序,这里的协议是TCP
这样就可以转发1.7.2这样老版本的minecraft服务器的流量了
#服务器需要修改端口号,将其修改为游戏服务器的端口号
import socket
import select
import threading
def handle_client(client_socket):
print("正在连接")
try:
# 连接到目标服务器
with socket.create_connection((TARGET_HOST, TARGET_PORT)) as target_socket:
# 使用 select 来监听两个 socket 的可读性
inputs = [client_socket, target_socket]
while inputs:
readable, _, _ = select.select(inputs, [], [])
for s in readable:
data = s.recv(4096)
if s is client_socket:
# 从客户端接收数据,并发送到目标服务器
if data:
target_socket.sendall(data)
else:
# 客户端关闭了连接
inputs.remove(s)
target_socket.close()
break
else:
# 从目标服务器接收数据,并发送到客户端
if data:
client_socket.sendall(data)
else:
# 目标服务器关闭了连接
inputs.remove(s)
client_socket.close()
break
finally:
client_socket.close()
def TCPlink():
# 创建一个 TCP 套接字并绑定到代理服务器的地址和端口
with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as server_socket:
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((IP, port))
server_socket.listen(5)
print(f"Proxy listening on {IP}:{port}")
while True:
client_socket, client_address = server_socket.accept()
print(f"Accepted connection from {client_address}")
# 为每个客户端连接创建一个新线程
client_thread = threading.Thread(target=handle_client, args=(client_socket,))
client_thread.start()
#这里是服务器
if __name__ == "__main__":
IP = '::' # IPv6转发
port = 43325 # 转发端口
TARGET_HOST = '127.0.0.1' # 本地换回接口
TARGET_PORT = 64871 # 假设 Minecraft 服务器运行在这个端口
TCPlink()
#客户端需要更改不同IPv6,将其修改为服务器的IPv6值
import socket
import select
import threading
def handle_client(client_socket):
print("正在连接")
try:
# 连接到目标服务器
with socket.create_connection((TARGET_HOST, TARGET_PORT)) as target_socket:
message = f"{IP}:{port}".encode('utf-8')
client_socket.sendall(message)
# 使用 select 来监听两个 socket 的可读性
inputs = [client_socket, target_socket]
while inputs:
readable, _, _ = select.select(inputs, [], [])
for s in readable:
data = s.recv(4096)
if s is client_socket:
# 从客户端接收数据,并发送到目标服务器
if data:
target_socket.sendall(data)
else:
# 客户端关闭了连接
inputs.remove(s)
target_socket.close()
break
else:
# 从目标服务器接收数据,并发送到客户端
if data:
client_socket.sendall(data)
else:
# 目标服务器关闭了连接
inputs.remove(s)
client_socket.close()
break
finally:
client_socket.close()
def TCPlink():
# 创建一个 TCP 套接字并绑定到代理服务器的地址和端口
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((IP, port))
server_socket.listen(5)
print(f"Proxy listening on {IP}:{port}")
while True:
client_socket, client_address = server_socket.accept()
print(f"Accepted connection from {client_address}")
# 为每个客户端连接创建一个新线程
client_thread = threading.Thread(target=handle_client, args=(client_socket,))
client_thread.start()
#客户端的配置应该与服务器相反
if __name__ == "__main__":
IP = '127.0.0.1' # 客户端的换回接口(你爱连啥都可以)
port = 46666 # 客户端的转发端口(你进游戏要用的)
TARGET_HOST = 'ffff:ffff::0' # 服务器的IP
TARGET_PORT = 43325 # 服务器的转发端口
TCPlink()
虽然主体仍然是AI帮写的,但是修改起来也不是那么轻松
后续可能会再升级,现在的状态还不够方便,这个是项目地址: