Java 为什么服务器套接字要在客户端套接字之前打开?
我使用Java中的套接字编程。我连接了一台pc和安卓平板电脑。服务器是pc,客户端是平板电脑。当我第一次启动平板电脑时,插座无法连接。然而,当我第一次启动电脑时,插座可以连接。为什么会这样?问题在哪里 Pc代码: ` ` 平板电脑代码:Java 为什么服务器套接字要在客户端套接字之前打开?,java,android,sockets,connection,client-server,Java,Android,Sockets,Connection,Client Server,我使用Java中的套接字编程。我连接了一台pc和安卓平板电脑。服务器是pc,客户端是平板电脑。当我第一次启动平板电脑时,插座无法连接。然而,当我第一次启动电脑时,插座可以连接。为什么会这样?问题在哪里 Pc代码: ` ` 平板电脑代码: @Override public void run() { // TODO Auto-generated method stub boolean check = false; while(!check) { try
@Override
public void run() {
// TODO Auto-generated method stub
boolean check = false;
while(!check)
{
try {
check = InetAddress.getByAddress(new byte[] { (byte) 192, (byte) 168, 2, 86 }).isReachable(1000);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
while(!socket.isConnected()){
try {
socket.connect(sockaddr, 1000);
// DataInputStream input =
// new DataInputStream(socket.getInputStream());
// int result = input.readInt();
// if(result == -2)
// {
// MainActivity.MainAct.StartUpdateActivity();
// }
} catch (IOException e) {
// TODO Auto-generated catch block
//text.setText(e.getMessage());
System.out.println(e.getMessage());
}finally{
}
}
编辑:第一个while,即使用InetAddress.isReachable的检查条件,始终为真。这意味着isReachable在任何时候都是假的。当我移除它时,可以建立连接。但是,问题仍然是一样的。客户端套接字是连接到服务器的东西。
如果没有正在运行的服务器,则没有可供连接的服务器
服务器套接字只接受连接。客户端套接字是连接到服务器的东西。
如果没有正在运行的服务器,则没有可供连接的服务器
服务器套接字只接受连接。服务器套接字正在侦听客户端建立连接(就像有人在等待接听电话)。如果客户端尝试连接(拨打电话),但没有人接听(没有人接听电话),则客户端无需执行任何操作,因此它会放弃并抛出异常(挂断电话)。请稍后再尝试连接(重拨电话)。服务器套接字正在侦听客户端建立连接(如有人等待接听电话)。如果客户端尝试连接(拨打电话),但没有人接听(没有人接听电话),则客户端无需执行任何操作,因此它会放弃并抛出异常(挂断电话)。请稍后再尝试连接(重拨电话)。连接尝试失败后,您无法重新连接套接字,因为异常情况会告诉您。您必须关闭它并创建一个新的套接字。在连接尝试失败后,您无法重新连接套接字,因为异常会告诉您。您必须关闭它并创建一个新的。检查文档中的
是否已连接:
那么你的
while(!socket.isConnected()){
线路仅在第一次成功连接之前工作
更新
这似乎也是正确的,即使(!socket.isConnected()){
正常工作,也无法使用已关闭的套接字建立连接,最终将导致java.net.SocketException:socket closed
。因此每次都必须重新创建套接字
while (!shouldIStop()/*some condition in case if you ever want to stop*/) {
Socket socket = new Socket();
try {
socket.connect(yourAddress, 1000);
//do something...
} catch (IOException e) {
} finally {
}
}
检查文档中是否连接了
:
那么你的
while(!socket.isConnected()){
线路仅在第一次成功连接之前工作
更新
这似乎也是正确的,即使(!socket.isConnected()){正常工作,也无法使用已关闭的套接字建立连接,最终将导致java.net.SocketException:socket closed
。因此每次都必须重新创建套接字
while (!shouldIStop()/*some condition in case if you ever want to stop*/) {
Socket socket = new Socket();
try {
socket.connect(yourAddress, 1000);
//do something...
} catch (IOException e) {
} finally {
}
}
不,不。我的意思是,当我先启动平板电脑,然后启动pc时,无法建立套接字。当反向操作完成时,我的意思是先启动pc,然后启动平板电脑,它可以工作。在这两种情况下,pc和平板电脑都是打开的。@user14570:Huh?您仍然需要先启动服务器。我不明白这一点。:S可能是端口无法打开。我尝试了很多次。第一台平板电脑然后是pc。但它不起作用:(我将再次尝试。您无法连接到未运行的服务器。您的意思是我先启动服务器端,然后启动pc端?平板电脑可能会先启动。不,不。我的意思是,当我先启动平板电脑,然后启动pc时,无法建立套接字。当反向操作完成时,我的意思是先启动pc,然后启动平板电脑,它会工作。在这两种情况下,pc和平板电脑都是打开的。@user14570:嗯?您仍然需要先启动服务器。我不明白这一点。:S可能是端口无法打开。我尝试了很多次。首先是平板电脑,然后是pc。但是它不起作用:(我会再试一次您无法连接到未运行的服务器。您的意思是我必须先启动服务器端,pc端吗?平板电脑可能会先启动。这是真的。但我使用了while(真的)对于服务器端。当它给出错误时,它会一次又一次地重试。它对客户端也是有效的。它还有while like true选项。它是真的。但是我对服务器端使用while(true)。当它给出错误时,它会一次又一次地重试。它对客户端也是有效的。它还有while like true选项只是去掉isReachable()调用。这是毫无意义的。套接字连接将成功或失败。这就是您所需要的。只需去掉isRecable()调用。这是毫无意义的。套接字连接将成功或失败。这就是你所需要的。第一次它工作时,之后它就失败了。@EJP我认为这不是真的。文档中没有提到它,我也没有看到任何非法状态异常。@Onur我不是在猜测。我没有说任何关于
非法状态异常的事。
事实上你知道获取一个SocketClosedException
,这样你甚至不必自己关闭它,只需创建一个新的。我建议你在再次发布之前尝试一下。@EJP是的,你是对的,对不起。我更新了我的答案。谢谢,我不知道。@Onor最好不要对你不知道的事情发表评论。第一次成功,之后失败。@EJP我不这么认为nk这是真的。文档中没有提到它,我也没有看到任何非法状态异常。@或者我不是在猜测。我没有说任何关于非法状态异常的事情。
事实上你得到了一个SocketClosedException
,所以你甚至不必自己关闭它,只需创建一个新的。我建议你先尝试一下再次发布。@EJP是的,你是对的,对不起。我更新了我的答案。谢谢,我不知道。@Onur最好不要评论你不知道的事情。