2017-07-08 4 views
0

Gestern habe ich versucht, eine Android-App und eine Windows-App zu erstellen.C# Client-Java Server Daten lesen ist langsam? - Gelöst

Android App - Sendet paar char [] auf die Windows-Anwendung mit WIFI.

Windows-Anwendung - C# Server-Anwendung, lauscht Kunden Daten

jedoch beide Programme gut funktioniert, aber die Daten liest der Server irgendwie sehr langsam ist.

Ich sende Daten wie diese . Ich habe ein Gamepad über otg an mein Telefon angeschlossen, und wenn ich drückte Taste A Daten wird so . Ich habe sogar versucht, eine Textansicht in meiner Android-App zu setzen, es funktioniert ohne Verzögerung und wenn ich eine Taste drücke, kann ich die geänderten Daten in meinem Textansicht sehen.

Also nahm ich an, das Problem liegt zwischen dem Server und dem Client. Ist das unmöglich zu lösen, da es sich um zwei verschiedene Plattformen handelt? Ich habe diese Art der Sache mit Xamarin versucht, es hat gut funktioniert. aber ich möchte an dieser Stelle aus bestimmten Gründen nicht Xamarin verwenden.

Sagen wir, ich drücke die Tasten A, B, C, D, so dass die Daten wie diese , ich sehe es in den Android Apps Textview klar kann, natürlich werde ich diese Daten in meinem Server-Programm sehen , aber nur nach einer großen Verzögerung, etwa 10-30 Sekunden.

Mein Telefon ist Nexus 5. Ist es eine Konsequenz der Verwendung von 2 verschiedenen Plattformen?

Server Code: -

private void startBtn_Click(object sender, EventArgs e) 
     { 
      Thread thread = new Thread(new ThreadStart(StartServer)); 
      thread.Start(); 
     } 

     void StartServer() 
     { 
      Log("Running"); 
      TcpClient client = new TcpClient(); 
      TcpListener server = new TcpListener(IPAddress.Any, 8888); 
      server.Start(); 
      client = server.AcceptTcpClient(); 
      Log("Client connected"); 

      byte[] byteArray = new byte[8]; 
      NetworkStream inOpt = client.GetStream(); 
      while (true) 
      { 
       inOpt.Read(byteArray, 0, 8); 
       Log(ASCIIEncoding.); 
      } 
     } 

     void Log(string msg) 
     { 
      if (InvokeRequired) 
      { 
       this.Invoke(new Action<string>(Log), new object[] {msg}); 
       return; 
      } 
      logBox.Text = ""; 
      logBox.Text += msg + Environment.NewLine; 
     } 

Android-Client-Code: -

