All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.weicoder.common.socket.TcpClient Maven / Gradle / Ivy

package com.weicoder.common.socket;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.SocketChannel;

import com.weicoder.common.constants.ArrayConstants;
import com.weicoder.common.io.AsynChannelUtil;
import com.weicoder.common.io.ChannelUtil;
import com.weicoder.common.io.IOUtil;
import com.weicoder.common.log.Logs;

/**
 * TCP 客户端发包处理器
 * 
 * @author WD
 */
public final class TcpClient {
	/**
	 * bio模式发送数据 不接收返回数据
	 * 
	 * @param host
	 * @param port
	 * @param data
	 */
	public static void send(String host, int port, byte[] data) {
		send(host, port, data, false);
	}

	/**
	 * bio模式发送数据
	 * 
	 * @param  host 服务器主机
	 * @param  port 服务器端口
	 * @param  data 发送数据
	 * @param  read 是否读取回执数据
	 * @return      byte[] 字节流
	 */
	public static byte[] send(String host, int port, byte[] data, boolean read) {
		return send(new InetSocketAddress(host, port), data, read);
	}

	/**
	 * bio模式发送数据
	 * 
	 * @param  addr 服务器调用地址
	 * @param  data 发送数据
	 * @param  read 是否读取回执数据
	 * @return      byte[] 字节流
	 */
	public static byte[] send(InetSocketAddress addr, byte[] data, boolean read) {
		// 实例化Socket
		try (Socket socket = new Socket()) {
			// 连接服务器
			socket.connect(addr);
			// 写入数据流
			IOUtil.write(socket.getOutputStream(), data, false);
			// 读取数据
			if (read) {
				socket.shutdownOutput();
				return IOUtil.read(socket.getInputStream(), false);
			}
		} catch (IOException e) {
			Logs.error(e);
		}
		return ArrayConstants.BYTES_EMPTY;
	}

	/**
	 * nio模式发送数据
	 * 
	 * @param host 服务器主机
	 * @param port 服务器端口
	 * @param data 发送数据
	 */
	public static void write(String host, int port, byte[] data) {
		write(host, port, data, false);
	}

	/**
	 * nio模式发送数据
	 * 
	 * @param  host 服务器主机
	 * @param  port 服务器端口
	 * @param  data 发送数据
	 * @param  read 是否读取回执数据
	 * @return      接收的数据
	 */
	public static byte[] write(String host, int port, byte[] data, boolean read) {
		return write(new InetSocketAddress(host, port), data, read);
	}

	/**
	 * nio模式发送数据
	 * 
	 * @param  addr 服务器调用地址
	 * @param  data 发送数据
	 * @param  read 是否读取回执数据
	 * @return      接收的数据
	 */
	public static byte[] write(InetSocketAddress addr, byte[] data, boolean read) {
		// 实例化Socket
		try (SocketChannel socket = SocketChannel.open()) {
			// 连接服务器
			socket.connect(addr);
			// 写入数据流
			ChannelUtil.write(socket, data, false);
			// 读取数据
			if (read) {
				socket.shutdownOutput();
				return ChannelUtil.read(socket, false);
			}
		} catch (IOException e) {
			Logs.error(e);
		}
		return ArrayConstants.BYTES_EMPTY;
	}

	/**
	 * aio模式发送数据
	 * 
	 * @param host 服务器主机
	 * @param port 服务器端口
	 * @param data 发送数据
	 */
	public static void asyn(String host, int port, byte[] data) {
		asyn(host, port, data, false);
	}

	/**
	 * aio模式发送数据 接收返回数据
	 * 
	 * @param  host 服务器主机
	 * @param  port 服务器端口
	 * @param  data 发送数据
	 * @param  read 是否读取数据
	 * @return      接收的数据
	 */
	public static byte[] asyn(String host, int port, byte[] data, boolean read) {
		return asyn(new InetSocketAddress(host, port), data, read);
	}

	/**
	 * aio模式发送数据 接收返回数据
	 * 
	 * @param  addr 服务器调用地址
	 * @param  data 发送数据
	 * @param  read 是否读取数据
	 * @return      接收的数据
	 */
	public static byte[] asyn(InetSocketAddress addr, byte[] data, boolean read) {
		// 实例化Socket
		try (AsynchronousSocketChannel socket = AsynchronousSocketChannel.open()) {
			// 连接服务器
			socket.connect(addr).get();
			// 写入数据流
			AsynChannelUtil.write(socket, data, false);
			// 读取数据
			if (read) {
				socket.shutdownOutput();
				return AsynChannelUtil.read(socket, false);
			}
		} catch (Exception e) {
			Logs.error(e);
		}
		return ArrayConstants.BYTES_EMPTY;
	}

	private TcpClient() {
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy