一、建立Socket服务端,循环监听客户端发送来的请求
package com.ceair.mutms;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args) throws Exception {
// 服务端口
int port = 55533;
// 创建服务
System.out.println("服务已启动.....");
ServerSocket server = new ServerSocket(port);
// 循环监听消息
while (true) {
Socket socket = server.accept();
// 建立好连接后,从socket中获取输入流,并建立缓冲区进行读取
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
//注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-8
sb.append(new String(bytes, 0, len,"UTF-8"));
}
System.out.println("get message from client: " + sb);
inputStream.close();
socket.close();
}
}
}
二、客户端
package com.ceair.mutms;
import java.io.OutputStream;
import java.net.Socket;
public class SocketClient {
public static void main(String args[]) throws Exception {
// 要连接的服务端IP地址和端口
String host = "127.0.0.1";
int port = 55533;
// 与服务端建立连接
Socket socket = new Socket(host, port);
// 建立连接后获得输出流
OutputStream outputStream = socket.getOutputStream();
String message = "客户端发送消息成功!!";
socket.getOutputStream().write(message.getBytes("UTF-8"));
System.out.println("客户端消息已发送成功!!");
outputStream.close();
socket.close();
}
}
客户端发送消息, 服务端接收成功
客户端消息已发送成功!!
服务已启动.....
get message from client: 客户端发送消息成功!!
get message from client: 客户端发送消息成功!!
三、服务端异步处理请求
现在的服务器端是阻塞的, 如果同时来多个请求, 第一个请求耗时过长,后面的任务就会等待直到第一个任务执行完成,效率低下,优化为多线程处理
package com.ceair.mutms;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class SocketServer {
public static void main(String[] args) throws Exception {
// 服务端口
int port = 55533;
// 创建服务
System.out.println("服务已启动.....");
ServerSocket server = new ServerSocket(port);
// 创建线程池
ThreadPoolExecutor t = new ThreadPoolExecutor(
3, 3, 5, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2));
// 循环监听消息
while (true) {
Socket socket = server.accept();
Runnable r = new Runnable () {
@Override
public void run() {
try {
// 建立好连接后,从socket中获取输入流,并建立缓冲区进行读取
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
//注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-8
sb.append(new String(bytes, 0, len, "UTF-8"));
}
System.out.println(Thread.currentThread().getName() +
"线程执行任务:get message from client: " + sb);
inputStream.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
};
// 用线程池来执行任务
t.submit(r);
}
}
}
执行结果:
服务已启动.....
pool-1-thread-1线程执行任务:get message from client: 客户端发送消息成功!!
pool-1-thread-2线程执行任务:get message from client: 客户端发送消息成功!!
pool-1-thread-3线程执行任务:get message from client: 客户端发送消息成功!!