java打开COM口和Socket口进行通讯的方法
引言
有的公司需要用软件对硬件进行通讯,这里整理一份打开socket口(串口服务器)和COM口的方法。
自行优化,仅做参考。
一、COM口
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
/**
* COM 口通讯的实体类
*/
public class ComUtil {
/** 用 MAP 储存 SerialPort 类的信息 */
public static Map<String, SerialPort> map = new HashMap<String, SerialPort>();
public static CommPortIdentifier commPortIdentifier;
/** 打开COM口线程 */
public boolean openCom(String Ip,int Port){//这里的IP就是COM,例如COM1,COM2,COM3,Port就是波特率
boolean flag = false;
try {
//COM的端口号
commPortIdentifier = CommPortIdentifier.getPortIdentifier(Ip);
SerialPort serialPort = (SerialPort) commPortIdentifier.open(Ip, 5000);//5秒没连接上就判定有问题,可自由设定
serialPort.setSerialPortParams(Integer.parseInt(Port), SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
flag = true;
//放入数组,根据ipPort取出
map.put(ip+":"+Port, serialPort);
System.out.println(map.get(ipPort)+"被成功启动");
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/** 关闭COM口线程 */
public boolean closeCom(String Ip,int Port){
boolean flag = true;
String ipPort = Ip + ":"+ Port;
try {
if(map.get(ipPort).getOutputStream() != null)
map.get(ipPort).getOutputStream().close();
if(map.get(ipPort).getInputStream() != null)
map.get(ipPort).getInputStream().close();
if(map.get(ipPort) != null)
map.get(ipPort).close();
} catch (IOException e) {
e.printStackTrace();
flag = false;
}
return flag;
}
/** 重启COM口线程 */
public void restart(String Ip,int Port){
String ipPort = Ip + ":"+ Port;
if(COMUTIL == null){
COMUTIL = new ComUtil();
closeCom(Ip,Port);
COMUTIL.openCom(Ip,Port);
} else {
closeCom(Ip,Port);
COMUTIL.openCom(Ip,Port);
}
}
/** 传输数据的类,用于发送指令 */
public synchronized byte[] sendOrder(byte[] byt,String Ip,int Port){
String ipPort = Ip + ":"+ Port;
byte[] byteBuffer = null;
try {
map.get(ipPort).getOutputStream().write(byt, 0, byt.length);
map.get(ipPort).getOutputStream().flush();
Thread.sleep(1000);
int count = map.get(ipPort).getInputStream().available();
if(count > 0){
byteBuffer = new byte[count];
map.get(ipPort).getInputStream().read(byteBuffer);
}
} catch (IOException e) {
restart(Ip,Port);
System.out.println(ipPort+"-------socket写入异常--------");
} catch(NullPointerException e){
restart(Ip,Port);
System.out.println(ipPort+"-------socket空指针异常--------");
} catch (Exception e) {
restart(Ip,Port);
System.out.println(ipPort+"-------其他异常--------");
}
return byteBuffer;
}
/** 取出数据 */
public byte[] getOrder(String Ip,int Port){
String ipPort = Ip + ":"+ Port;
byte[] byteBuffer = null;
try {
Thread.sleep(100);
int count = map.get(ipPort).getInputStream().available();
if(count != 0){
byteBuffer = new byte[count];
map.get(ipPort).getInputStream().read(byteBuffer);
}
} catch (InterruptedException e) {
restart(Ip,Port);
System.out.println(ipPort+"-------中断异常--------");
} catch (IOException e) {
restart(Ip,Port);
System.out.println(ipPort+"-------socket读取异常--------");
}
return byteBuffer;
}
}
二、Socket口通讯
import java.io.IOException;
import java.net.ConnectException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;
public class SocketUtil {
public static Map<String,Socket> SOCKET = new HashMap<String, Socket>();
private SocketUtil socketUtil;
/** 打开Socket通讯*/
public boolean openSocket(String Ip,int Port){
boolean flag = false;
String ipPort = Ip + ":"+ Port;
try {
Socket sock = new Socket();
SocketAddress socAddress = new InetSocketAddress(Ip,Port);
sock.connect(socAddress,5000);//5秒没连接上就判定有问题,可自由设定
SOCKET.put(ipPort, sock);
flag = true;
} catch(SocketTimeoutException e1){
System.out.println(ipPort+"---连接超时");
} catch (UnknownHostException e1) {
System.out.println(ipPort+"---无法识别主机地址");
} catch (ConnectException e1) {
System.out.println(ipPort+"---无法连接指定IP或端口号");
} catch (SocketException e1) {
System.out.println(ipPort+"---socket异常");
} catch (IOException e1) {
System.out.println(ipPort+"---IO流操作异常");
} catch (Exception e) {
System.out.println(ipPort+"---其他异常");
}
return flag;
}
/** 关闭Socket通信*/
public boolean closeSocket(String Ip,int Port){
String ipPort = Ip+":"+ Port;
boolean flag = true;
try {
if(SOCKET.get(ipPort).getOutputStream() != null){
SOCKET.get(ipPort).getOutputStream().close();
}
if(SOCKET.get(ipPort).getInputStream() != null){
SOCKET.get(ipPort).getInputStream().close();
}
if(SOCKET.get(ipPort) != null){
SOCKET.get(ipPort).close();
}
} catch (IOException e) {
flag = false;
}
return flag;
}
/** 重置Socket*/
public void resetSocket(String Ip, int Port){
if(SOCKET_UTIL == null){
SOCKET_UTIL = new SocketUtil();
closeSocket(Ip,Port);
SOCKET_UTIL.openSocket(Ip,Port);
}else{
closeSocket(Ip,Port);
SOCKET_UTIL.openSocket(Ip,Port);
}
}
/** 向串口发送char[]数据
* @throws InterruptedException */
public synchronized byte[] sendOrder(byte[] byt,String Ip, int port) throws InterruptedException{
String ipPort = Ip +":"+ port;
byte[] byteBuffer = null;
try {
SOCKET.get(ipPort).getOutputStream().write(byt, 0, byt.length);
SOCKET.get(ipPort).getOutputStream().flush();
Thread.sleep(1000);
int count = SOCKET.get(ipPort).getInputStream().available();
if(count > 0){
byteBuffer = new byte[count];
SOCKET.get(ipPort).getInputStream().read(byteBuffer);
}
} catch (IOException e) {
resetSocket(Ip,port);
System.out.println(ipPort+"-------socket写入异常--------");
} catch(NullPointerException e){
resetSocket(Ip,port);
System.out.println(ipPort+"-------socket空指针异常--------");
} catch (Exception e) {
resetSocket(Ip,port);
System.out.println(ipPort+"-------其他异常--------");
}
return byteBuffer;
}
public synchronized byte[] sendOrder1(byte[] byt,String Ip , int Port) throws InterruptedException{
String ipPort = Ip + Port;
byte[] byteBuffer = null;
try {
SOCKET.get(ipPort).getOutputStream().write(byt, 0, byt.length);
SOCKET.get(ipPort).getOutputStream().flush();
Thread.sleep(1500);
int count = SOCKET.get(ipPort).getInputStream().available();
if(count > 0){
byteBuffer = new byte[count];
SOCKET.get(ipPort).getInputStream().read(byteBuffer);
}
} catch (IOException e) {
resetSocket(Ip,Port);
System.out.println(ipPort+"-------socket写入异常--------");
} catch(NullPointerException e){
resetSocket(Ip,Port);
System.out.println(ipPort+"-------socket空指针异常--------");
} catch (Exception e) {
resetSocket(Ip,Port);
System.out.println(ipPort+"-------其他异常--------");
}
return byteBuffer;
}
/** 读取串口返回来的byte[]数据*/
public byte[] getOrder(String Ip, int Port){
String ipPort = Ip + Port;
byte[] byteBuffer = null;
try {
Thread.sleep(100);
int count = SOCKET.get(ipPort).getInputStream().available();
if(count != 0){
byteBuffer = new byte[count];
SOCKET.get(ipPort).getInputStream().read(byteBuffer);
}
} catch (InterruptedException e) {
resetSocket(Ip,Port);
System.out.println(ipPort+"-------中断异常--------");
} catch (IOException e) {
resetSocket(Ip,Port);
System.out.println(ipPort+"-------socket读取异常--------");
}
return byteBuffer;
}
}
如果发现个别代码行有问题的可以自行更正,因为代码是修改删减过的,删减了与数据库操作的相关代码,如果导致有问题直接修改一下就好了,没多大问题。