Java套接字通信——提高速度

标签 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 作为分隔符,让程序知道消息已结束。

有人对如何缩短传输时间有一些想法吗?我读过诸如禁用内格尔算法之类的内容。那会有帮助吗?如果我想要纯粹的速度,也许套接字不是正确的选择。也许不同的语言或库会更快?

最佳答案

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

如果您确实渴望低延迟,请使用 DatagramSocket(即 UDP 而不是 TCP)。您会失去消息传递保证,并且必须预料到会丢失数据包,但对于良好网络上的短消息,延迟与可移植代码一样好。

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

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

关于Java套接字通信——提高速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8961154/

相关文章:

python - 我如何在 python 中编写一个简单的 IRC 机器人?

java - 非阻塞套接字

c# - 如何找到套接字的IP C#BeginReceive

Java MongoDB访问对象子节点

java - GoogleSignIn.getLastSignedInAccount() 返回具有空字段的帐户

java - 带有 String 参数的方法仅接受手动设置的 String

java - 在 onSizeCanged() 中初始化对象时出现 NPE

Java:用于加密的更轻代码

java - 无法使用套接字接收字符串

perl - 如何使用快速 Playground 实现套接字连接?