2016-07-24 16 views
0

PrintStream "+ サーバーからデータを読み取ろうとします(Inputstreamを使用)クライアント側でデータを(サーバによって送信)読み取ることができません。私は</p> <p>1.clientが接続(IPアドレス+ポート番号)のためにサーバに要求を送信+」を使用してデータを送信するアプリを開発しようとしています

2.クライアントがソケットを作成します。

3.Serverがデータを読み込む

4.SERVERには3

問題がポイントで、サーバーによって書かれた4つのデータではありません同じ時点で「のPrintStream」を使用してデータを書き込み、クライアントでお送りくださいされていませんクライアントの "INPUTSTREAM"(ポイント1) 私はこれらの同時操作が可能かどうかを知りません。可能な場合はどうしたらいいでしょう。そうでない場合、別の方法は何ですか?

サーバコード

package com.example.loneranger.ser; 


import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.NetworkInterface; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.SocketException; 
import java.util.Enumeration; 

public class MainActivity extends Activity { 


    TextView ip; 
    TextView msg; 
    String data = ""; 

    ServerSocket httpServerSocket; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     ip = (TextView) findViewById(R.id.infoip); 
     msg = (TextView) findViewById(R.id.msg); 

     ip.setText(getIpAddress() + ":" 
       + 8080 + "\n"); 

     Server server = new Server(); 
     server.start(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 

     if (httpServerSocket != null) { 
      try { 
       httpServerSocket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    private String getIpAddress() { 
     String ip = ""; 
     try { 
      Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface 
        .getNetworkInterfaces(); 
      while (enumNetworkInterfaces.hasMoreElements()) { 
       NetworkInterface networkInterface = enumNetworkInterfaces 
         .nextElement(); 
       Enumeration<InetAddress> enumInetAddress = networkInterface 
         .getInetAddresses(); 
       while (enumInetAddress.hasMoreElements()) { 
        InetAddress inetAddress = enumInetAddress.nextElement(); 

        if (inetAddress.isSiteLocalAddress()) { 
         ip += "IP: " 
           + inetAddress.getHostAddress() + "\n"; 
        } 

       } 

      } 

     } catch (SocketException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      ip += "Something Wrong! " + e.toString() + "\n"; 
     } 

     return ip; 
    } 

    private class Server extends Thread { 


     @Override 
     public void run() { 
      Socket socket = null; 

      try { 
       httpServerSocket = new ServerSocket(8888); 

       while(true){ 
        socket = httpServerSocket.accept(); 

        HttpResponseThread httpResponseThread = 
          new HttpResponseThread(
            socket); 
        httpResponseThread.start(); 
       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 


    } 

    private class HttpResponseThread extends Thread { 

     Socket socket; 

     HttpResponseThread(Socket socket){ 
      this.socket = socket; 

     } 

     @Override 
     public void run() { 
      BufferedReader BReader; 
      PrintWriter printer; 
      String request; 


      try { InputStream inputStream = socket.getInputStream(); 
       BReader = new BufferedReader(new InputStreamReader(inputStream)); 
       request = BReader.readLine(); 
Thread.sleep(500); 
       printer = new PrintWriter(socket.getOutputStream(), true); 


       printer.print("hello laundu"); 
       printer.flush(); 
       String ip123=socket.getInetAddress().toString(); 
       printer.close(); 

       BReader.close(); 

       socket.close(); 


       data += "Request of " + request 
         + " from "+ ip123 + "\n"; 
       MainActivity.this.runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 

         msg.setText(data); 
        } 
       }); 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      return; 
     } 
    } 

} 

クライアントコード

mport android.os.AsyncTask; 
import android.widget.TextView; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.io.UnsupportedEncodingException; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class Client extends AsyncTask<Void, Void, Void> { 

    String dstAddress; 
    int dstPort; 
    String response = ""; 
    TextView textResponse; 
    MainActivity activity; 
    OutputStream outputStream; 
    BufferedReader BReader; 
    String request; 

    Client(String addr, int port, TextView textResponse) { 
     dstAddress = addr; 
     dstPort = port; 
     this.textResponse=textResponse; 
     this.activity=activity; 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 

     Socket socket = null; 

     try { 
      socket = new Socket(dstAddress, dstPort); 
      Server server = new Server(socket); 
      server.start(); 

      PrintWriter out = new PrintWriter(new BufferedWriter(

        new OutputStreamWriter(socket.getOutputStream())), 

        true); 

      out.print("futfujb"); 
      out.flush(); 




      /* 
      * notice: inputStream.read() will block if no data return 
      */ 


     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      response = "UnknownHostException: " + e.toString(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      response = "IOException: " + e.toString(); 
     } /*finally { 
      if (socket != null) { 
       try { 

       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }*/ 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     textResponse.setText(response); 
     super.onPostExecute(result); 
    } 
    private class Server extends Thread { 
     Socket socket; 
     Server(Socket socket) 
     { 
      this.socket=socket; 
     } 
     @Override 
     public void run() { 

       try { //Thread.sleep(500); 

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(
          1024); 
        byte[] buffer = new byte[1024]; 

        int bytesRead; 
        InputStream inputStream = socket.getInputStream(); 

        if(inputStream.available()>0) 
        { 
         while ((bytesRead = inputStream.read(buffer)) != -1) { 
          byteArrayOutputStream.write(buffer, 0, bytesRead); 
          response += byteArrayOutputStream.toString("UTF-8"); 
         } 
        } 

        inputStream.close(); 
        socket.close(); 
      } 
      catch (UnsupportedEncodingException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 


     } 


    } 


} 
+0

なぜサーバーは新しいソケット接続を作成しますか?この問題を示すコードはどこにありますか? – EJP

+0

@EJPはここにコード – Rajat

+0

ここには '(2)server gets request(3)server'が '新しい接続を作成する'に対応するものはありません。新しいミステリーがあります:クライアントに 'Server'というクラスがあるのはなぜですか?あなたの問題に対する解決策は、 'available()'テストを削除することです。 availaible()入力ストリームを削除した後に – EJP

答えて

0

私は、これらのステップのいずれかに該当するこのコードでは何もありません、上記のコメントのよう:

2.Server新しいSOCKET接続が作成されます。

(a)要求はなく、(b)サーバーは新しい接続を作成しません。クライアントがそれを作成します。サーバーはそれを受け入れます。

3.サーバーがクライアントから送信されたデータを読み取ります。

クライアントはデータを送信しません。

あり二つの問題は、(少なくとも)現在地:

  1. サーバは、クライアントが送信しない旨のメッセージを待っているreadLine()にブロックしています。したがって、それは決して独自の送信にはなりません。したがって、クライアントは何も受信しません。コメントに従って、クライアントに要求を送信させます。
  2. クライアントがavailable()を間違って使用しています。このテストを削除して、クライアントを読み取りループに挿入させます。ピア(サーバ)が接続を閉じると、それは終了します。
+0

しかし、サーバーはCHROMEブラウザとFineを反応しています.ServerはCromeによって書き込まれたデータを取得し、Cromeはサーバーから送信されたデータを表示します。 – Rajat

+0

ブラウザがHTTP要求を送信します。あなたのクライアントはしません。 – EJP

関連する問題