Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在servlet上使用套接字是个坏主意吗?_Java_Sockets_Servlets - Fatal编程技术网

Java 在servlet上使用套接字是个坏主意吗?

Java 在servlet上使用套接字是个坏主意吗?,java,sockets,servlets,Java,Sockets,Servlets,我有一个Web应用服务器,它接受参数并将它们传递给客户机类。在普通Java应用程序中调用完全相同的客户机类时,一切正常,但从servlet调用客户机时,客户机-服务器对话总是挂起,原因有两个: 从服务器发送的某些消息(总是相同的消息)格式异常,客户端无法处理 如果上述消息的格式正确,则当客户机响应该消息时,服务器永远不会响应 以下是负责连接的客户端部分: int key; int messCount=0; int count=0; ConnCrypto m = n

我有一个Web应用服务器,它接受参数并将它们传递给客户机类。在普通Java应用程序中调用完全相同的客户机类时,一切正常,但从servlet调用客户机时,客户机-服务器对话总是挂起,原因有两个:

  • 从服务器发送的某些消息(总是相同的消息)格式异常,客户端无法处理
  • 如果上述消息的格式正确,则当客户机响应该消息时,服务器永远不会响应
  • 以下是负责连接的客户端部分:

        int key;
        int messCount=0;
        int count=0;
        ConnCrypto m = new ConnCrypto();
        String[] s = {};
        GameCrypto g = new GameCrypto(s);
        int i = g.init();
        Socket tcp;
        BufferedReader reader;
        BufferedWriter writer;
        CryptHandler crypt= new CryptHandler();
        static int err=0;
    
        void setup() throws IOException {
            tcp = new Socket(serverIp, serverPort);
            InputStream InputStream = tcp.getInputStream();
            OutputStream OutputStream = tcp.getOutputStream();
            InputStreamReader InputStreamReader = new InputStreamReader(InputStream);
            OutputStreamWriter OutputStreamWriter = new OutputStreamWriter(OutputStream);
            reader = new BufferedReader(InputStreamReader);
            writer = new BufferedWriter(OutputStreamWriter);
        }
    
        void send(String z) throws IOException {
            System.out.println("Send:\t" + z);
            z = m.encrypt(z);
            writer.write(z);
            writer.newLine();
            writer.flush();
        }
    
        void crypt(String z) throws IOException {
            System.out.println("Send:\t" + z);
            z = crypt.crypt(z);
            z = "d " + messCount + " "+(char)1 + z;
            send(z);
            messCount++;
        }
    
        void crypt2(String z) throws IOException {
            z = g.encrypt(z);
            z = "d " + messCount + " " + z;
            send(z);
            messCount++;
        }
    
        String recv() throws IOException {
            char chr;
            StringBuilder sb= new StringBuilder();
            while((chr=(char)reader.read())!=0x0A)
                sb.append(chr);
            String str=sb.toString();
            if (key != 0) {
                str = m.decrypt(str);
                int gg = str.charAt(0);
                if (gg == 100) {
                    System.out.print("Raw:\t"+str);
                    str = "d " + crypt.decrypt(str.substring(5));
                }
            } 
            else if (str.charAt(0) == 99) {
                key = Integer.parseInt(str.substring(5));
                m.init(i, key);
            }
            System.out.println("Recv:\t" + str);
            return str;
        }
    

    那么,使用Socket对象是不好的,还是我的代码中还有其他我应该避免的东西呢?

    从你以前是C程序员的风格来看,你的代码看起来很糟糕?您在哪里创建线程并使用该类?没有足够的代码来查看设计中的主要缺陷。至于你的标题,不,在servlet中创建套接字并不是一个好主意。String不是二进制数据的容器。加密的结果是一个字节[],除非您对它们进行base64编码,而您没有说明这一点。如果你想读取行,BuferedReader已经做了,但是你不能假设一个加密的消息以一个未加密的NL字符结束,中间不包含一个。@ KayaMa:这是我在servlet上的第一次尝试,我还没有使用线程。你建议用什么来代替Socket?@EJP在我看来,对于这个问题,加密类是不必要的。加密的工作原理是,每个消息都是一个字符串,包含除NL/LF以外的任何类型的字符,它们以NL结尾,而不包含LF。我第一次尝试使用readline(),但行为主义者没有改变。问题是,当从普通应用程序调用同一代码时,它可以正常工作,但当在servlet内部调用时,它就不能正常工作。