package com.yanming.test.http;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Server4 {
private static final ExecutorService worker = Executors.newCachedThreadPool();
// 注意:如果是使用spring启动socket,请将下面的main方法中的内容放入线程池中异步启动,
// 不可直接将main方法中的内容直接放入spring中的init方法中,防止启动阻塞
public static void main(String args[]) throws IOException {
//为了简单起见,所有的异常信息都往外抛
int port = 8899;
//定义一个ServerSocket监听在端口8899上
ServerSocket server = new ServerSocket(port);
while (true) {
//server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
final Socket socket = server.accept();
//每接收到一个Socket就建立一个新的线程来处理它,防止因为单个socket连接造成整个server阻塞
worker.execute(new Runnable() {
@Override
public void run() {
try {
Task2.handleSocket(socket);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
/**
* 用来处理Socket请求的
*/
static class Task2 {
/**
* 跟客户端Socket进行通信
*
* @throws Exception
*/
private static void handleSocket(Socket socket) {
InputStream is = null;
OutputStream os = null;
try {
is = socket.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count = 0;
// 读取socket中的内容最好不要使用readline方法,防止读取不到结束符,造成阻塞
do {
count = is.read(buffer);
bos.write(buffer, 0, count);
} while (is.available() != 0);
//TODO 编码自己设定
String req = new String(bos.toByteArray(), "GBK");
System.out.println(Thread.currentThread() + " " + new Date().toString() + "客户端接受数据:" + req);
os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
//TODO 处理业务
bw.write("业务返回结果");
bw.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
socket服务端案例
最新推荐文章于 2024-07-17 00:35:25 发布