Java中的并发问题

时间:2010-04-11 06:25:15

标签: java

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

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

请告知我如何使此过程更加健壮,以便客户端的数量不会影响服务器的运行效果。

嗨,代码是这样的:

服务器启动时:

Socket in= serverSocket.accept();

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

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

  1. 第一次HAsh与第二个客户端的错误不匹配
  2. 第二次javax.crypto.BadPaddingException:给定最终块未正确填充错误
  3. 当发生这种情况时,我需要重新启动服务器并重启两个客户端,然后才能运行两个客户端。但是,如果一个客户端终止连接并再次尝试重新连接,则同样的2个错误以相同的方式发生。然后再次重启Server。

    任何建议都将受到高度赞赏。 感谢

3 个答案:

答案 0 :(得分:1)

不要与线程共享可变数据。使用功能样式 - 没有对象状态。如果你真的需要与线程共享一些数据,那么使用消息传递。

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

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

答案 1 :(得分:0)

查看java.lang.ThreadLocal课程。

答案 2 :(得分:0)

我只能在没有看到完整源代码的情况下猜出原因。我假设您使用CipherInput / OutputStream进行加密。您应该为每个线程(每个I / OStream)使用单独的密码实例。每次创建新连接或重新连接时,在客户端和服务器端都运行Cipher的init方法,并创建新的CipherInput / OutputStream实例。

加密对象是有状态的,因此它们不能在线程之间共享。每个线程和每个连接都应该有各自的有状态对象集。