『壹』 java socket如果服务端掉线 客户端应该怎样重连,实现的思路是怎么样的,最好能有具体的代码参考一下
看代码,不明白的追问
// 无穷循环,用于自动重新连接网关
while (true) {
// 捕获sleep异常
try {
// 捕获socket异常
try {
// 创建socket连接
socketGateway = new Socket("127.0.0.1", 8888);
// 创建输入输出对象
inStream = new DataInputStream(socketGateway.getInputStream());
outStream = new DataOutputStream(socketGateway.getOutputStream());
byte buf[] = new byte[1]; // 数据缓冲区
int intLen; // 读缓冲区返回的长度
// 无穷循环,用于读缓冲区数据
while (true) {
// 捕获读缓冲区异常
try {
intLen = inStream.read(buf, 0, 1);
// 可读长度-1则断开连接
if (intLen == -1) {
break;
}
// 处理buf
}
// 连接断开
catch (EOFException e) {
break;
}
// 接收数据超时
catch (SocketTimeoutException e) {
break;
}
// 超过数据包末尾
catch (IOException e) {
break;
}
}
} catch (Exception e) {
// 处理socket错误
}
// 休眠1秒后重连
sleep(1000);
} catch (Exception e) {
// 处理sleep错误
}
}
『贰』 java编程中,Socket通信是怎么实现的
java编程对于Socket之间的通信过程如下:
服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容。下面来看一些服务端与客户端通信的例子:
publicclassServer{
publicstaticvoidmain(Stringargs[])throwsIOException{
//为了简单起见,所有的异常信息都往外抛
intport=8899;
//定义一个ServerSocket监听在端口8899上
ServerSocketserver=newServerSocket(port);
//server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
Socketsocket=server.accept();
//跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息了。
Readerreader=newInputStreamReader(socket.getInputStream());
charchars[]=newchar[64];
intlen;
StringBuildersb=newStringBuilder();
while((len=reader.read(chars))!=-1){
sb.append(newString(chars,0,len));
}
System.out.println("fromclient:"+sb);
reader.close();
socket.close();
server.close();
}
}
客户端代码
Java代码publicclassClient{
publicstaticvoidmain(Stringargs[])throwsException{
//为了简单起见,所有的异常都直接往外抛
Stringhost="127.0.0.1";//要连接的服务端IP地址
intport=8899;//要连接的服务端对应的监听端口
//与服务端建立连接
Socketclient=newSocket(host,port);
//建立连接后就可以往服务端写数据了
Writerwriter=newOutputStreamWriter(client.getOutputStream());
writer.write("HelloServer.");
writer.flush();//写完后要记得flush
writer.close();
client.close();
}
}
『叁』 java中socket如何让服务端一直等待,客户端每隔一段时间链接一次
1、服务端
使用ServerSocket 在确定端口之后,调用accept() 方法 。 这样 服务端就会阻塞在accept() 这里 直到有客户端请求版过来 才会接着往下权执行,后面你就写获取文件夹内容的具体逻辑代码 然后写入流里面 传回给客户端就可以了
2、客户端
客户端你要求每隔一段时间 有很多种方法可以实现 比如说写个timer 在间隔指定时间段向Server端发起请求就可以了,具体方式就是new Socket(ip,端口) 连接上了之后 可以得到Server端写在流里的数据 读出来就可以了
中间的细节 自己去琢磨一下 要循环往复 可以通过多线程来实现。
Socket的具体使用 可以查看官方api或者google
『肆』 java socket 判断是否断开了
首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。
然后想到是否可以通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接,类似ping,但是这样会影响到正常的输出数据,远端无法把正常数据和测试数据分开。
最后又回到socket类,发现有一个方法sendUrgentData,查看文档后得知它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的,太好了,正是我需要的!
于是,下面一段代码就可以判断远端是否断开了连接:
try{
socket.sendUrgentData(0xFF);
}catch(Exception ex){
reconnect();
}
用ping实现
package com.csdn.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class test {
static BufferedReader bufferedReader;
public static void main(String[] args) throws IOException {
try {
Process process = Runtime.getRuntime().exec("ping 192.168.1.104");//判断是否连接的IP;
bufferedReader = new BufferedReader(new InputStreamReader(process
.getInputStream()));
String connectionStr = "";
while ((connectionStr = bufferedReader.readLine()) != null) {
System.out.println(connectionStr);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
bufferedReader.close();
}
}
}
ping的方法有个严重的BUG,就是你只能判断对方是否连接网络,而不能判断客户端是否开启...
我在写聊天室时经常要注意客户端异常退出的问题(比如客户直接调用任务管理器结束程序进程),
其实在通过socket.getoutstream和socket.getinputstream流对客户端发送、接受信息时如果socket没连接上是会抛出异常的,这也就是为什么Java会要求网络编程都要写在try里面,所以只要在catch里面写入客户端退出的处理就行了,没必要专门去想什么方法
『伍』 java数据库自动重连
连接数据库的话不是有个返回值么,如果返回记录的话rs.next!=null
如果没有返回记录rs.next==null
然后你就内用rs.next判断
if(rs.next==null)
{
//此处写方容法等待五秒重新连接调用这个类
}
else
{
//接受数据库穿出来的值
}
上面如果不行
就写个try catch语句:
try
{
//连接数据库
}
catch(...)
{
//如果有异常,说明数据库还没有启动
//等待五秒重新连接调用这个类
}