2017-07-08 22 views
0

昨天我試圖創建一個android應用程序和一個Windows應用程序。C#客戶端 - Java服務器數據讀取速度慢? - 已解決

Android應用 - 發送的炭[]使用WIFI的窗口應用程序的一對。

的Windows應用程序 - C#服務器應用程序,監聽客戶端的數據

不過這兩個程序運作良好,但數據從服務器讀取是有點很慢。

我發送的是這樣的信息。我有一個手柄通過otg連接到我的手機,當我按下按鈕A數據變成這樣。我甚至嘗試在我的android應用程序中放置一個textview,它沒有任何延遲地工作,當我按下按鈕時,我可以看到我的textview中更改的數據集。

所以我認爲問題是在服務器和客戶端之間。這是不可能解決的,因爲它們是2個不同的平臺?我已經嘗試過這種東西,Xamarin,它運行良好。但由於某些具體原因,我不想在這一點上使用Xamarin

比方說,我按下按鈕A,B,C,d這樣的數據是這樣的,我清楚地可以看到它在Android應用TextView的,當然,我會在我的服務器程序看到這個數據,但只有在大約10-30秒的延遲之後。

我的手機是Nexus 5.這是使用兩種不同平臺的結果嗎?

服務器代碼: -

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客戶端代碼: -

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

下面的代碼。請告訴我可能的解決方案。它編碼是否做了這麼多的延遲,也許呢?

回答

0

我想通了。

這是從較早的更新文本框代碼,

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

我不知道是什麼原因導致的問題,但是從下面的代碼更新文本框後,現在工作得很好。

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

看來使用第一種方法會產生一些不必要的延遲。

相關問題