Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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网络_Java_Networking - Fatal编程技术网

数据报数据包和套接字出现未知错误-Java网络

数据报数据包和套接字出现未知错误-Java网络,java,networking,Java,Networking,嘿,我一直在玩数据报类,我就是不明白为什么我的“服务器”不会从“客户端”接收数据包 我已经用服务器和客户端在我自己的电脑上同时运行进行了测试,它工作得很好,但是如果我尝试将服务器移到另一台电脑上,它…就不会了 现在我知道我一定是在插座/地址/端口等方面出了问题……我以前没有使用过网络,所以我知道的不多 以下是服务器代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNot

嘿,我一直在玩数据报类,我就是不明白为什么我的“服务器”不会从“客户端”接收数据包

我已经用服务器和客户端在我自己的电脑上同时运行进行了测试,它工作得很好,但是如果我尝试将服务器移到另一台电脑上,它…就不会了

现在我知道我一定是在插座/地址/端口等方面出了问题……我以前没有使用过网络,所以我知道的不多

以下是服务器代码:

    import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.net.UnknownHostException;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.sql.Connection;
import java.util.ArrayList;

public class ServerThread extends Thread {

    private boolean needsToRun;
    private DatagramSocket socket;

    public ServerThread() {
        super();
        needsToRun = true;
        try {
            socket = new DatagramSocket(4446);
        }
        catch (SocketException ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public void run() {
        while(needsToRun) {
            byte[] buf = new byte[265];
            DatagramPacket packet = new DatagramPacket(buf,buf.length);
            try {
                socket.receive(packet);
            }
            catch(IOException e) {
                e.printStackTrace();
            }
            String data = new String(packet.getData(),0,packet.getLength());
            if(data != null)
                System.out.println(data);
        }
        socket.close();
    }
}
您将看到一些未使用的导入,但我只是简化了代码以使其成为基本的(大部分代码来自于我实际希望服务器在接收数据后对数据所做的操作,但我已经让该部分正常工作了)

以下是客户端代码:

    import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Main {

        public static void main(String[] args) throws SocketException, UnknownHostException, IOException {

            // get a datagram socket
        DatagramSocket socket = new DatagramSocket();

            // send request
        String testInfo = "Hi";
        byte[] buf = testInfo.getBytes();

        /*This could possible be a point at which the code won't work.
         *to get the bytes of the IP address of the computer I'm trying to run the server 
         *on I just did
         * byte[] address = InetAddress.getLocalHost().getAddress();
         * on the computer I was running the server on. I'm 95% sure that the IP addresses 
         * match.
         */
        byte[] inet = {-64,-88,1,5};
        InetAddress address = InetAddress.getByAddress(inet);
        DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4446);
        try {
            socket.send(packet);
        }
        catch(Exception e) {
            e.printStackTrace();
        }

        socket.close();
    }
}
我已经检查了代码的明显部分,比如端口和地址(请参见代码注释中的)

所以我真正想要的是,如果你不明白为什么代码不能工作,那么你能告诉我一些端口可能会出问题的事情吗,等等(端口可能会关闭,等等)(除了我还相当肯定端口是打开的)

谢谢你的建议

我已经用服务器和客户端在我自己的电脑上同时运行进行了测试,它工作得很好,但是如果我尝试将服务器移到另一台电脑上,它…就不会了

我认为这是某种网络或防火墙问题,而不是Java客户机和服务器应用程序的问题。(在同一台机器上运行时,他们可以说话的证据表明了这一点……)

检查以下内容:

  • 检查客户端是否可以解析服务器的IP地址;e、 g.尝试ping它或在已知服务器支持的其他端口上连接到它

  • 检查客户端和服务器计算机上的软件防火墙是否允许端口4446上的UDP通信

  • 如果两台机器之间有网桥和/或路由器,请检查它是否未阻塞端口4446上的UDP通信

我已经用服务器和客户端在我自己的电脑上同时运行进行了测试,它工作得很好,但是如果我尝试将服务器移到另一台电脑上,它…就不会了

我认为这是某种网络或防火墙问题,而不是Java客户机和服务器应用程序的问题。(在同一台机器上运行时,他们可以说话的证据表明了这一点……)

检查以下内容:

  • 检查客户端是否可以解析服务器的IP地址;e、 g.尝试ping它或在已知服务器支持的其他端口上连接到它

  • 检查客户端和服务器计算机上的软件防火墙是否允许端口4446上的UDP通信

  • 如果两台机器之间有网桥和/或路由器,请检查它是否未阻塞端口4446上的UDP通信


可能是防火墙阻止了数据包?您是否尝试过禁用每台计算机上的防火墙?可能是防火墙阻止了数据包?您是否尝试过禁用每台计算机上的防火墙?我最近不得不这样做,并且在使用多个网络接口(一些虚拟接口)时遇到了问题。因此,还要检查您使用的IP是否适合您使用的网络。另外,请安装Wireshark。@Stephen,谢谢您的回复。我能够成功ping我尝试连接的IP地址。我进入服务器计算机上的Windows防火墙,为端口4446添加了UDP流量异常。我不太清楚你说的第三个建议是什么意思,如果你能详细说明的话,那就太好了。还有,@Michael,就像斯蒂芬的第三个建议一样,我不太明白你的意思。我对网络很陌生,如果我的速度有点慢,很抱歉。至于Wireshark,我不知道如何才能成功地使用它。它所能告诉我的似乎就是服务器PC是否真的收到了数据包,如果真的收到了,服务器应用程序会注意到它吗?哦,我并没有真正澄清(@Stephen)它似乎仍然不起作用。我使用过isReachable(timeout)方法,当从客户端运行它时,它总是返回false。如果客户端和服务器机器不在同一条以太网线上,则会有其他网络硬件连接它们。或者可能是多个硬件位。理论上,这些硬件中的任何一个都可以配置为阻止端口4446上的UDP数据包。我最近不得不这样做,并且在使用多个网络接口(一些虚拟接口)时遇到了麻烦。因此,还要检查您使用的IP是否适合您使用的网络。另外,请安装Wireshark。@Stephen,谢谢您的回复。我能够成功ping我尝试连接的IP地址。我进入服务器计算机上的Windows防火墙,为端口4446添加了UDP流量异常。我不太清楚你说的第三个建议是什么意思,如果你能详细说明的话,那就太好了。还有,@Michael,就像斯蒂芬的第三个建议一样,我不太明白你的意思。我对网络很陌生,如果我的速度有点慢,很抱歉。至于Wireshark,我不知道如何才能成功地使用它。它所能告诉我的似乎就是服务器PC是否真的收到了数据包,如果真的收到了,服务器应用程序会注意到它吗?哦,我并没有真正澄清(@Stephen)它似乎仍然不起作用。我使用过isReachable(timeout)方法,当从客户端运行它时,它总是返回false。如果客户端和服务器机器不在同一条以太网线上,则会有其他网络硬件连接它们。或者可能是多个硬件位。理论上,这些硬件位中的任何一位都可以配置为阻止端口4446上的UDP数据包。