分享一个打开COM口和Socket口进行通讯的java方法

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;
	}
}

如果发现个别代码行有问题的可以自行更正,因为代码是修改删减过的,删减了与数据库操作的相关代码,如果导致有问题直接修改一下就好了,没多大问题。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值