package yju.socket ;
import java.io.DataInputStream ;
import java.io.DataOutputStream ;
import java.io.IOException ;
import java.net.InetAddress ;
import java.net.Socket ;
public abstract class SocketTransceiver
implements Runnable {
private boolean runFlag;
public SocketTransceiver
( Socket socket
) { this .socket = socket;
this .addr = socket.getInetAddress ( ) ;
}
return addr;
}
public void start( ) {
runFlag = true ;
}
public void stop( ) {
runFlag = false ;
try {
socket.shutdownInput ( ) ;
in.close ( ) ;
e.printStackTrace ( ) ;
}
}
public boolean send
( String s
) { if ( out != null ) {
try {
out.writeUTF ( s) ;
out.flush ( ) ;
return true ;
e.printStackTrace ( ) ;
}
}
return false ;
}
@Override
public void run( ) {
try {
e.printStackTrace ( ) ;
runFlag = false ;
}
while ( runFlag) {
try {
final String s
= in.
readUTF ( ) ; this .onReceive ( addr, s) ;
runFlag = false ;
}
}
try {
in.close ( ) ;
out.close ( ) ;
socket.close ( ) ;
in = null ;
out = null ;
socket = null ;
e.printStackTrace ( ) ;
}
this .onDisconnect ( addr) ;
}
}
cGFja2FnZSB5anUuc29ja2V0OwoKaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwppbXBvcnQgamF2YS5uZXQuU29ja2V0OwoKCnB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb2NrZXRUcmFuc2NlaXZlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKCglwcm90ZWN0ZWQgU29ja2V0IHNvY2tldDsKCXByb3RlY3RlZCBJbmV0QWRkcmVzcyBhZGRyOwoJcHJvdGVjdGVkIERhdGFJbnB1dFN0cmVhbSBpbjsKCXByb3RlY3RlZCBEYXRhT3V0cHV0U3RyZWFtIG91dDsKCXByaXZhdGUgYm9vbGVhbiBydW5GbGFnOwoKCQoJcHVibGljIFNvY2tldFRyYW5zY2VpdmVyKFNvY2tldCBzb2NrZXQpIHsKCQl0aGlzLnNvY2tldCA9IHNvY2tldDsKCQl0aGlzLmFkZHIgPSBzb2NrZXQuZ2V0SW5ldEFkZHJlc3MoKTsKCX0KCgoJcHVibGljIEluZXRBZGRyZXNzIGdldEluZXRBZGRyZXNzKCkgewoJCXJldHVybiBhZGRyOwoJfQoKCglwdWJsaWMgdm9pZCBzdGFydCgpIHsKCQlydW5GbGFnID0gdHJ1ZTsKCQluZXcgVGhyZWFkKHRoaXMpLnN0YXJ0KCk7Cgl9CgoJCglwdWJsaWMgdm9pZCBzdG9wKCkgewoJCXJ1bkZsYWcgPSBmYWxzZTsKCQl0cnkgewoJCQlzb2NrZXQuc2h1dGRvd25JbnB1dCgpOwoJCQlpbi5jbG9zZSgpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCWUucHJpbnRTdGFja1RyYWNlKCk7CgkJfQoJfQoKCglwdWJsaWMgYm9vbGVhbiBzZW5kKFN0cmluZyBzKSB7CgkJaWYgKG91dCAhPSBudWxsKSB7CgkJCXRyeSB7CgkJCQlvdXQud3JpdGVVVEYocyk7CgkJCQlvdXQuZmx1c2goKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoKCUBPdmVycmlkZQoJcHVibGljIHZvaWQgcnVuKCkgewoJCXRyeSB7CgkJCWluID0gbmV3IERhdGFJbnB1dFN0cmVhbSh0aGlzLnNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTsKCQkJb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0odGhpcy5zb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkpOwoJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKCQkJcnVuRmxhZyA9IGZhbHNlOwoJCX0KCQl3aGlsZSAocnVuRmxhZykgewoJCQl0cnkgewoJCQkJZmluYWwgU3RyaW5nIHMgPSBpbi5yZWFkVVRGKCk7CgkJCQl0aGlzLm9uUmVjZWl2ZShhZGRyLCBzKTsKCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCQkJCgkJCQlydW5GbGFnID0gZmFsc2U7CgkJCX0KCQl9CgkJCgkJdHJ5IHsKCQkJaW4uY2xvc2UoKTsKCQkJb3V0LmNsb3NlKCk7CgkJCXNvY2tldC5jbG9zZSgpOwoJCQlpbiA9IG51bGw7CgkJCW91dCA9IG51bGw7CgkJCXNvY2tldCA9IG51bGw7CgkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCQllLnByaW50U3RhY2tUcmFjZSgpOwoJCX0KCQl0aGlzLm9uRGlzY29ubmVjdChhZGRyKTsKCX0KCgkKCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uUmVjZWl2ZShJbmV0QWRkcmVzcyBhZGRyLCBTdHJpbmcgcyk7CgoJCglwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkRpc2Nvbm5lY3QoSW5ldEFkZHJlc3MgYWRkcik7Cn0K