0

ソケットを使用して、シリアル コマンドをリモート デバイスに渡しています。そして、その要求に対する応答が返送され、印刷されます。ただし、最初はすぐに応答しますが、残りの時間は応答を受け取るまでに最大 20 秒かかるという問題があります。

問題はスレッド化の試みにあると思いますが、完全にはわかりません。

                    new Thread() { 
                        @Override
                        public void run() {
                            System.out.println("opened");
                            try {
                                isSocketRetrieving.setText("Opening Socket");
                                socket = new Socket(getAddress(), getRemotePort()));

                                DataOutput = new DataOutputStream(socket
                                        .getOutputStream());

                                inFromServer = new BufferedReader(
                                        new InputStreamReader(socket
                                                .getInputStream()));

                                String line = "";

                                isSocketRetrieving.setText("Reading Stream......");

                                while ((line = inFromServer.readLine()) != null) {

                                    System.out.println(line);
                                    if (line.contains(getHandshakeRequest())) {


                                        DataOutput.write((getHandshakeResponse()toString() + "\r").getBytes());
                                        DataOutput.flush();
                                        DataOutput
                                                .write((getCommand().toString() + "\r").getBytes());
                                        DataOutput.flush();
                                        int pause = (line.length()*8*1000)/getBaud();
                                        sleep(pause);

                                    } else if (line.contains(readingObject
                                            .getExpected())) {

                                        System.out.println(line);
                                        textArea.append("value = " + line
                                                + "\n");
                                        textAreaScroll.revalidate();
                                        System.out.println("Got Value");
                                        break;
                                    }
                                }

                                System.out.println("Ended");
                                try {
                                    inFromServer.close();
                                    DataOutput.close();
                                    socket.close();
                                    isSocketRetrieving.setText("Socket is inactive...");
                                    rs232Table.addMouseListener(listener);
                                    interrupt();
                                    join();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                } catch (InterruptedException e) {
                                    System.out.println("Thread exited");
                                }
                            } catch (NumberFormatException e1) {
                                e1.printStackTrace();
                            } catch (UnknownHostException e1) {
                                e1.printStackTrace();
                            } catch (IOException e1) {
                                e1.printStackTrace();
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }.start();
4

2 に答える 2

1
   int pause = (line.length()*8*1000)/getBaud();
   sleep(pause);

このせいでしょうか。

于 2013-07-01T15:39:22.277 に答える
1

ソケット接続はシリアル接続と比較して比較的高速であり、比較的小さなデータのチャンクを送信するため、次の方法で再生します。

  • socket.setTcpNoDelay(真)
  • socket.getReceiveBufferSize() / socket.setReceiveBufferSize() - (サイズを変更してみてください)
  • socket.getSendBufferSize() / socket.setSendBufferSize() - (サイズを変更してみてください)

ソケットを開いた後、一度セットアップしてみてください。多分これが役立つでしょう。

于 2013-07-01T16:19:13.670 に答える