为什么带有java监听端口的TCP / IP服务器无法正常工作

时间:2015-11-26 21:11:06

标签: java sockets tcp-ip

我在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);
            }           
    }
}

2 个答案:

答案 0 :(得分:3)

  

有人可以帮我找出我的代码中可能出现的错误吗?

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

然而:

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.

答案 1 :(得分:1)

你指定超时30秒,不是吗? :

serverSocket.setSoTimeout(30000);

所以30秒后,无论是在调试器中停止还是在运行,都会超时并抛出异常。