package com.easysocket.connection.connect;
|
|
import com.easysocket.config.DefaultX509ProtocolTrustManager;
|
import com.easysocket.config.SocketSSLConfig;
|
import com.easysocket.connection.action.SocketStatus;
|
import com.easysocket.entity.SocketAddress;
|
import com.easysocket.utils.LogUtil;
|
import com.easysocket.utils.Utils;
|
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.OutputStream;
|
import java.net.InetSocketAddress;
|
import java.net.Socket;
|
import java.security.SecureRandom;
|
|
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLSocketFactory;
|
import javax.net.ssl.TrustManager;
|
|
/**
|
* Author:Alex
|
* Date:2019/5/29
|
* Note:tcp连接
|
*/
|
public class TcpConnection extends SuperConnection {
|
/**
|
* socket对象
|
*/
|
private Socket socket;
|
|
public TcpConnection(SocketAddress socketAddress) {
|
super(socketAddress);
|
}
|
|
@Override
|
protected void openConnection() throws Exception {
|
try {
|
socket = getSocket();
|
} catch (Exception e) {
|
e.printStackTrace();
|
connectionStatus.set(SocketStatus.SOCKET_DISCONNECTED); // 设置为未连接
|
throw new RuntimeException("创建socket失败");
|
}
|
|
// 进行socket连接
|
socket.connect(new InetSocketAddress(socketAddress.getIp(), socketAddress.getPort()), socketOptions.getConnectTimeout());
|
|
// 关闭Nagle算法,无论TCP数据报大小,立即发送
|
socket.setTcpNoDelay(true);
|
// 连接已经打开
|
if (socket.isConnected() && !socket.isClosed()) {
|
onConnectionOpened();
|
}
|
}
|
|
@Override
|
protected void closeConnection() throws IOException {
|
if (socket != null)
|
socket.close();
|
}
|
|
/**
|
* 根据配置信息获取对应的socket
|
*
|
* @return
|
*/
|
private synchronized Socket getSocket() throws Exception {
|
// 自定义的socket生成工厂
|
if (socketOptions.getSocketFactory() != null) {
|
return socketOptions.getSocketFactory().createSocket(socketAddress, socketOptions);
|
}
|
// 默认操作
|
SocketSSLConfig config = socketOptions.getEasySSLConfig();
|
if (config == null) {
|
return new Socket();
|
}
|
// 获取SSL配置工厂
|
SSLSocketFactory factory = config.getCustomSSLFactory();
|
if (factory == null) {
|
String protocol = "SSL";
|
if (!Utils.isStringEmpty(config.getProtocol())) {
|
protocol = config.getProtocol();
|
}
|
|
TrustManager[] trustManagers = config.getTrustManagers();
|
if (trustManagers == null || trustManagers.length == 0) {
|
// 缺省信任所有证书
|
trustManagers = new TrustManager[]{new DefaultX509ProtocolTrustManager()};
|
}
|
|
try {
|
SSLContext sslContext = SSLContext.getInstance(protocol);
|
sslContext.init(config.getKeyManagers(), trustManagers, new SecureRandom());
|
return sslContext.getSocketFactory().createSocket();
|
} catch (Exception e) {
|
if (socketOptions.isDebug()) {
|
e.printStackTrace();
|
}
|
LogUtil.e(e.getMessage());
|
return new Socket();
|
}
|
|
} else {
|
try {
|
return factory.createSocket();
|
} catch (IOException e) {
|
if (socketOptions.isDebug()) {
|
e.printStackTrace();
|
}
|
LogUtil.e(e.getMessage());
|
return new Socket();
|
}
|
}
|
}
|
|
|
@Override
|
public InputStream getInputStream() {
|
if (socket != null && socket.isConnected() && !socket.isClosed()) {
|
try {
|
return socket.getInputStream();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
return null;
|
}
|
|
@Override
|
public OutputStream getOutStream() {
|
if (socket != null && socket.isConnected() && !socket.isClosed()) {
|
try {
|
return socket.getOutputStream();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
return null;
|
}
|
}
|