我在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);
}
}
}
答案 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秒后,无论是在调试器中停止还是在运行,都会超时并抛出异常。