Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UDP网络延迟3秒_Java_Networking_Udp - Fatal编程技术网

Java UDP网络延迟3秒

Java UDP网络延迟3秒,java,networking,udp,Java,Networking,Udp,所以,我今天开始做我的多人游戏,我遇到了一个严重的问题,网络延迟。当我使用localhost在一台机器上测试时,没有明显的延迟。但当我试着在我的笔记本电脑上运行客户端,在PC机上运行服务器时,我遇到了大约2-3秒的延迟 基本上我所做的是: 服务器: 正在运行两个线程,一个线程侦听端口上的数据包,当收到带有输入的数据包时,他相应地更新游戏状态。第二个线程从第一个线程获取游戏状态,并每隔10毫秒将其发送给客户端 客户: 还有两个线程,一个线程接收游戏状态,第二个线程每隔10毫秒发送带有键盘输入的数据

所以,我今天开始做我的多人游戏,我遇到了一个严重的问题,网络延迟。当我使用localhost在一台机器上测试时,没有明显的延迟。但当我试着在我的笔记本电脑上运行客户端,在PC机上运行服务器时,我遇到了大约2-3秒的延迟

基本上我所做的是:

服务器:

正在运行两个线程,一个线程侦听端口上的数据包,当收到带有输入的数据包时,他相应地更新游戏状态。第二个线程从第一个线程获取游戏状态,并每隔10毫秒将其发送给客户端

客户:

还有两个线程,一个线程接收游戏状态,第二个线程每隔10毫秒发送带有键盘输入的数据包

来自序列化类的带有bytearray的Im seding Datagrampackes都有大约100字节的大小

发送代码:

    ServerPacket testPacket = new ServerPacket(player.getX(),player.getY());

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutput out = null;
    try 
    {
      out = new ObjectOutputStream(bos);   
      out.writeObject(testPacket);
      byte[] Bytes = bos.toByteArray();

      DatagramPacket packet = new DatagramPacket(Bytes,Bytes.length,ip,port);

      socket.send(packet);
      //System.out.println("SERVER:SentUpdate");
    } 
    catch (IOException ex) 
    { 
        System.out.println(ex.getMessage());
    } 
    finally 
    {
        try 
        {
            if (out != null) 
            {
              out.close();
            }
        } 
        catch (IOException ex) 
        {
            System.out.println(ex.getMessage());
        }

        try 
        {
          bos.close();
        } 
        catch (IOException ex) 
        {
          System.out.println(ex.getMessage());
        }
    }
接收代码:

        byte[] data = new byte[packetLength];
        DatagramPacket packet = new DatagramPacket(data, data.length);

        try 
        {    
            socket.receive(packet);
        } 
        catch (IOException ex) 
        {
            System.out.println(ex.getMessage());
        }

     ByteArrayInputStream bis = new ByteArrayInputStream(packet.getData());
    ObjectInput in = null;
    try 
    {
      in = new ObjectInputStream(bis);
      ServerPacket res = (ServerPacket)in.readObject();
      return res;
    } 
    catch (IOException ex) 
    { 
        System.out.println(ex.getMessage());
    } 
    catch (ClassNotFoundException ex) 
    {
        System.out.println(ex.getMessage());
    }        
    finally 
    {
        try 
        {
            bis.close();
        } catch (IOException ex) 
        {
            System.out.println(ex.getMessage());
        }

        try 
        {
            if (in != null) 
            {
              in.close();
            }
        } 
        catch (IOException ex) 
        {
            System.out.println(ex.getMessage());
        }
    }

有人问为什么这么慢?或者我应该知道的关于udp网络的任何信息。

您是如何使用两个10毫秒的线程实现如此高的频率的?你确定他们在以如此高的频率运行吗?为什么要使用不同的线程进行接收和发送?这将比在同一线程上接收后发送要花费更长的时间。当然,你必须适应一些网络游戏的延迟,通常你必须在每个对等客户端服务器之间容忍高达200ms的延迟,这可能高达400ms。

你只需要关闭“bis”和“out”。为自己保存一些代码。