ServerSocketChannel与ServerSocket Java

问题描述 投票:0回答:1

我已经开始研究预先开发的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); }}

java sockets serversocket socketchannel
1个回答
0
投票

不同之处在于阻止I / O与非阻塞I / O.

参考:https://medium.com/coderscorner/tale-of-client-server-and-socket-a6ef54a74763

© www.soinside.com 2019 - 2024. All rights reserved.