androidとネットワーク(中)socketの罠
Ajaxのように、ユーザーが出力するとサーバーで出力の結果を返す必要がある場合があります.例えば、ユーザーが123を出力し、コンソールの上に123を出力し、ユーザーが234を出力します.コンソールの上に234があります.もちろん、コードは困惑しません.
はい、運転を開始し、123を入力します.コンソールはすぐに123に戻り、456を入力し続けます.コンソールは反応していません.これ以上負けても、反応しない.コードに間違いがあるのではないかと疑う学生もいます.whileサイクルでSystemだと思っています.out.println(str)という言葉は実行されず、頭が大きくなりました.実はこのコードは完全に間違っていません.なぜなら、実際に2つのプログラムを実行したからです.2回目の実行時にeclipseのコンソールはサービス側に渡されたので、コンソールでの操作は実際にサービス側の操作であり、もちろん役に立たないからです.
機能する場合は、コードは次のように書きます.
この結果、コンソールはクライアントの手に渡っており、サーバはクライアントのコンソールにデータを返します.文字を入力するとすぐに表示されます.endを入力すると、クライアントが切断され、サーバ側がコンソールを取得するので、「すべてのデータが一緒に表示されている」ことがわかります.
public class MyServer {
public static void main(String[] args) throws IOException{
ServerSocket server=new ServerSocket(6666);
Socket client=server.accept();
BufferedReader in=
new BufferedReader(new InputStreamReader(client.getInputStream()));
while(true){
String str=in.readLine();
System.out.println(str);
if(str.equals("end"))
break;
}
client.close();
}
}
public class ClientSocket{
static Socket server;
public static void main(String[] args)throws Exception{
server=new Socket(InetAddress.getLocalHost(),6666);
PrintWriter out=new PrintWriter(server.getOutputStream());
BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));
while(true){
String str=wt.readLine();
out.println(str);
//
out.flush();
if(str.equals("end")){
break;
}
}
server.close();
}
}
はい、運転を開始し、123を入力します.コンソールはすぐに123に戻り、456を入力し続けます.コンソールは反応していません.これ以上負けても、反応しない.コードに間違いがあるのではないかと疑う学生もいます.whileサイクルでSystemだと思っています.out.println(str)という言葉は実行されず、頭が大きくなりました.実はこのコードは完全に間違っていません.なぜなら、実際に2つのプログラムを実行したからです.2回目の実行時にeclipseのコンソールはサービス側に渡されたので、コンソールでの操作は実際にサービス側の操作であり、もちろん役に立たないからです.
機能する場合は、コードは次のように書きます.
public class MyServer {
public static void main(String[] args) throws IOException{
ServerSocket server=new ServerSocket(6666);
Socket client=server.accept();
BufferedReader in=
new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out=new PrintWriter(client.getOutputStream());
while(true){
String str=in.readLine();
System.out.println(str);
out.println("has receive....");
out.flush();
if(str.equals("end"))
break;
}
client.close();
}
}
public class ClientSocket{
static Socket server;
public static void main(String[] args)throws Exception{
server=new Socket(InetAddress.getLocalHost(),6666);
BufferedReader in= new BufferedReader(new InputStreamReader(server.getInputStream()));
PrintWriter out=new PrintWriter(server.getOutputStream());
BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));
while(true){
String str=wt.readLine();
out.println(str);
out.flush();
if(str.equals("end")){
break;
}
System.out.println(in.readLine());
}
server.close();
}
}
この結果、コンソールはクライアントの手に渡っており、サーバはクライアントのコンソールにデータを返します.文字を入力するとすぐに表示されます.endを入力すると、クライアントが切断され、サーバ側がコンソールを取得するので、「すべてのデータが一緒に表示されている」ことがわかります.