java Socket服务端与客户端

服务端:

    public void run(ApplicationArguments args) throws Exception {
socketClient = new SocketClient(); // 用于接收数据后 在用socket客户端发送出去
//创建一个线程池
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
// 创建一个ServerScocket
ServerSocket serverSocket = new ServerSocket(port);
log.info("服务启动了");
while (true) {
//主线程
log.info("线程信息 id:" + Thread.currentThread().getId() + " 名字为:" + Thread.currentThread().getName());
final Socket socket = serverSocket.accept(); //可能会进行阻塞
log.info("有客户端进行连接了");

newCachedThreadPool.execute(new Runnable() {
@Override
public void run() {

//与客户端进行通讯
handler(socket);
}
});

}
}

//编写一个Handler方法,与客户端进行通讯
public static void handler(Socket socket) {
try {
byte[] bytes = new byte[1024];
InputStream inputStream = socket.getInputStream(); //可能会进行阻塞
//循环读取客户端发送的数据
while (true) {
String threadId = "线程信息 id:" + Thread.currentThread().getId();
log.info("等待连接");
log.info(threadId + " 名字为:" + Thread.currentThread().getName());
log.info("read-------");

int read = inputStream.read(bytes); //返回读了多少个数据
if (read != -1) {
log.info("{},接收数据:{}", threadId, new String(bytes, 0, read));
Boolean send = socketClient.send(new String(bytes, 0, read));
if (!send) {
socketClient.createSocket();
}
log.info("{},数据发送成功", threadId);
} else {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("关闭连接");
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

客户端
public class SocketClient {
public String ip = "1.1.1.1";//连接服务器的IP
public Integer port = 1111;//连接服务器的端口
private Socket socket = null;//套节字对象
private boolean close = false; // 关闭连接标志位,true表示关闭,false表示连接
private Integer soTimeout = 10 * 10 * 10;//超时时间,以毫秒为单位

private Lock lock = new ReentrantLock();

//------------------------------------------------------------------------------
public SocketClient() {
init();
}

// public SocketClient(String ip, Integer port) {
// setIp(ip);
// setPort(port);
// init();
// }

/**
* 初始化socket对象
*/
public void init() {
try {
InetAddress address = InetAddress.getByName(getIp());
socket = new Socket(address, getPort());
socket.setKeepAlive(true);//开启保持活动状态的套接字
socket.setSoTimeout(soTimeout);//设置超时时间
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 读数据线程
*/
@SneakyThrows
public void createSocket() {
//---------读数据---------------------------
close = isServerClose(socket);//判断是否断开
//---------创建连接-------------------------
if(close){
lock.lock();
}
while (close) {//已经断开,重新建立连接
try {
log.info("与服务端重新建立连接:" + getIp() + ":" + getPort());
InetAddress address = InetAddress.getByName(getIp());
socket = new Socket(address, getPort());
socket.setKeepAlive(true);
socket.setSoTimeout(soTimeout);
close = isServerClose(socket);
lock.unlock();
log.info("与服务端重新建立连接成功:" + getIp() + ":" + getPort());
} catch (Exception se) {
log.info("与服务端创建连接失败:等待10S重连" + getIp() + ":" + getPort());
TimeUnit.MILLISECONDS.sleep(10000);
close = true;
}
}
}

/**
* 发送数据,发送失败返回false,发送成功返回true
*
* @param message
* @return
*/
public Boolean send(String message) {
try {
OutputStream ou = socket.getOutputStream();//发送io流
ou.write(message.getBytes("gbk"));//getBytes()是将String字符串转换为Byte数组
// PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// out.println(message);
return true;
} catch (Exception se) {
se.printStackTrace();
return false;
}
}

/**
* 判断是否断开连接,断开返回true,没有返回false
*
* @param socket
* @return
*/
public Boolean isServerClose(Socket socket) {
try {
socket.sendUrgentData(0xFF);//发送1个字节的紧急数据,默认情况下,服务器端没有开启紧急数据处理,不影响正常通信
return false;
} catch (Exception se) {
return true;
}
}

//------------------------------------------------------------------------------
public String getIp() {
return ip;
}

public void setIp(String ip) {
this.ip = ip;
}

public Integer getPort() {
return port;
}

public void setPort(Integer port) {
this.port = port;
}
}


posted @ 2022-12-20 10:43  全栈冲鸭!  阅读(2492)  评论(0)    收藏  举报