char[] keys = {'0', '0', '0', '0', '0', '0', '0', '0'}; 
    TextView textView; 

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

     ArrayList gameControllerDeviceIds = new ArrayList(); 
     int[] deviceIds = InputDevice.getDeviceIds(); 
     for (int deviceId : deviceIds) { 
      InputDevice dev = InputDevice.getDevice(deviceId); 

      int sources = dev.getSources(); 

      // Verify that the device has gamepad buttons, control sticks, or both. 
      if (((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) 
        || ((sources & InputDevice.SOURCE_JOYSTICK) 
        == InputDevice.SOURCE_JOYSTICK)) { 
       // This device is a game controller. Store its device ID. 
       if (!gameControllerDeviceIds.contains(deviceId)) { 
        gameControllerDeviceIds.add(deviceId); 
        Log.d("yolol", String.valueOf(deviceId)); 

       } 
      } 
     } 

     //Log.d("yolol", InputDevice.getDevice(7).getName()); 
     new CheckUsageStartup().execute(); 
     Log.d("sss", Arrays.toString(keys)); 

     textView = (TextView) findViewById(R.id.textView); 
    } 

    byte[] toByteArray(String[] strong){ 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     DataOutputStream dos = new DataOutputStream(baos); 
     for(int i = 0; i < strong.length; i++) 
     { 
      try{ 
       dos.writeUTF(strong[i]); 
      } 
      catch (IOException e){ 

      } 
     } 

     return baos.toByteArray(); 
    } 

    class CheckUsageStartup extends AsyncTask<Void, Integer, String> { 
     String TAG = getClass().getSimpleName(); 

     protected void onPreExecute() { 
      Log.d(TAG + " PreExceute", "On pre Exceute......"); 

     } 

     protected String doInBackground(Void... arg0) { 
      Log.d(TAG + " DoINBackGround", "On doInBackground..."); 

      try { 
       Socket socket = new Socket("192.168.1.8", 8888); 
       OutputStream out = socket.getOutputStream(); 
       Writer writer = new OutputStreamWriter(out, "UTF-8"); 

       while(true){ 
        writer.write(keys, 0, 8); 
        writer.flush(); 
       } 

      } catch (IOException e) { 
       System.out.println(e.getMessage()); 
       return "Instant"; 
      } 
     } 

     protected void onProgressUpdate(Integer... a) { 
      Log.d(TAG + " onProgressUpdate", "You are in progress update ... " + a[0]); 
     } 

     protected void onPostExecute(String result) { 
      Log.d(TAG + " onPostExecute", "" + result); 

     } 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     int deviceId = event.getDeviceId(); 
     if (deviceId != -1) { 
      switch(keyCode){ 
       case KeyEvent.KEYCODE_BUTTON_1: 
        keys[0] = '1'; 
        Log.d("u", "po"); 
        break; 
       case KeyEvent.KEYCODE_BUTTON_2: 
        keys[1] = '1'; 
        break; 
       case KeyEvent.KEYCODE_BUTTON_3: 
        keys[2] = '1'; 
        break; 
       case KeyEvent.KEYCODE_BUTTON_4: 
        keys[3] = '1'; 
        break; 

       case KeyEvent.KEYCODE_DPAD_UP: 
        keys[4] = '1'; 
        break; 
       case KeyEvent.KEYCODE_DPAD_DOWN: 
        keys[5] = '1'; 
        break; 
       case KeyEvent.KEYCODE_DPAD_LEFT: 
        keys[6] = '1'; 
        break; 
       case KeyEvent.KEYCODE_DPAD_RIGHT: 
        keys[7] = '1'; 
        break; 
      } 
      textView.setText(Arrays.toString(keys)); 
      return true; 
     } 

     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     int deviceId = event.getDeviceId(); 
     if (deviceId != -1) { 
      switch(keyCode){ 
       case KeyEvent.KEYCODE_BUTTON_1: 
        keys[0] = '0'; 
        break; 
       case KeyEvent.KEYCODE_BUTTON_2: 
        keys[1] = '0'; 
        break; 
       case KeyEvent.KEYCODE_BUTTON_3: 
        keys[2] = '0'; 
        break; 
       case KeyEvent.KEYCODE_BUTTON_4: 
        keys[3] = '0'; 
        break; 

       case KeyEvent.KEYCODE_DPAD_UP: 
        keys[4] = '0'; 
        break; 
       case KeyEvent.KEYCODE_DPAD_DOWN: 
        keys[5] = '0'; 
        break; 
       case KeyEvent.KEYCODE_DPAD_LEFT: 
        keys[6] = '0'; 
        break; 
       case KeyEvent.KEYCODE_DPAD_RIGHT: 
        keys[7] = '0'; 
        break; 
      } 
      textView.setText(Arrays.toString(keys)); 
      return true; 
     } 

     return super.onKeyUp(keyCode, event); 
    } 

Hier ist der Code. Bitte sagen Sie mir mögliche Lösungen. Ist es Kodierung, um so viel Verzögerung, vielleicht?

Antwort

0

Ich fand es heraus.

Dieser Code ist, der das Textfeldes wurde die Aktualisierung von früheren,

void Log(string msg) 
     { 
      if (InvokeRequired) 
      { 
       this.Invoke(new Action<string>(Log), new object[] {msg}); 
       return; 
      } 
      logBox.Text = ""; 
      logBox.Text += msg + Environment.NewLine; 
     } 

Ich weiß nicht, was das Problem verursacht, aber nach der Textbox aus dem unten stehenden Code zu aktualisieren, es funktioniert jetzt gut.

Invoke((MethodInvoker)delegate { 
        logBox.Text = ASCIIEncoding.UTF8.GetString(byteArray, 0, 8); 
       }); 

Es scheint, dass die erste Methode einige unerwünschte Verzögerung gibt.