目录
一、服务端
创建数据源,并实现ServerSocket,当有连接进来时,创建Task任务类,交由线程池处理,主程序在s.accept();继续等待新的连接(这个等待是阻塞制的)。
package socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import org.apache.tomcat.jdbc.pool.DataSource;
/**
* 多线程的serverSocket
* @author Administrator
*
*/
public class M {
public static void main(String[] args) {
// 配置数据源
DataSource dataSource = new DataSource();
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/plc?characterEncoding=UTF8");
dataSource.setUsername("root");
dataSource.setPassword("111111");
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setValidationQuery("select 1 from dual");
dataSource.setTestWhileIdle(true);
dataSource.setTimeBetweenEvictionRunsMillis(30000);
dataSource.setMinIdle(5);
dataSource.setInitialSize(5);
System.out.println(dataSource.getMinIdle());
System.out.println(dataSource.getMaxIdle());
System.out.println(dataSource.getMaxActive());
System.out.println(dataSource.getIdle());
System.out.println(dataSource.getActive());
try(ServerSocket s = new ServerSocket(2001)){
ExecutorService pool = Executors.newFixedThreadPool(3);
while(true) {
Socket socket = s.accept();
pool.execute(new Task(socket,dataSource));
ThreadPoolExecutor t = (ThreadPoolExecutor)pool;
System.out.println("active:"+t.getActiveCount());
System.out.println("core:"+t.getCorePoolSize());
System.out.println("TaskCount"+t.getTaskCount());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、Task任务类。
任务类里,通过socket.getInputStream()构建Scanner,从而读取请求信息(字符串),将字符串解析之后存入数据库。完成数据入库后,通过socket.getOutputStream()构建PrintWriter,从而写入信息返回给客户端。
package socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
import org.apache.tomcat.jdbc.pool.DataSource;
public class Task implements Runnable {
private Socket socket;
private DataSource dataSource;
public Task(Socket socket,DataSource dataSource) {
super();
this.socket = socket;
this.dataSource = dataSource;
}
@Override
public void run() {
try (InputStream inputStream = this.socket.getInputStream();
Scanner scanner = new Scanner(inputStream);
OutputStream out = socket.getOutputStream();
PrintWriter pw = new PrintWriter(out);){
boolean flag = true;
while(flag && scanner.hasNextLine()) {
String line = scanner.nextLine();
if(line.trim().equals("exit")) {
flag = false;
pw.write("End");
pw.flush();
continue;
}
// 放入线程池,进行数据入库。
try (Connection connection = dataSource.getConnection();){
// line 入库
// 业务逻辑SSS
String[] split = line.split("\\|");
if (split.length != 9 && split.length != 10) {
throw new Exception("异常,数据应该为9列或10列");
}
String sql2 = "insert into plc_first4(ser_no,gong_xu_hao,niu_ju,jiao_du,ok_ng,gong_ju_hao,da_yin_ma,create_time)"
+ "values (?,?,?,?,?,?,?,now())";
PreparedStatement statement2 = connection.prepareStatement(sql2);
statement2.setString(1, split[0]);
statement2.setString(2, split[3]);
statement2.setString(3, split[4]);
statement2.setString(4, split[5]);
statement2.setString(5, split[6]);
statement2.setString(6, split[7]);
statement2.setString(7, split[8]);
statement2.execute();
statement2.close();
pw.write("e");
pw.flush();
// 业务逻辑EEE
connection.close();
} catch (Exception e) {
pw.write("f");
pw.flush();
e.printStackTrace();
}
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、客户端请求
构建Socket对象,通过client.getOutputStream();获取输出流,写入请求信息。完成之后获取输入流,从而读取服务端返回的信息,并打印出来。
package socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* 客户端请求
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) throws Exception {
String ip ="127.0.0.1";
Socket client = new Socket(ip, 2001);
OutputStream outputStream = client.getOutputStream();
outputStream.write("7005315-HS01*20240426001|1|1,3,4,2,8,P|1|8.67|0|OK| OP10|0|\n".getBytes());
InputStream inputStream = client.getInputStream();
byte[] b = new byte[1024];
int read = inputStream.read(b);
System.out.println(""+new String(b,0,read));
outputStream.flush();
client.shutdownOutput();
client.close();
}
}