云服务 v8.0.9版本的 MD5 值为:8d75f41fe0bd4154db770899f4a201ba
以下内容为反编译后的 UdpNioReadWriteProcessor.java 源代码,内容仅作参考
package com.open.net.client.impl.udp.nio.processor;
import com.open.net.client.impl.udp.nio.UdpNioClient;
import com.open.net.client.impl.udp.nio.UdpNioConnectListener;
import com.open.net.client.structures.BaseClient;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.Iterator;
public final class UdpNioReadWriteProcessor {
private static int G_SOCKET_ID;
private BaseClient mClient;
private ConnectRunnable mConnectProcessor;
private String mIp;
private UdpNioConnectListener mNioConnectListener;
private int mPort;
private Selector mSelector;
private DatagramChannel mSocketChannel;
private int mSocketId;
private String TAG = "UdpNioReadWriteProcessor";
private Thread mConnectThread = null;
private boolean closed = false;
public UdpNioReadWriteProcessor(String str, int i, BaseClient baseClient, UdpNioConnectListener udpNioConnectListener) {
this.mIp = "192.168.1.1";
this.mPort = 9999;
int i2 = G_SOCKET_ID + 1;
G_SOCKET_ID = i2;
this.mSocketId = i2;
this.mIp = str;
this.mPort = i;
this.mClient = baseClient;
this.mNioConnectListener = udpNioConnectListener;
}
public void start() {
this.mConnectProcessor = new ConnectRunnable();
Thread thread = new Thread(this.mConnectProcessor);
this.mConnectThread = thread;
thread.start();
}
public synchronized void close() {
this.closed = true;
DatagramChannel datagramChannel = this.mSocketChannel;
if (datagramChannel != null) {
try {
SelectionKey keyFor = datagramChannel.keyFor(this.mSelector);
if (keyFor != null) {
keyFor.cancel();
}
this.mSelector.close();
this.mSocketChannel.socket().close();
this.mSocketChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
this.mSocketChannel = null;
this.mSelector = null;
wakeUp();
}
public void wakeUp() {
ConnectRunnable connectRunnable = this.mConnectProcessor;
if (connectRunnable != null) {
connectRunnable.wakeUp();
}
}
public void onSocketExit(int i) {
close();
System.out.println(this.TAG + "onSocketExit mSocketId " + this.mSocketId + " exit_code " + i);
UdpNioConnectListener udpNioConnectListener = this.mNioConnectListener;
if (udpNioConnectListener != null) {
udpNioConnectListener.onConnectFailed(this);
}
}
public class ConnectRunnable implements Runnable {
private ConnectRunnable() {
}
public void wakeUp() {
if (UdpNioReadWriteProcessor.this.mSelector != null) {
UdpNioReadWriteProcessor.this.mSelector.wakeup();
}
}
@Override
public void run() {
try {
UdpNioReadWriteProcessor.this.mSelector = Selector.open();
UdpNioReadWriteProcessor.this.mSocketChannel = DatagramChannel.open();
boolean z = false;
UdpNioReadWriteProcessor.this.mSocketChannel.configureBlocking(false);
UdpNioReadWriteProcessor.this.mSocketChannel.connect(new InetSocketAddress(UdpNioReadWriteProcessor.this.mIp, UdpNioReadWriteProcessor.this.mPort));
UdpNioReadWriteProcessor.this.mSocketChannel.register(UdpNioReadWriteProcessor.this.mSelector, 1, UdpNioReadWriteProcessor.this.mClient);
((UdpNioClient) UdpNioReadWriteProcessor.this.mClient).init(UdpNioReadWriteProcessor.this.mSocketChannel);
if (UdpNioReadWriteProcessor.this.mNioConnectListener != null) {
UdpNioConnectListener udpNioConnectListener = UdpNioReadWriteProcessor.this.mNioConnectListener;
UdpNioReadWriteProcessor udpNioReadWriteProcessor = UdpNioReadWriteProcessor.this;
udpNioConnectListener.onConnectSuccess(udpNioReadWriteProcessor, udpNioReadWriteProcessor.mSocketChannel);
}
while (!z) {
if (UdpNioReadWriteProcessor.this.mSelector.select() > 0) {
Iterator<SelectionKey> it = UdpNioReadWriteProcessor.this.mSelector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey next = it.next();
it.remove();
if (next.isValid()) {
if (next.isReadable()) {
if (!((BaseClient) next.attachment()).onRead()) {
next.cancel();
next.attach(null);
next.channel().close();
z = true;
break;
}
} else if (!next.isWritable()) {
continue;
} else {
if (!((BaseClient) next.attachment()).onWrite()) {
next.cancel();
next.attach(null);
next.channel().close();
z = true;
break;
}
next.interestOps(1);
}
}
}
}
if (z || UdpNioReadWriteProcessor.this.closed) {
break;
} else if (!UdpNioReadWriteProcessor.this.mClient.mWriteMessageQueen.mWriteQueen.isEmpty()) {
UdpNioReadWriteProcessor.this.mSocketChannel.keyFor(UdpNioReadWriteProcessor.this.mSelector).interestOps(4);
}
}
} catch (Exception e) {
e.printStackTrace();
}
UdpNioReadWriteProcessor.this.onSocketExit(1);
}
}
}