java - ServerSocketChannel 与 ServerSocket Java

标签 java sockets serversocket socketchannel

我已经开始开发一个预先开发的 Java 应用程序,其中处理 java 套接字。该项目的主要概念是在java套接字服务器上从客户端获取数据并对其进行处理。

该项目是使用 Java NIO ServerSocketChannel 开发的。

现在在这种情况下,我每秒可以从客户端获取大约 70-80 条记录。而如果我使用简单的 Java ServerSocket(仅用于测试目的),输出会放大到大约 800 次。

为什么两者差别这么大? 如何修改ServerSocketChannel来模仿ServerSocket?

这是我的主要处理部分,

SocketChannel client = (SocketChannel) key.channel();
                        if (!key.isReadable()) {
                            key.cancel();
                            client.close();
                            continue;
                        }

                        int[] k = (int[]) key.attachment();

                        if (k[2] == 0) {
                                ByteBuffer lengthBuffer = ByteBuffer.allocate(2);

                                int bytesRead = -1;
                                if (!client.socket().isClosed() && key.isValid()) {
                                    bytesRead = client.read(lengthBuffer);
                                }

                                if (bytesRead == -1) {
                                    key.cancel();
                                    client.close();
                                    continue;
                                }
                                lengthBuffer.flip();
                                byte[] bytes = new byte[2];
                                lengthBuffer.get(bytes, 0, 2);
                                short length = DRMSDecoder.getShort(bytes);


                                k[0]++;
                                k[1] = length;
                                k[2] = 1;
                                key.attach(k);
                                lengthBuffer.clear();
                            } 
                            else {
                                try {

                                    int length = k[1];
                                    ByteBuffer dataBuffer = ByteBuffer.allocate(length);
                                    dataBuffer.clear();
                                    System.gc();

                                    int bytesRead = -1;
                                    if (!client.socket().isClosed() && key.isValid()) {
                                        bytesRead = client.read(dataBuffer);
                                    }

                                    if (bytesRead == -1) {
                                        key.cancel();
                                        client.close();
                                        continue;
                                    }

                                    dataBuffer.flip();

                                    Hashtable<String, Object> request = decoder.decode(dataBuffer);
                                    short call_type = (Short) request.get("Call Type");

                                    if (request.get("Call Type") != null && (((Short) request.get("Call Type")) == 78 || ((Short) request.get("Call Type")) == 80)) {


                                    } else if (request.get("Call Type") != null && (((Short) request.get("Call Type")) == 79)) {
                                        key.cancel();
                                        client.close();

                                    } 
                                        String message = (String) request.get("Buffer");

                                        handleMessage(message);

                                    }
                                    k[0]++;
                                    k[2] = 0;
                                    key.attach(k);
                                    lastMessageProcessed++;

                                    dataBuffer.clear();

                                } catch (Exception e) {
//                                    System.out.println(e);
                                }
                            }

最佳答案

区别在于阻塞 I/O 与非阻塞 I/O

引用:https://medium.com/coderscorner/tale-of-client-server-and-socket-a6ef54a74763

关于java - ServerSocketChannel 与 ServerSocket Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52362555/

相关文章:

python - 如何检测客户端何时与 UDS(Unix 域套接字)断开连接

java - 检测客户端何时不再监听服务器

Java 服务器/客户端应用程序仅在按 Enter 键时显示消息

java - System.getProperty ("mode") 返回 "null"

java - Hibernate 孤儿删除日志记录

java - BeanIo 没有此类属性 'property' 问题

Python 套接字 : how to only receive one message at a time

java - 递归调用方法期间 Hibernate session 关闭异常

java - 在java中的客户端服务器套接字中将字符串转换为int

java - 端口 80 上的 ServerSocket 正确吗?