我在Java中使用套接字编程。我连接了一台PC和Android平板电脑。服务器是pc,客户端是平板电脑。当我首先启动平板电脑时,无法连接插座。但是,当我首先启动pc时,可以连接套接字。为什么会这样?问题出在哪里?
Pc代码:
`
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
ServerSocket listener = null;
Socket socket = null;
System.out.println("Opened");
try {
listener = new ServerSocket(1515);
} catch (IOException e1) {
// TODO Auto-generated catch block
System.out.println(e1.getMessage());
}
String answer = null;
while(true)
{
try {
socket = listener.accept();
DataInputStream input =
new DataInputStream(socket.getInputStream());
answer = input.readInt()+ " ";
answer = answer + input.readInt();
input.close();
dName.setText(answer);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
});
t.start();
`
平板电脑代码:
@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{
}
}
编辑:使用InetAddress.isReachable的检查条件始终为TRUE。这意味着isReachable始终为false。当我删除它时,可以建立连接。但问题仍然存在。
答案 0 :(得分:3)
客户端套接字是连接到服务器的东西 如果没有服务器正在运行,则无法连接到它。
服务器套接字只接受连接。
答案 1 :(得分:2)
服务器套接字正在侦听客户端进行连接(就像等待接听电话的人一样)。如果客户端尝试连接(拨打电话)并且没有人在听(没有人接听电话),那么客户端就没有什么可做的,所以它放弃并抛出异常(挂起)打电话)。尝试再次连接(重拨手机)。
答案 2 :(得分:1)
在连接尝试失败后,您无法重新连接套接字,例外情况会告诉您。你必须关闭它并创建一个新的。
答案 3 :(得分:0)
查看isConnected
:Socket
Returns the connection state of the socket.
Note: Closing a socket doesn't clear its connection state, which means this method will return true for a closed socket (see isClosed()) if it was successfuly connected prior to being closed.
所以你的
while(!socket.isConnected()){
行仅在第一次成功连接之前有效。
<强>更新强>
似乎EJP's answer也是如此,即使您的while(!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 {
}
}