クライアントのリクエストを待って、クライアントに応答を送信するUDPserverがあります。クライアントがオンラインかどうかを確認するには、クライアントにメッセージを送信する必要があります(確認するため)。しかし!クライアントの PC ユーザーは、メッセージを選択してサーバーに送信し、サーバーからの応答を待つことができます。そのようなことを行う方法-ユーザーはサーバーにメッセージを送信できますが、同時にクライアントはサーバーからメッセージを受信できますか?クライアントreadLine
をあるスレッドとrecieve
別のスレッドに入れますか?
これがクライアントのメインループです(ds - DatagramSocket.Client - 自分のクラス)
while(true){
try{
//variable client we use it in every condition
Client obj = null;
ds = null;
//REGR - registration FNDI - find ip FNDM - find mask GETL - get all CHKA - check all
System.out.println("PORT - ");
int port = Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
ds = new DatagramSocket(port);
//wait for user's choice
System.out.println("Commands - REGR,FNDI,FNDM,GETL,CHKA");
String cmd = new BufferedReader(new InputStreamReader(System.in)).readLine();
if (cmd.equals("REGR"))
{
//sending data to server and waiting for its response
}
else if (cmd.equals("FNDI"))
{
//same
}
else if (cmd.equals("FNDM"))
{
//same
}
else if (cmd.equals("GETL"))
{
//same
}
else if(cmd.equals("CHKA"))//CHKA
{
//same
}
}catch(Exception exc)
{
System.out.println(exc);
return;
}
finally
{
if (ds!=null)
ds.close();
}
}
メインサーバーのループ
while(!stop){
myfile.write(aam.InputMsg.name());
System.out.println(aam.InputMsg);
DatagramPacket pack = new DatagramPacket(buf,buf.length);
socket.receive(pack);
//ports.add(pack.getPort());
//object from pack
Object o = Deserialize.Deserialization(buf);
//ok. first - REGR - so check on Client
if (o instanceof Client)//registration
{
//perform some task
}
else if (o instanceof InetAddress)//find client by IP
{
//same
}
else if (o instanceof String)//different messages - name to find, start test.
{
//same
}
else
{
throw new Exception("SOME WRONG DATA FROM CLIENT");
}
}
System.out.println("Server stopped");
}
catch(Exception exc)
{
System.out.println(exc);
}
finally{
if (socket!=null){
socket.close();
}
}
}