在套接字通信中发送的确认不够快

时间:2015-06-23 06:23:19

标签: java sockets

我尝试在向服务器发送下一组数据之前,为需要确认的设备创建套接字侦听器。我能够发送确认信息,但是当创建新连接时,我就会丢失数据。我在下面粘贴了我的代码。

<p:commandButton>

我的日志编写器主题如下所示。

public void run() {
    try {
        servSoc = new ServerSocket(this.port);
        File file = new File("logs.txt");
        // creates the file

        Socket server = null;
        //FileWriter writer = new FileWriter(file);

        while (true) {
            try {
                System.out.println("Waiting for client on port "
                        + servSoc.getLocalPort() + "...");
                server = servSoc.accept();
                System.out.println("Just connected to "
                        + server.getRemoteSocketAddress());
                InputStreamReader in = new InputStreamReader(server.getInputStream());
                //InputStreamReader in = new InputStreamReader(server.getInputStream());
                DataOutputStream out =
                        new DataOutputStream(server.getOutputStream());

                new Thread(new LogWriter(in, out)).start();

                // Writes the content to the file

                if (servSoc.isClosed()) {
                    System.out.println("Connection closed....");
                    servSoc.close();
                }
            } catch (SocketTimeoutException s) {
                System.out.println("Socket timed out!");
                s.printStackTrace();
                break;
            } catch (IOException e) {
                e.printStackTrace();
                break;
            }
        }

    } catch (IOException ex) {
        java.util.logging.Logger.getLogger(SenselSocketListner.class.getName()).log(Level.SEVERE, null, ex);
        ex.printStackTrace();
    } finally {
    }
}

public static void main(String args[]) {
    int port = 8294;
    Thread t = new SenselSocketListner(port);
    t.start();
} 

有关设备的人建议我可能不会足够快地发送确认。请帮助我找到加快速度的方法,我注意到语句后的延迟&#34; System.out.println(&#34;写入数据......&#34;);&#34;在日志编写器中。

2 个答案:

答案 0 :(得分:0)

设备是否真的了解writeUTF()的结果?除非它是用Java实现的,否则极不可能。你肯定应该直接写出消息的字节或字符。

其他说明:

  • 每行创建一个新的日志文件是浪费时间。在读取循环之前打开文件,然后在循环之后关闭它。
  • 关闭服务器套接字(如果它已经关闭)没有意义。
  • readLine()在阅读主题中返回null时,您应该关闭已接受的套接字。

答案 1 :(得分:-1)

在LogWriter中运行的while循环会捕获您的应用程序,直到套接字关闭。如果您需要在套接字上进行交谈,则必须知道期望的内容 - 由协议定义。如果它是一行,只需读一行。如果是文本文件,则必须设计一个协议,通知您需要的字节数。

此外,应该在单个打开的日志文件上进行日志记录,而不是在每行之后关闭。