我正在用Java设计客户端 - 服务器聊天应用程序。这是一个安全的应用程序,使用加密算法交换消息。我有一台服务器,它可以支持许多客户端。我的问题是当一个客户端登录服务器时工作正常,但当另一个用户登录系统时,服务器开始给我加密文本的错误填充异常。
根据我的逻辑,我无法弄清楚问题,当对服务器发出新的连接请求时,服务器会创建一个用于监听客户端的线程。是否有可能一旦创建了线程类的实例,它就会为第一个客户端正确地执行所有处理,但不会对第二个客户端执行所有处理,因为服务器侦听器线程类中的变量已经具有一些先前的值,因此加密的文本是没有正确解密?
请告知我如何使此过程更加健壮,以便客户端的数量不会影响服务器的运行效果。
嗨,代码是这样的:
服务器启动时:
Socket in= serverSocket.accept();
Receive rlt = new Receive(in);
Thread receiveReq = new Thread(rlt);
receiveLoginReq.start();
现在,接收线程等待传入消息并根据消息类型执行该过程。当调用多个客户端时,服务器工作正常,当一个客户端终止然后再次尝试重新连接时问题就开始了。服务器始终以下列模式提供错误:
当发生这种情况时,我需要重新启动服务器并重启两个客户端,然后才能运行两个客户端。但是,如果一个客户端终止连接并再次尝试重新连接,则同样的2个错误以相同的方式发生。然后再次重启Server。
任何建议都将受到高度赞赏。 感谢
答案 0 :(得分:1)
答案 1 :(得分:0)
查看java.lang.ThreadLocal
课程。
答案 2 :(得分:0)
我只能在没有看到完整源代码的情况下猜出原因。我假设您使用CipherInput / OutputStream进行加密。您应该为每个线程(每个I / OStream)使用单独的密码实例。每次创建新连接或重新连接时,在客户端和服务器端都运行Cipher的init方法,并创建新的CipherInput / OutputStream实例。
加密对象是有状态的,因此它们不能在线程之间共享。每个线程和每个连接都应该有各自的有状态对象集。