Xsocket

xSocket是一个易于使用的基于NIO库来构建高性能,可扩展的网络应用。 它支持写入以及服务器端的应用,以直观的方式客户端应用程序。 检测问题,如低水平NIO选择编程,连接池管理,连接超时被封装的xSocket。

pom.xml

       <dependency>
			<groupId>org.xsocket</groupId>
			<artifactId>xSocket</artifactId>
			<version>2.8.15</version>
		</dependency>

建立连接,向服务端发送消息,获取返回值

public static String doCommunication(String uri, Integer port, int connectTimeout, String reqXml) throws IOException {
			System.out.println("uri:"+uri+" port:"+port);
			// 采用非阻塞式的连接
			INonBlockingConnection nbc = new NonBlockingConnection(uri, port, new ClientHandler());
			// 设置连接超时时,超时时间60秒
			nbc.setConnectionTimeoutMillis(connectTimeout);
			// 立即释放端口
			nbc.setAutoflush(true);

			// 采用阻塞式的连接
			// IBlockingConnection bc = new BlockingConnection("localhost", PORT);
			// 一个非阻塞的连接是很容易就变成一个阻塞连接
			IBlockingConnection bc = new BlockingConnection(nbc);
			// 设置编码格式
			bc.setEncoding("UTF-8");
			// 设置是否自动清空缓存
			bc.setAutoflush(true);
			// 向服务端写数

			// 获取报文头长度,设置8位报文头
//			String sndMsgHdrLen =String.format("%08d", reqXml.getBytes("utf-8").length);
			// 报文体
			String length = String.format("%1$07d", reqXml.length());

			reqXml = length + reqXml;
			logger.info(reqXml);
			byte[] msgbyte = reqXml.getBytes("utf-8");

			// 发送请求
			bc.write(msgbyte);

			//接收报文头,设置报文头8位长度
			byte[] rcvHdr= bc.readBytesByLength(7);
			//获取报文头长度
			int  hdrLen = Integer.parseInt(new String(rcvHdr,"UTF-8"));
			//接收报文体
			byte[] rcvBody= bc.readBytesByLength(hdrLen);

			String msg = new String(rcvBody,"utf-8");
			logger.info("rcvBody:"+msg);

			/*		System.out.println("rcvHdr len:"+hdrLen);
			System.out.println("rcvBody:"+new String(rcvBody,"UTF-8"));*/

			//将信息清除缓存
			bc.flush();
			bc.close();
					
			return msg;
	}
import java.io.IOException;
import java.nio.BufferUnderflowException;
import java.nio.channels.ClosedChannelException;

import org.xsocket.MaxReadSizeExceededException;
import org.xsocket.connection.IConnectHandler;
import org.xsocket.connection.IDataHandler;
import org.xsocket.connection.IDisconnectHandler;
import org.xsocket.connection.INonBlockingConnection;

/**
 * 客户端定义数据的处理类
 *
 */
public class ClientHandler implements IDataHandler ,IConnectHandler ,IDisconnectHandler{

	/**
	 * 连接的成功时的操作
	 */
	@Override
	public boolean onConnect(INonBlockingConnection nbc) throws IOException,
			BufferUnderflowException, MaxReadSizeExceededException {
		String  remoteName=nbc.getRemoteAddress().getHostName();
		System.out.println("remoteName "+remoteName +" has connected !");
		return true;
	}
	/**
	 * 连接断开时的操作
	 */
	@Override
	public boolean onDisconnect(INonBlockingConnection nbc) throws IOException {
		return false;
	}
	/**
	 *
	 * 接收到数据库时候的处理
	 */
	@Override
	public boolean onData(INonBlockingConnection nbc) throws IOException,
			BufferUnderflowException, ClosedChannelException,
			MaxReadSizeExceededException {
		String data=nbc.readStringByDelimiter("|");
		nbc.write("--|Client:receive data from server sucessful| -----");
		nbc.flush();
		System.out.println(data);
		return true;
	}
	
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值