同上一篇进制转换,PLC与系统进行交互,我写的是服务端:
public class Server {
/**
* 服务端运行的socket,负责申请端口
* 接收客户端的连接,并生成与客户端通讯的socket
*/
private ServerSocket server;
/**
* 构造方法,初始化服务端,端口号8888
*/
public Server() throws Exception {
try {
server = new ServerSocket(8888);
} catch (IOException e) {
e.printStackTrace();
throw e;
}
}
/**
* 服务端开始工作
*/
public void start() throws Exception{
try{
/**
* ServerSocket 提供了一个方法 Socket accept();
* 该方法是一个阻塞方法,会一直监听其打开的8888端口,等待客户端连接
* 一旦连接后,该方法会返回与客户端交互的socket
*/
while(true){
System.out.println("等待plc连接");
Socket socket = server.accept();
System.out.println("一个plc连接上了!");
/**
* 通过Socket获取输入流,来获取plc发送过来的数据
*/
try{
InputStream input = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(input,"UTF-8");
BufferedReader br = new BufferedReader(isr);
String message = null;
PlcInsFactory plcInsFactoryHandler = new PlcInsFactory();//PLC指令工厂
Thread t = null;
while((message=br.readLine())!=null){
BytesChange bc = new BytesChange();
String instruction = bc.bytes2hex(message);
System.out.println("plc端:" + instruction);
//PLC指令工厂,返回一个线程与plc指令进行交互
t = plcInsFactoryHandler.Entrance(instruction, socket);
t.start();
Thread.sleep(50);
}
}catch (Exception e){
System.out.println("PLC指令异常");
}finally {
System.out.println("PLC断开连接!");
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}catch(Exception e){
e.printStackTrace();
throw e;
}
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
try{
Server server = new Server();
server.start();
}catch (Exception e){
System.out.println("服务端运行失败!");
}
}
}