Java套接字通信 - 提高速度

时间:2012-01-22 12:46:36

标签: java sockets

我有一个java程序,我在家庭服务器上运行。我还有一个java客户端程序,它将消息发送到服务器并使用套接字接收响应。

我已经成功实施了它,但它看起来有点慢,我想尽快得到它。

这是我的代码:

服务器

public class Server implements Runnable{
    static ServerSocket socket1;
    protected final static int port = 4701;
    static Socket connection;
    static StringBuffer process;

private String handleRequest(String req){
    if(req.equals("marco")){
        return "polo";
    }else
        return "null";

}

public void run(){
    try {
        socket1 = new ServerSocket(port);
        int character;

        while (true) {
            connection = socket1.accept();

            BufferedInputStream is = new BufferedInputStream(connection.getInputStream());
            InputStreamReader isr = new InputStreamReader(is);
            process = new StringBuffer();
            while ((character = isr.read()) != 13) {
                process.append((char) character);
            }
            String returnCode = handleRequest(process.toString()) + (char) 13;
            BufferedOutputStream os = new BufferedOutputStream(connection.getOutputStream());
            OutputStreamWriter osw = new OutputStreamWriter(os, "US-ASCII");
            osw.write(returnCode);
            osw.flush();
        }
    } catch (IOException e) {
        System.out.println("error starting server " + e.getMessage());
    }
    try {
        if(connection != null)
            connection.close();

    } catch (IOException e) {
    }

客户端

    String host = "xx.xx.xx.xxx";
    int port = 4701;

    StringBuffer instr = new StringBuffer();

    try {
        InetAddress address = InetAddress.getByName(host);

        Socket connection = new Socket(address, port);

        BufferedOutputStream bos = new BufferedOutputStream(connection.
                getOutputStream());

            OutputStreamWriter osw = new OutputStreamWriter(bos, "US-ASCII");

            String process = "marco" + (char) 13;

            osw.write(process);
            osw.flush();

            BufferedInputStream bis = new BufferedInputStream(connection.
                getInputStream());

            InputStreamReader isr = new InputStreamReader(bis, "US-ASCII");

            int c;
            while ( (c = isr.read()) != 13)
              instr.append( (char) c);

            connection.close();
          }
          catch (Exception e){}

          if(instr.toString().equals("")){
              //error
          }


}

例如,我将向服务器发送各种字符串以确定服务器的响应方式。例如,如代码所示,如​​果我将“marco”发送到服务器,我会返回“polo”。我还有(char) 13作为分隔符,让程序知道消息已经结束。

有没有人对如何缩短转移时间有一些想法?我已经阅读过诸如禁用nagle算法之类的内容。那会有帮助吗?如果我想要纯粹的速度,也许套接字不是要走的路。也许不同的语言或图书馆会更快?

3 个答案:

答案 0 :(得分:4)

在服务器端,您需要关闭连接。否则它们将保持打开状态,直到将来任意垃圾收集时间为止。

如果您真的非常渴望低延迟,那么请使用DatagramSocket(即UDP而不是TCP)。您丢失了邮件传递保证并且必须预期丢失数据包,但对于良好网络上的短消息,延迟与便携式代码一样好。

另一种选择是重用客户端的套接字连接,而不是每次都重新打开它。对于像你这样的微小消息,大部分时间可能都是在TCP设置和拆解中消耗的。

微优化将停止使用逐字符处理并将“marco”和“polo”匹配为字节字符串。但这不太可能会有明显的改善。

答案 1 :(得分:1)

你可以采取不同的方式使其更快,但明确你需要改变的东西。通常最长的延迟在您的网络中。

如果您通过环回连接或低延迟网络连接,您可以使用NIO,它可以更快。但是,如果您使用的是普通网络,尤其是如果您使用的是互联网连接,那么您的程序效率并没有多大差别。

当您考虑性能时,您需要查看整个端到端解决方案并查看延迟的位置,并专注于减缓解决方案的最大因素。

答案 2 :(得分:1)

套接字是相当低级的,所以我怀疑有更快的Java库易于使用。 Java可能不是最快的语言,最流行的服务器通常用C / C ++编写。但是,有许多大型项目在Java服务器上运行,TomcatResinJBoss仅举几例。

在优化方面,通常的做法是使服务器成为多线程。在ServerSocket.accept()之后,您为处理请求创建了一个新线程,因此服务器可以返回为其他客户端提供服务。

这是一篇很好的文章,展示了对套接字请求的多线程响应

http://www.oracle.com/technetwork/java/socket-140484.html