2016-07-24 165 views
0

我試圖發展其無法讀取數據(由服務器發送)在客戶端

1.client發送請求到服務器的連接(IP地址+端口號)+使用「發送數據的應用程序PrintStream「+ 嘗試從服務器讀取數據(使用輸入流)

2.Client創建套接字。

3.Server讀取數據通過客戶端發送

4.SERVER使用「的PrintStream」在同一時間點沒有3

問題是在點寫4個數據由服務器寫入的未讀通過客戶端(點1)的「INPUTSTREAM」 我不知道這些同時操作是否可能。如果可能,那麼如何。如果不是那麼替代方式是什麼?

服務器代碼

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)服務器獲取請求(3)服務器創建新連接'。有一個新的謎團:爲什麼你在客戶端有一個名爲'Server'的類?解決你的問題是刪除'available()'測試。在刪除可用()輸入流後, – EJP

回答

0

正如我上面的評論,有什麼在此代碼對應於以下步驟之一:

2.Server獲取請求創建新的SOCKET連接。

(a)沒有請求,(b)服務器不創建新的連接。客戶創建它。服務器接受它。

3.Server讀取客戶端發送的數據。

客戶端不發送任何數據。

有兩個問題在這裏(至少):

  1. 服務器阻斷readLine()等待消息,客戶端永遠不會發送。所以它永遠不會自己發送,所以客戶端沒有收到任何東西。根據評論,讓客戶發送請求。
  2. 客戶端錯誤地使用available()。刪除這個測試並讓客戶端進入讀取循環。它將在對等體(服務器)關閉連接時退出。
+0

但服務器與CHROME瀏覽器反應良好。服務器獲取由Crome編寫的數據,而Crome顯示服務器發送的數據 – Rajat

+0

瀏覽器發送HTTP請求。你的客戶沒有。 – EJP

相關問題