作者:咪了眼的小迷糊 | 来源:互联网 | 2023-09-24 14:43
Pre解决思路代码后记:客户端app上的部分代码调用:服务器上:客户端判断服务器是否还活着代码:在利用socket写通讯程序的时候,想检测服务器是否还活着。从网上找了很多资料,都没
- Pre
- 解决思路
-
代码后记:
- 客户端app上的部分代码
- 调用:
- 服务器上:
- 客户端判断服务器是否还活着代码:
-
在利用socket写通讯程序的时候,想检测服务器是否还活着。
从网上找了很多资料,都没有自己合适的,最后自己想了个办法,不过也相当于截取了心跳检测的一部分。
这里检测的是远程server的连接,而不是本地是否连接成功。首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()
等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。
而有一个方法sendUrgentData
,查看文档后得知它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节。
或者,其实如果断开连接了,你发送过去的数据会收不到,最后client会抛出io异常。
但是,上面两个方法,抛出异常的时间长达15秒!简直不能忍。
解决思路
当然,这里的需求环境是:发送数据次数非常少,几乎只需要判断一两次,数据是集中发送的。那么,就可以这样了:
只要client在发送数据前,先发送自定义的一个测试数据,并自定义一个String之类的变量(初始值null)来接收server发回的数据,client发完测试数据,睡500毫秒(自定义时间)(异步接收服务器消息),然后立刻检测这个string是不是null,就可以知道server是否收到消息了。
代码
客户端APP上的部分代码
/**客户端线程,用来建立连接和发送消息 */
public class Client implements Runnable{
Socket s=null;
DataInputStream dis=null;
DataOutputStream dos=null;
private boolean isCOnnected=false;
Thread receiveMessage=null;
/**发送消息
* @param str 发送的信息,client仅向server发送两次消息,这是我自己的应用需求,根据实际情况来做你的。
* @throws IOException
* */
public void sendMessage(String str) throws IOException{
dos.writeUTF(str);
dos.flush();
}
/**断开连接*/
public void disConnect(){
try {
dos.close();
dis.close();
s.close();
} catch (IOException e) {
System.out.println("client closed error");
e.printStackTrace();
}
}
/**建立socket连接,开启接收数据线程 * */
public void run() {
try {
s=new Socket(SERVER_HOST_IP,SERVER_HOST_PORT);
s.setOOBInline(true);
dis=new DataInputStream(s.getInputStream());
dos=new DataOutputStream(s.getOutputStream());
System.out.println("connected!");
isCOnnected=true;
receiveMessage=new Thread(new ReceiveListenerThread());
receiveMessage.start();
调用:
Client client=null;
/**客户端网络线程*/
Thread tClient=null;
client=new Client();
tClient=new Thread(client);
tClient.start();
服务器上:
/** 这是服务器用来接收处理客户端的线程类 */
class Client implements Runnable {
private Socket s;
private DataInputStream dis = null;
private DataOutputStream dos = null;
private boolean isCOnnected= false;
public Client(Socket s) {
this.s = s;
try {
dis = new DataInputStream(s.getInputStream());
dos = new DataOutputStream(s.getOutputStream());
isCOnnected= true;
} catch (IOException e) {
System.out.println("on clients' data in and out have error");
客户端判断服务器是否还活着代码:
try {
后记:
当初只是简单记录了下自己的想法,写的很简陋,没想到慢慢这篇文章还好多人看,深感不安,故更新补充一下。
2015.3.27
声明:
文章若无说明转载,均为原创,如需转载,请注明出处!