package ;
import ;
import ;
import .;
import ;
import ;
import ;
import ;
import ;
import .Md5Utils;
import ;
import ;
import .*;
import ;
import ;
import ;
import ;
/*** LAN broadcast communication, UPD*/
public class UPDService {
private volatile boolean doing = false;
private volatile AtomicLong msgIndesx = new AtomicLong(0);
private final String project;
/*** Broadcast mode*/
private volatile DatagramSocket socket;
private final DatagramPacket packet = new DatagramPacket("".getBytes(), "".getBytes().length, ("255.255.255.255"), 0);
private volatile ConcurrentHashMap<String, UPDInetSocketAddress> addresses = new ConcurrentHashMap<>();
public UPDService(String project) throws SocketException, UnknownHostException {
this.project = project;
}
public void start() {
try {
socket = new DatagramSocket();
(true);
scan();
} catch (SocketException e) {
throw new RuntimeException(e);
}
}
public void scan() {
if (doing) {
} else {
doing = true;
//Perception
(project).(() -> {
(project).(new Scaner(0, 5000));
(project).(new Scaner(5001, 10000));
(project).(new Scaner(10001, 15000));
(project).(new Scaner(15001, 20000));
(project).(new Scaner(20001, 25000));
(project).(new Scaner(25001, 30000));
(project).(new Scaner(30001, 35000));
(project).(new Scaner(35001, 40000));
(project).(new Scaner(40001, 45000));
(project).(new Scaner(45001, 50000));
(project).(new Scaner(50001, 55000));
(project).(new Scaner(55001, 60000));
(project).(new Scaner(60001, 65535));
});
//Perception, information, and life
(project).(() -> {
byte[] receiveBuffer = new byte[1500];
final DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, );
while (!()) {
try {
(receivePacket);
String receivedData = new String((), 0, (), StandardCharsets.UTF_8);
BaseMessage message = (receivedData);
if (() instanceof UPDMessage) {
if (check(((UPDMessage) ()).getToken())) {
if (!(() + ":" + ())) {
(project).sysMessage("Discover::" + () + ":" + ());
}
(() + ":" + (), new UPDInetSocketAddress((), ()));
}
} else if (() instanceof TextMessage) {
if (() < () && ((), ())) {
(project).chatMessage(((TextMessage) ()).getMessage(), ().getName());
}
}
} catch (IOException e) {
} catch (Exception e) {
}
}
});
}
}
public <T extends BaseUser> void send(T o) {
byte[] message = new byte[0];
message = (().id(()).message(o).build()).getBytes(StandardCharsets.UTF_8);
(message);
();
long time = new Date().getTime();
for (UPDInetSocketAddress address : ()) {
if ( >= time) {
(address);
try {
(packet);
} catch (IOException e) {
}
}
}
}
private boolean check(String token) {
if ((token)) return false;
return Md5Utils.getMD5(new Date().getTime() / 1000000 + "", StandardCharsets.UTF_8.name()).equalsIgnoreCase(token);
}
public void shutDowm() {
();
doing = false;
();
}
private class UPDInetSocketAddress extends InetSocketAddress {
public final long outTime = (new Date(), 1).getTime();
public UPDInetSocketAddress(int port) {
super(port);
}
public UPDInetSocketAddress(InetAddress addr, int port) {
super(addr, port);
}
public UPDInetSocketAddress(String hostname, int port) {
super(hostname, port);
}
}
private class Scaner implements Runnable {
private final DatagramPacket scanPacket;
{
try {
scanPacket = new DatagramPacket("".getBytes(), "".getBytes().length, ("255.255.255.255"), 0);
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
}
int start;
int end;
public Scaner(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public void run() {
while (!()) {
for (int portD = (start + end) / 2, portU = ((start + end) / 2) + 1; portU <= end && portD >= start && !(); portD--, portU++) {
try {
(1);
} catch (InterruptedException e) {
}
try {
BaseMessage<BaseUser> build = ().message(().token(Md5Utils.getMD5(new Date().getTime() / 1000000 + "", StandardCharsets.UTF_8.name())).build()).build();
String string = (build);
byte[] bytes = (StandardCharsets.UTF_8);
(bytes);
();
(portU);
(scanPacket);
//(project).(true,"start aware port:"+portU);//(project).sysMessage("Start aware port:"+portU);
(portD);
(scanPacket);
//(project).(true,"Start aware port:"+portD);//(project).sysMessage("Start aware port:"+portD);
} catch (IOException e) {
}
}
}
}
}
}