为什么java中带有侦听端口的TCP/IP服务器不工作
我已经用java编写了一个代码,将我的计算机与一个发送器和一个发送器设备连接起来,并且已经实现了一个通信板,可以通过TCP/IP连接到任何具有特定地址IP(比如192.168.2.2)并监听特定端口号(比如4000)的服务器 我遵循了strep的确切步骤,即如何用Java创建一个服务器端应用程序,提供一个侦听端口,以便连接到该发送器。 我不明白为什么当我尝试调试代码时,它会阻塞行为什么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(),并引发超时异常 有人能帮我找出代码中的错误在哪里
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),因为这在低级语言中很常见。但是关于安装部分,服务器代码肯定是正确的。非常感谢您的帮助!实际上,有一个防火墙阻止了连接。我将其关闭,现在设备可以连接到服务器。非常感谢!!非常感谢你的帮助!实际上,有一个防火墙阻止了连接。我将其关闭,现在设备可以连接到服务器。非常感谢!!