当前位置: 首页 > 知识库问答 >
问题:

游戏客户端如何从服务器接收UDP数据?

管翼
2023-03-14

我想做的是:
为了学习游戏编程,我使用专用服务器和UDP创建了一个回声设置。专用服务器在不同的城市(也就是不在我的本地网络中)。

在我的本地计算机上,我有一个udp客户端和服务器(两个不同的程序)。当我第一次启动python服务器时,windows防火墙立即询问我是否要添加异常。在允许我的python服务器联网之后,我仍然没有收到任何消息。(客户-

我的问题是:
游戏如何解决这个问题?我没有为我想玩的每个多人游戏激活端口转发,我仍然能够在所有这些游戏中接收数据。

我的专用服务器设置(地址和端口有意更改):

#!/usr/bin/python3

import socket

ADDRESS = "1.123.123.123"
PORT = 12345

serverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSock.bind((ADDRESS, PORT))

clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

addresses = []

while True:
    data, addr = serverSock.recvfrom(1024)
    if addr not in addresses:
        addresses.append(addr)
    msg = str(data)
    #if msg.split()
    print("Message: " + str(data))
    outMsg = str(addr) + ":" + msg
    for ad in addresses:
        print("Send Msg " + outMsg + " to " + ad[0] + ":" + str(PORT))
        clientSock.sendto(bytes(outMsg, "utf-8"), (ad[0], 12345))
    print("Addresses: " + str(addresses))

共有1个答案

夹谷浩博
2023-03-14

我在写问题的时候想出了这个(就像和老橡皮鸭说话一样):

诀窍是不使用本地计算机上的两个程序。发送消息的程序还需要检索消息。在我的例子中,它是阻塞呼叫(丑陋!),对于一个你想让它异步的游戏。但这是绕过路由器防火墙的最简单方法:

#! /usr/bin/python3

import socket

ADDRESS = "1.123.123.123"
PORT = 12345

clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 # usually not required to bind a client, but we want to receive messages
clientSock.bind(("0.0.0.0",PORT))

while True:
    msg = input("Enter message: ")
# Note that it is not required to send to the same port 
# you have locally binded to.
    clientSock.sendto(bytes(msg, "utf-8"), (ADDRESS, PORT))
# listen to the echo:
    data, addr = clientSock.recvfrom(1024)
    print(str(data) + " from " + str(addr))

然而,我对套接字和防火墙的理解是有限的。我不明白为什么这会起作用,但两个独立的程序却不起作用。也许有人可以对此发表评论。希望我能节省一些时间

 类似资料:
  • 我正在为一个大学项目创建一个游戏服务器,所以我不使用任何库/框架。 经过大量研究后,我希望客户端和服务器使用UDP协议进行大量通信,例如角色移动和计时器,因为这方面的可靠性并不重要,丢失的数据包可以得到补偿。 但是,我还想将TCP协议用于游戏的其他方面,例如操作和事件,在这些方面,信息到达客户端是至关重要的。 我的问题是,我对使用UDP不太了解,在Java,从我的理解来看,它完全不同于仅仅为TCP

  • 我正在尝试使用UDP在服务器(在公共IP上)和客户端(通过NAT)之间进行双向通信。我的逻辑是,如果服务器向IP和它接收数据包的端口发送一些数据,客户端仍然应该得到它,因为NAT最终会有将数据包发送到客户端的映射。 客户端有 2 个进程,一个用于发送数据包,另一个进程用于接收数据。服务器继续等待数据,如果它获得数据,它会将数据发送回从接收数据的端口和 IP。 客户代码如下: client_recv

  • 客户端-NAT后面的Windows桌面,运行UDP客户端应用程序。 服务器-具有公共IP的Ubuntu服务器,运行一个UDP服务器应用程序,该应用程序期望在端口6000上发送数据包。 ClientPrivate/Public-客户端的私有/公共IP 服务器私有/公共 - 服务器的私有/公共 IP 客户端打开一个UDP套接字Client私人: 777和发送数据报Server公共: 6000 服务器从

  • 我有一个客户端测试功能,它将测试对象发送到socket.io服务器,该服务器的工作是等待客户端事件,然后将数据发送到原始客户端发出事件的房间中的每个客户端。但是,只有原始客户端从服务器接收事件。房间中的其他客户端没有接收到它。 我已经尝试了以及服务器端。两个客户端肯定加入同一个房间。服务器也从原始客户端接收事件。 Server.js: 父组件: 子组件: 我希望在两个连接的客户端上读取服务器消息,

  • 在开发我的在线游戏时,我试图了解更多关于安全的知识。 截获从服务器发送的数据包、使用某些软件修改数据包并将数据发送回服务器是否可能,以及有多困难? 下面是一个场景: 玩家与AI敌人进行战斗。一个玩家输掉了这场战斗,在战斗结束时,数据包被发送回服务器,记录发生的事情。是否可以在发送之前修改此数据包,并告诉服务器玩家已经赢得了这场战斗?如何读取并修改这些数据? 是否有可能说玩家与1个敌人进行了一场战斗

  • 我正在尝试构建一个使用套接字和udp协议的python在线游戏。我创建了一个多处理和多线程服务器:https://pastebin.com/zucxwpc9。 我会解释里面的代码是做什么的。所以首先,它等待两个请求,并将它们放入lobby列表中。如果发出了两个请求,服务器将向客户端发送一个新端口,并创建一个具有两个线程的新进程。两个线程都在使用新端口,一个接收数据,另一个发送数据。我正在使用队列,