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