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
    评论
在FreeRTOS中,`send`函数是用于在TCP/IP网络中发送数据的函数之一。它用于将数据从一个套接字发送到另一个套接字,提供了一种发送数据的基本方式。 FreeRTOS中的`send`函数通常用于网络套接字编程中,主要用于发送TCP数据。其函数原型如下: ```c int send(Socket_t xSocket, const void *pData, size_t xDataLength, BaseType_t xFlags); ``` 参数解释如下: - `xSocket`:要发送数据的套接字。 - `pData`:指向要发送数据的缓冲区的指针。 - `xDataLength`:要发送数据的长度。 - `xFlags`:发送标志,可用于控制发送行为,如是否阻塞等。 `send`函数会将指定长度的数据从缓冲区发送到套接字中,并返回实际发送的字节数。如果发送成功,返回值为发送的字节数;如果发送失败,返回值为负数。常见的错误码包括EAGAIN(资源暂时不可用)和ECONNRESET(连接被重置)等。 在FreeRTOS中,`send`函数通常是阻塞的,也就是说,如果发送缓冲区已满,则函数会一直阻塞等待直到有空间可用或超时发生。可以通过设置套接字选项来修改其阻塞行为。 需要注意的是,`send`函数只负责将数据发送到网络中,而不保证对方是否接收到数据。如果需要确保数据的可靠传输,可能需要结合使用其他机制,如使用TCP协议的确认机制、重传机制等。 总结起来,FreeRTOS中的`send`函数是用于发送TCP数据的函数,通过指定套接字、数据缓冲区、数据长度和发送标志来发送数据,并返回实际发送的字节数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值