Código fuente JAVA ssc
Otro método simple es simplemente enviar el mensaje y usar la API directamente.
/**
*Envía el mensaje de forma asincrónica y ciérralo después de enviarlo.
* @param remoteSocketAddress
* @param msg
* @return
*/
público estático booleano sendSocketMsgNio(InetSocketAddress remoteSocketAddress, String msg){
//byte buffer w_buf = byte buffer.allocation(msg.getBytes(). length);
byte[ ]salida de datos = msg . getbytes();
buffer de bytes = buffer de bytes asignar(salida de datos. longitud);
Pruebe {
canal de socket sc = canal de socket. . open();
sc . connect(remoteSocketAddress);
buffer.put(dataOutput, 0, salida de datos . length); ();
sc.write(búfer);
sistema fuera . p>Devuelve verdadero
} catch (IOException e) {
Logger.error("¡¡Error al enviar datos!!!"+e . getmessage()
);Devuelve falso
}
}
Para el primer caso, el código básico es el siguiente:
Clase pública ChannelClient implementa Runnable {
Dirección InetSocketAddress privada;
Cliente de canal público (dirección remota InetSocketAddress){
this.address = dirección remota
}
public void run(){
prueba {
selector selector = selector open();
canal de socket sc = socket. canal . open();
sc .configurar bloqueo(false);
sc.connect(dirección);
sc.register( Selector, clave de selección). . OP_CONNECT);
//Escuchar
mientras (verdadero) {
prueba {
int num = 0;
p>num = selector.select();
if(num >0) {
Iterador <SelectKeys>it = selector.selectedKeys ().
iterador();
mientras (it.hasNext()) {
tecla de selección clave = it . next();
int ready ops = clave. operaciones listas();
it . remove();
//Manejar eventos IO
if((operaciones listas y tecla de selección. OP_CONNECT) == SelectionKey. OP_CONNECT) {
sc. finalizar conectar();
proceso de cliente de socket. );
sc.register(selector, clave de selección. OP_READ);
}
if((operaciones listas y clave de selección. OP_READ) = = Tecla de selección.
OP_READ) {
Pruebe {
processRead(sc);
}catch(Exception e) {
sc close(). ;
Romper;
}
}
}
}
} catch(Excepción e) {
e . printstacktrace();
Continuar
}
}
} catch(Exception e) {
e . printstacktrace();
}
}
privado estático int BUFFER _ TAMAÑO = 10240;
byte público[]proceso de lectura(canal de socket sc){
Prueba {
byte BUFFER BUFFER = byte BUFFER asignar(BUFFER _ TAMAÑO. );
búfer de cadena s = nuevo búfer de cadena();
int r = 0;
booleano isWait = verdadero
mientras ((r = sc . read(buffer))& gt;=0) {
if(r==0){
if(isWait){
mientras(verdadero){
hilo . dormir(1);
r=sc.read(búfer); 0){
isWait = false
Break;
}
}
}else{< / p>
Romper;
}
}
búfer . flip();
byte[]datos = nuevo byte [búfer . límite()];
buffer.get(datos);
s.append(nueva cadena(datos));
BUFFER = byte BUFFER . asignar(BUFFER _ TAMAÑO);
buffer .clear();
}
sistema println("-cliente recibido- "). ;
sistema . println(s . tostring());
sistema . println("-"); (). getBytes();
} catch(Excepción e) {
Devolver nulo
}
}
}
Si tienes alguna duda, puedes enviar un correo electrónico para comunicarte: qfylwc@126.com.