记一次解决异地虚拟局域网联机war3不成功的经历

今日拿zerotier架设虚拟无线网,但是大家war3打开以后互相看不到房间。折腾了好久终于搞定。

首先我们互相ping对方的zerotier虚拟网卡的地址,都是可以ping通的,说明是可以连通的。
但是打开游戏我们还是看不到房间,最初我们怀疑的是服务器转发有问题
于是决定互相共享文件试一试,我把我电脑上的一个视频文件夹开了共享,阿H可以直接看我电脑里的电影,十分顺利,那首先排除服务器转发的问题,这个moon还是很成功的,我们也都是在一个局域网内,没问题。
那接下来就是魔兽的问题了
在这里插入图片描述
打开魔兽争霸看它的游戏端口是6112。
那就先在防火墙把6112的入站许可啥的都搞定。
但是还是不行。
那么在cmd中检查一下6112端口

netstat -ano|findstr 6112

在这里插入图片描述
在魔兽争霸运行时候有UDP和TCP
没有运行时则是空,看上去好像没问题。
但是这个时候阿H发现了问题
在这里插入图片描述
他的war3里只有一个UDP,没有TCP这就奇怪了,网上搜了一下6112的tcp还真就是暴雪战网的东西,那看来就是这个问题了。
在这里插入图片描述
在这里插入图片描述
然后阿H发现他的路由器把6112关了。
用手机热点一开立马就可以顺利联机了。
啧啧啧,不知道路由器为啥会屏蔽,而且关了好像也没用。。。

当时就以为是他路由器的问题。
晚上的时候阿L也连不上,他的魔兽打开也没有TCP,而且他的电脑还没有网卡没法连无线热点。
唔,看来这tcp打不开是个普遍现象阿。

当然可以,这里提供一个简单的棋类游戏联机的代码示例,你可以根据自己的需求进行修改和完善。 ```python import socket import threading class ChessGame: def __init__(self): self.board = [[' ' for i in range(8)] for j in range(8)] self.current_player = 'W' def print_board(self): for row in self.board: print(row) def play_game(self): while True: self.print_board() move = input("Enter move: ") self.make_move(move) def make_move(self, move): x1, y1, x2, y2 = move.split(',') x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2) piece = self.board[x1][y1] if piece == ' ': print("Invalid move!") return if piece.isupper() and self.current_player == 'B': print("Invalid move!") return if piece.islower() and self.current_player == 'W': print("Invalid move!") return self.board[x1][y1] = ' ' self.board[x2][y2] = piece self.current_player = 'B' if self.current_player == 'W' else 'W' class ChessServer: def __init__(self, port, host=''): self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_socket.bind((host, port)) self.server_socket.listen(1) self.players = [] self.game = ChessGame() def handle_client(self, client_socket, player_num): print(f"Player {player_num} connected.") self.players.append(client_socket) while True: try: move = client_socket.recv(1024).decode() print(f"Player {player_num} made move: {move}") self.game.make_move(move) for player in self.players: player.sendall(move.encode()) except: print(f"Player {player_num} disconnected.") self.players.remove(client_socket) client_socket.close() break def start_game(self): print("Waiting for players...") while len(self.players) < 2: client_socket, client_address = self.server_socket.accept() client_thread = threading.Thread(target=self.handle_client, args=(client_socket, len(self.players) + 1)) client_thread.start() print("Game started!") self.game.play_game() class ChessClient: def __init__(self, host, port): self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.client_socket.connect((host, port)) def send_move(self, move): self.client_socket.sendall(move.encode()) def receive_move(self): move = self.client_socket.recv(1024).decode() return move if __name__ == '__main__': # To start the server server = ChessServer(5000) server.start_game() # To start a client client = ChessClient('localhost', 5000) client.send_move('0,6,2,5') move = client.receive_move() print(move) ``` 这是一个使用 socket 模块实现的简单的棋类游戏联机,包含了服务器和客户端两部分。当有两个客户端连接到服务器时,服务器会启动一个 ChessGame 实例,并开始游戏。每当一个客户端发送了一个合法的移动时,服务器会将该移动广播给所有客户端。客户端可以发送自己的移动并接收其他客户端的移动。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆沙粽子好吃嘛!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值