2016-07-24 17 views
0

I, in der eine App zu entwickeln versuchenDaten können nicht (Senden von Server) auf Client-Seite lesen

1.client für den Anschluss (IP-Adresse + PORT-Nr.) Anforderung an dem Server sendet + sendet Daten mit " PrintStream "+ Versucht, die Daten vom Server zu lesen (mit Inputstream)

2.Client erstellt den Socket.

3.Server liest die Daten durch den Kunden senden

4.SERVER schreibt die Daten „Print“ bei gleichen Zeitpunkt mit nein 3.

Problem am Punkt 4 Daten werden von SERVER geschrieben ist nicht lesen von "INPUTSTREAM" des Clients (Punkt 1) Ich weiß nicht, diese Simultanbetrieb sind möglich oder nicht.Wenn möglich dann wie.Wenn nicht dann, was ist der alternative Weg?

Server-Code

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; 
     } 
    } 

} 

-Client-Code

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

Warum erstellt der Server eine neue Socketverbindung? Wo ist der Code, der dieses Problem aufweist? – EJP

+0

@EJP hier ist Code – Rajat

+0

Es gibt hier nichts, das entspricht '(2) Server bekommt Anfrage (3) Server erstellt neue Verbindung'. Es gibt ein neues Rätsel: Warum haben Sie eine Klasse namens "Server" im Client? Die Lösung für Ihr Problem besteht darin, den 'available()' Test zu entfernen. – EJP

Antwort

0

Als ich bemerkte oben, es gibt nichts in diesem Code ist, die entweder diese Schritte entspricht:

2.Server Erhält die Anfrage erstellt neue SOCKET-Verbindung.

(a) Es gibt keine Anfrage, und (b) der Server erstellt keine neue Verbindung. Der Client erstellt es. Der Server akzeptiert es.

3.Server liest die vom Client gesendeten Daten.

Der Client sendet keine Daten.

Es gibt zwei Probleme hier (zumindest):

  1. Der Server in readLine() blockiert eine Nachricht wartet, dass der Client sendet nie. So kommt es nie zu einem eigenen Senden, also erhält der Client nichts. Lassen Sie den Kunden gemäß den Kommentaren eine Anfrage senden.
  2. Der Client verwendet available() falsch. Entfernen Sie diesen Test und lassen Sie den Client in die Leseschleife fallen. Es wird beendet, wenn der Peer (der Server) die Verbindung schließt.
+0

Aber Server reagiert Fein mit CHROME browser.Server erhält die Daten von Crome geschrieben und Crome zeigt die Daten vom Server – Rajat

+0

Ein Browser sendet eine HTTP-Anfrage. Ihr Kunde nicht. – EJP