Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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中带有侦听端口的TCP/IP服务器不工作_Java_Sockets_Tcp Ip - Fatal编程技术网

为什么java中带有侦听端口的TCP/IP服务器不工作

为什么java中带有侦听端口的TCP/IP服务器不工作,java,sockets,tcp-ip,Java,Sockets,Tcp Ip,我已经用java编写了一个代码,将我的计算机与一个发送器和一个发送器设备连接起来,并且已经实现了一个通信板,可以通过TCP/IP连接到任何具有特定地址IP(比如192.168.2.2)并监听特定端口号(比如4000)的服务器 我遵循了strep的确切步骤,即如何用Java创建一个服务器端应用程序,提供一个侦听端口,以便连接到该发送器。 我不明白为什么当我尝试调试代码时,它会阻塞行clientSocket=serverSocket.accept(),并引发超时异常 有人能帮我找出代码中的错误在哪里

我已经用java编写了一个代码,将我的计算机与一个发送器和一个发送器设备连接起来,并且已经实现了一个通信板,可以通过TCP/IP连接到任何具有特定地址IP(比如192.168.2.2)并监听特定端口号(比如4000)的服务器

我遵循了strep的确切步骤,即如何用Java创建一个服务器端应用程序,提供一个侦听端口,以便连接到该发送器。 我不明白为什么当我尝试调试代码时,它会阻塞行
clientSocket=serverSocket.accept()
,并引发超时异常

有人能帮我找出代码中的错误在哪里吗? 任何帮助都将不胜感激。 谢谢

代码如下:

public class Server {

    public static void main(String[] args) {
        // TODO Auto-generated method stub


            //Declares server and client socket, as well as the input and the output stream
            ServerSocket serverSocket = null;
            Socket clientSocket = null;
            PrintWriter out;
            //BufferedReader in;
            BufferedReader in;


            try{

                InetAddress addr = InetAddress.getByName("192.168.2.2");

                //Opens a server socket on port 4000
                serverSocket = new ServerSocket(4000) ;

                //Sets the timeout
                serverSocket.setSoTimeout(30000);

                System.out.println("Server has connected"); 

                //Create a connection to server
                System.out.println("Server listening connection from client ....");

                //Listens and waits for client's connection to the server
                clientSocket = serverSocket.accept();

                // Creates input and output streams to socket
                out = new PrintWriter(clientSocket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

                //Reads response from socket
                while((in.readLine())!= null  ){
                    System.out.println ( in.readLine() );
                }

                System.out.println ( "Closing connection ....");

            //Terminates connection
            clientSocket.close();   
            serverSocket.close();

            System.out.println("Connecton successfully closed");                
            }
            catch(IOException e){
                System.out.println(e);
            }           
    }
}

您指定了30秒的超时时间,是吗

serverSocket.setSoTimeout(30000);

因此,30秒后,无论是在调试器中停止还是在运行,这都将超时并引发异常。

您指定了30秒的超时,不是吗?:

serverSocket.setSoTimeout(30000);
所以,30秒后,无论是在调试器中停止还是在运行,这都将超时并引发异常

有人能帮我找出代码中的错误在哪里吗

代码中没有可能导致此问题的错误。很明显,您没有将设备配置为正确连接到此服务器,或者设备未运行,或者未连接,或者存在防火墙。调查一下

然而:

InetAddress addr = InetAddress.getByName("192.168.2.2");
这是干什么用的?它没有被使用

System.out.println("Server has connected"); 
这根本不是事实。服务器尚未连接。此时,它所做的只是创建一个侦听套接字

while((in.readLine())!= null  ){
在这里,你正在读一行,并把它扔掉

    System.out.println ( in.readLine() );
在这里,你每第二行就打印一行,把每一行都扔掉。写入此循环的正确方法是:

String line;
while ((line = in.readLine()) != null)
{
    System.out.println(line);
}
还要注意,此服务器将只为一个客户机提供服务,然后退出。从
accept()
clientSocket.close()
,每件事情都应该有一个循环,如果有多个设备,它应该为每个接受的套接字启动一个新线程来处理I/O

有人能帮我找出代码中的错误在哪里吗

代码中没有可能导致此问题的错误。很明显,您没有将设备配置为正确连接到此服务器,或者设备未运行,或者未连接,或者存在防火墙。调查一下

然而:

InetAddress addr = InetAddress.getByName("192.168.2.2");
这是干什么用的?它没有被使用

System.out.println("Server has connected"); 
这根本不是事实。服务器尚未连接。此时,它所做的只是创建一个侦听套接字

while((in.readLine())!= null  ){
在这里,你正在读一行,并把它扔掉

    System.out.println ( in.readLine() );
在这里,你每第二行就打印一行,把每一行都扔掉。写入此循环的正确方法是:

String line;
while ((line = in.readLine()) != null)
{
    System.out.println(line);
}

还要注意,此服务器将只为一个客户机提供服务,然后退出。从
accept()。但问题是,即使没有超时线。它只是停在同一条线路上,没有继续。@GerkoFord是的,接受是一个阻塞呼叫。我不知道你在期待什么?我知道,这是一个阻拦电话。但正如我在问题中所解释的,如果服务器真的在该端口监听,根据发射机手册,它应该自动连接到服务器。但事实并非如此。顺便说一句,一个插座已经在Matlab中完成,并且工作良好,这意味着,变送器的功能确实如手册中所述。但是我不明白为什么它不能在Java中工作。那么,你能展示一下matlab中的代码吗?它可以是UDP而不是TCPor,您需要交换端口值中的字节(4000将变成40975),因为这在低级语言中很常见。但是关于设置部分,服务器代码肯定是正确的。是的,我指定了30秒。但问题是,即使没有超时线。它只是停在同一条线路上,没有继续。@GerkoFord是的,接受是一个阻塞呼叫。我不知道你在期待什么?我知道,这是一个阻拦电话。但正如我在问题中所解释的,如果服务器真的在该端口监听,根据发射机手册,它应该自动连接到服务器。但事实并非如此。顺便说一句,一个插座已经在Matlab中完成,并且工作良好,这意味着,变送器的功能确实如手册中所述。但是我不明白为什么它不能在Java中工作。那么,你能展示一下matlab中的代码吗?它可以是UDP而不是TCPor,您需要交换端口值中的字节(4000将变成40975),因为这在低级语言中很常见。但是关于安装部分,服务器代码肯定是正确的。非常感谢您的帮助!实际上,有一个防火墙阻止了连接。我将其关闭,现在设备可以连接到服务器。非常感谢!!非常感谢你的帮助!实际上,有一个防火墙阻止了连接。我将其关闭,现在设备可以连接到服务器。非常感谢!!