繁体   English   中英

C#客户端-Java Server数据读取缓慢吗?

[英]C# client-Java Server data reading is slow?

昨天我尝试创建一个Android应用程序和Windows应用程序。

Android应用程序 -使用WIFI将几个char []发送到Windows应用程序。

Windows应用程序 -C#服务器应用程序,侦听客户端数据

但是,这两个程序都能正常工作,但是从服务器读取的数据有点慢。

我正在发送这样的数据000000000 我有一个通过otg连接到手机的游戏 ,当我按下Button时,数据变为10000000 我什至尝试将textview放在我的android应用程序中,它没有任何延迟,并且当我按下按钮时,我可以在textview中看到更改的数据集。

所以我认为问题出在服务器和客户端之间。 因为它们是2个不同的平台,所以不可能解决这个问题吗? 我已经用Xamarin尝试过这种方法,它效果很好。 但出于某些特定原因,我目前不希望使用Xamarin

假设我按下了按钮A,B,C,D,所以数据是这样的11110000 ,我可以在android应用程序TextView中清楚地看到它,当然我会在服务器程序中看到此数据,但是要经过很长的延迟,大约10到30秒。

我的手机是Nexus5。是使用两个不同平台的结果吗?

服务器代码:

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

这是代码。 请告诉我可能的解决方案。 编码会延迟很多吗?

我想到了。

这是从早期版本更新文本框的代码,

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

似乎使用第一种方法会产生一些不必要的延迟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM