java - Java中的并发问题

标签 java

我正在用 Java 设计客户端-服务器聊天应用程序。这是一个安全的应用程序,其中使用加密算法交换消息。我有一台服务器,它可以支持许多客户端。我的问题是,当一个客户端登录服务器时它工作正常,但是当另一个用户登录系统时,服务器开始给我加密文本的错误填充异常。

我无法弄清楚问题所在,根据我的逻辑,当向服务器发出新的连接请求时,服务器会创建一个线程来监听客户端。是否有可能一旦创建了线程类的实例,它就会为第一个客户端正确执行所有处理,但对第二个客户端则不能,因为服务器监听器线程类中的变量已经有一些先前的值,因此加密文本是没有正确解密?

请告诉我如何让这个过程更健壮,这样客户端的数量就不会影响服务器的功能。

你好,代码是这样的:

服务器启动时:

Socket in= serverSocket.accept();

                Receive rlt = new Receive(in);
                Thread receiveReq = new Thread(rlt);
                receiveLoginReq.start();

现在接收线程等待传入消息并根据消息类型进行处理。当调用多个客户端时,服务器工作正常,当一个客户端终止然后再次尝试重新连接时,问题就开始了。服务器总是给出以下模式的错误:

  1. 第一次出现第二个客户端的 HAsh 不匹配错误
  2. 第二次 javax.crypto.BadPaddingException: Given final block not properly padded 错误

发生这种情况时,我需要重新启动服务器并重新启动两个客户端,然后两个客户端才能正常工作。但如果一个客户端终止连接并再次尝试重新连接,同样的 2 个错误将以相同的方式发生。然后再次重启服务器。

任何建议将不胜感激。 谢谢

最佳答案

不要与线程共享可变数据。使用函数式风格——没有对象状态。如果您确实需要与线程共享一些数据,请使用消息传递。

检查您是否以正确的方式关闭连接。

你可以使用像Jetty这样的真实服务器非常容易安装。

关于java - Java中的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2616227/

相关文章:

java - 在 fragment 中使用上下文

java - 以 ArrayList 作为参数相乘列表元素的方法

java - 如何修复 Flutter 中的 "Exception thrown while unbinding, java.lang.IllegalArgumentException: Service not registered: lp@9f7d4ca"异常?

java - AnimationTimer - 动画处理期间不允许使用 showAndWait

java - 无法启动接收器,java空指针异常

Java将文件写为纯 "windows-1252"

java - 如何使用 selenium、java 验证排序选项结果包含正确的结果?

java命名空间冲突

java - AJAX调用Java字符编码

java - 在推断模型上使用 Jena 规则文件为本体创建 validator