为啥 DatagramSocket 在某些电脑中不发送

Posted

技术标签:

【中文标题】为啥 DatagramSocket 在某些电脑中不发送【英文标题】:Why DatagramSocket doesnt send in some pcs为什么 DatagramSocket 在某些电脑中不发送 【发布时间】:2020-08-08 14:03:36 【问题描述】:

我正在两个客户端之间使用 udp 套接字(DatagramSocket)开发一个网络游戏(服务器通知各自的 ip 和客户端建立连接)。问题是连接不适用于所有 PC。它适用于某些朋友,但不适用于其他朋友。无疑是发送问题。

Send hi 是一个重复发送排序消息以启动端口的功能(我发现要在 UDP 端口接收必须先发送),然后发送 ack 只是对“hi”的确认 (有一个进程调用receive,显然我在同一个端口发送和接收)

这是最重要的:

public class connection 
    protected DatagramSocket socketUDP;
    protected InetAddress address;
    protected int timeout = 50;
    protected int portSend;
    protected byte[] bufReceive = new byte[65535];
    protected byte[] bufSend;
    private boolean isUDP = true;

    public connection(String ip, int port, int timeout, boolean isUDP) 
        this.isUDP = isUDP;
        this.timeout = timeout;
        try 
            if(isUDP) 
                socketUDP = new DatagramSocket(port);
                this.portReceive = port;
                if (timeout > 0) 
                    socketUDP.setSoTimeout(timeout);
                
                address = InetAddress.getByName(ip);
            
            else
                ///
            
        catch (Exception e)
            e.printStackTrace();
        
        this.rec = new receiver(this);
        this.rec.start();
    

    private void send(int id, Object msg, boolean string)
        if(isUDP) 
            bufSend = (Integer.toString(id) + ";NR;" + (String)msg).getBytes();
            DatagramPacket packet = new DatagramPacket(bufSend, bufSend.length, address, portSend);
            try 
                socketUDP.send(packet);
             catch (Exception e) 
                e.printStackTrace();
            
        
        else 
            /////
        
    

    public void receive()
        if(blockReception || socketUDP != null && !socketUDP.isConnected())return;
        try 
            if(isUDP) 
                String received = "";
                DatagramPacket packet
                        = new DatagramPacket(bufReceive, bufReceive.length);
                socketUDP.receive(packet);
                InetAddress address = packet.getAddress();
                int port = packet.getPort();
                received = new String(packet.getData(), 0, packet.getLength());
                if(received.equals("HI"))
                    sendAck(msgID.toClient.hi);
                    return;
                
                System.out.println(received)
            
            else
                //////
            

        catch (Exception e)e.printStackTrace();
    
    
    public void setPortSend(int portSend) 
        this.portSend = portSend;
        if(isUDP) 
            socketUDP.connect(address, portSend);
            sendHi();
        
    

我希望有人能告诉我为什么它不适用于所有用户。

【问题讨论】:

你有异常吗?如果没有,可能是防火墙丢弃了数据包 没有抛出异常。我也考虑过防火墙,但是我所有的朋友都在 Windows 上启动了游戏,并且他们都弹出了请求网络权限的弹出窗口(他们接受了)。 【参考方案1】:

大多数个人防火墙或防病毒软件都会阻止 UDP 入站流量。商业和教育组织通常会阻止 UDP,而不是用于某些常见服务。一些 ISP 也可能会阻止异常端口上的 UDP 流量。

【讨论】:

如果我使用一个众所周知的端口(基于en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers 和bandwidthcontroller.com/applicationPorts.html),它有可能得到解决吗?

以上是关于为啥 DatagramSocket 在某些电脑中不发送的主要内容,如果未能解决你的问题,请参考以下文章

在 Unity 5 中,为啥精灵表中的某些精灵在精灵中不可见,但在 UI 图像中可以正常工作?

为啥 Java DatagramSocket 没有收到客户端发送的所有 udp 数据包?

社交图标在移动设备和某些平板电脑中不起作用(链接不起作用,它们不会在悬停时更改图像)

为啥 IndexedDB 在 node.js 中不可用? [关闭]

为啥 XML 存储在 iOS 中不可用?

为啥 HTML 中不允许重复的 ID 值?