Python client sendet an Java/Android Server NULL

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Satzende
User
Beiträge: 70
Registriert: Samstag 8. Januar 2011, 12:41

Hallo

Ich habe einen Python client der sich mit einem Android Server verbindet.
Der client sendet aber nicht nur die nachricht sondern auch NULL, 6 pro nachricht.
Mit einem Java Client wird nur die Nachricht gesendet.


Client :

Code: Alles auswählen

import socket
import time

ip = '192.168.43.1'
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((ip, 1511))

try: 
    for x in range(2):
        nachricht = "test"+"\n"

        s.send(nachricht)
       
        #antwort = s.recv(1024)
        print("sende")



finally: 
    s.close()
Server (java):

Code: Alles auswählen

    public CommunicationThread(Socket clientSocket) {
      this.clientSocket = clientSocket;

      try {
        Log.v(TAG, "CommunicationThread, instanziert");
        this.input = new BufferedReader(new InputStreamReader(
            this.clientSocket.getInputStream()));
        
        this.output = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())), true);
        
                address = clientSocket.getInetAddress();
                
        if(!known_addresses.contains(clientSocket.getInetAddress()))
          known_addresses.add(clientSocket.getInetAddress());

      } catch (IOException e) {
        Log.e(TAG, "ClientSocket inputStreamReader error");
        e.printStackTrace();
      }
    }

    // eine zeile vom imput einlesen, wenn der thread nicht unterbraichen
    // ist
    public void run() {

      while (!Thread.currentThread().isInterrupted()) {

        try {
          Log.v(TAG, "CommunicationThread Running");
          String response = "#,nix,nix,nix,nix,#";
          
          PrintWriter out = new PrintWriter(new BufferedWriter(
                        new OutputStreamWriter(clientSocket.getOutputStream())),
                        true);
                
          String read = input.readLine();
                
          if (read != null){
            list.setNachticht(read, address.getHostAddress());
            out.println(response);
                  out.flush();
                  Log.d(TAG, "Antwort=\""+response+"\"");
            updateConversationHandler.post(new updateUIThread(read, address));
            
          }
          else{
            Log.e(TAG, "null erhalten");
            list.setNullcount();
            counter++;
            if (counter > 5){
              Log.e(TAG, "Restarte conntection");
              list.conntectionreset();
              counter = 0;
              this.clientSocket.close();
              this.clientSocket = serverSocket.accept();
              
            }
          }
          

        } catch (IOException e) {
          Log.e(TAG, "updateConversationHandler error");
          e.printStackTrace();
        }
      }
    }

  }

  // texst in den viewtun
  class updateUIThread implements Runnable {
    private String msg = "";
    private InetAddress address;

    // private TextView text = (TextView) findViewById(R.id.text2);

    public updateUIThread(String str, InetAddress address) {
      this.msg = str;
      this.address = address;

    }

    @Override
    public void run() {
      Log.d(TAG, "Daten erhalten: \""+msg+"\", würden an dieser Stelle zur verarbeitung weitergegeben werden, IP="+address.getHostAddress());
      if (msg != null){
        nullcounter = 0;
      }
      else{
        nullcounter++;
        if (nullcounter >100){
        }
      }

    }
  }
  
  public interface listener{
     public void setNachticht(String nachrichat, String IP);
     public void setNullcount();
     public void conntectionreset();
    
  }

}

Code: Alles auswählen

package com.example.connectiontest;

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

public class MainActivity extends Activity implements WifiListener.listener {
  
  private  TextView nachricht;
  private  TextView ip;
  private  TextView nullcounter;
  private  TextView connresets;
  private  TextView nachrichtcounter;
  
  private  int stringcounter =0;
  private  int ncounter = 0;
  private  int resetcounter =0;
  
  
  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.nachricht = (TextView) this.findViewById(R.id.laststring);
        this.ip = (TextView) this.findViewById(R.id.ip);
        this.nullcounter = (TextView) this.findViewById(R.id.nullcounter);
        this.connresets = (TextView) this.findViewById(R.id.connresets);
        this.nachrichtcounter = (TextView) this.findViewById(R.id.stringcounter);
        
        
        
        new WifiListener(this);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    public void setNachticht(final String nachrichat, final String IP){
      stringcounter ++;
      
      
      
      runOnUiThread(new Runnable() {
           @Override
           public void run() {
             nachrichtcounter.setText(" "+stringcounter+"");
          nachricht.setText(" "+nachrichat);
          ip.setText(" "+IP);
          }
      });
    }
    public void setNullcount(){
      ncounter++;
      
      runOnUiThread(new Runnable() {
         @Override
         public void run() {

          nullcounter.setText(" "+ncounter+"");
        }
    });
      
    }
    public void conntectionreset(){
      resetcounter++;
      
      runOnUiThread(new Runnable() {
         @Override
         public void run() {

          connresets.setText(" "+resetcounter+"");;
        }
    });
    }

    
}
Kann mir jemand Sagen wie die null sendungen verhindert werden können?
BlackJack

@Satzende: Es gibt keine ``null``-Sendungen und Du bekommst da auch nicht 6 mal ``null`` sondern unendlich oft. Schau mal in die Java-Dokumentation was es bedeutet wenn ``BufferedReader.readLine()`` den Wert ``null`` liefert. ;-)
Satzende
User
Beiträge: 70
Registriert: Samstag 8. Januar 2011, 12:41

aber eine zeile wird nur ausgelesen wenn eine nachricht eintrifft und dann wird auch nur die erste zeile ausgelesen. Wieso wird also der Thread der die nachricht ausliest gestartet wenn gar keine nachricht eingetroffen ist?
BlackJack

@Satzende: Du machst da komische Sachen in der `CommunicationThread.run()`-Methode. Ich dachte ein `CommunicationThread` wird erzeugt wenn sich ein Client verbindet und der bedient dann genau diesen Client. Das heisst ein `CommunicationThread` braucht das Serversocket nicht zu kennen, ja sollte dieses Socket gar nicht kennen. Du schliesst im `CommunicationThread` dann aber das Clientsocket und machst auf dem Serversocket ein `accept()` zum ”wiederverbinden”. Das kann man doch gar nicht machen. Du weisst doch überhaupt nicht *wer* sich dort dann verbindet. Und wenn ausserhalb des Threads im Hauptprogramm irgendwo Code ist der auf Verbindungen auf dem Serversocket wartet um dann einen `CommunicationThread` zu erzeugen, dann warten an der Stelle (mindestens) zwei Threads auf Verbindungen auf dem *selben* Serversocket. Böses Foul.

Und mal angenommen in Zeile 55 bekommst Du ein neues `clientSocket`, dann gehen wir wieder in die ``while``-Schleife ab Zeile 26, und kommen irgendwann zum `input.readLine()` — wobei `input` ein `BufferedReader` ist der immer noch auf dem *alten*, *geschlossenen* Clientsocket operiert und damit *unweigerlich* wieder ``null`` liefern muss.

Damit bin ich mir ziemlich sicher dass das nicht nur mit einem Python-Client nicht funktioniert. Der Code funktioniert genau einmal für die erste Verbindung die aufgemacht wird, und danach aus den oben genannten Gründen nicht mehr. Für keinen Client, egal in welcher Programmiersprache der geschrieben ist.
Satzende
User
Beiträge: 70
Registriert: Samstag 8. Januar 2011, 12:41

Vielen lieben dank BlackJack, für deine erheldenen worte.
Antworten