发送请求和处理多个线程通过套接字相互通信而不会受到干扰

时间:2017-04-07 17:57:46

标签: java multithreading sockets

我正在创建一个基于客户端 - 服务器模型的Java程序,我需要服务器和客户端进行通信。

更具体地说,我需要他们互相“命令”或者请求事情,并在这些订单/请求中传输数据,你可以看到我想要实现的东西看起来像一个方法,但不是在本地发生,这些“方法”由一方调用,另一方执行。

例如,可能的情况是:

  1. 服务器正在侦听订单
  2. 客户端尝试进行身份验证 并将用户名和密码发送到服务器
  3. 服务器收到 身份验证请求,控制用户名和 密码正确并报告给客户
  4. 客户是 现已通过身份验证
  5. 服务器再次收听订单
  6. 现在,我的第一个想法是使用DataInputStream和DataOutputStream,以字符串的形式发送请求,例如,如果我希望客户端请求身份验证,我会做这样的事情:

    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    dos.writeUTF("requestAuth");
    dos.writeUTF(username);
    dos.writeUTF(password);
    

    和服务器:

    DataInputStream dis = new DataInputStream(socket.getInputStream());
    if(dis.readUTF().equals("requestAuth")){
        String username = dis.readUTF();
        String password = dis.readUTF();
        //Check whether they're correct or not bla bla bla
    } 
    

    这对我来说似乎不是最好的选择,我认为有更好的方法可以做到这一点,但我只是不知道如何,我已经寻找更好的解决方案,但什么也没找到。

    出现的另一个问题是我需要服务器和客户端能够同时发送这些请求,并且可以随时,异步地发送这些请求。

    例如:假设客户端正在验证,它正在发送用户名,密码等...但同时服务器想要检查客户端是否仍然连接,因为线程每秒都在执行,我该怎么做确保每个信息都在正确的地方传递,而不会阻塞流或线程接收不需要的数据?如果客户端正在等待知道用户名和密码是否正确,我不想用其他完全不同的线程的请求阻塞它。

    基本上:我的客户端/服务器程序可以是多线程的,也可以套接字而不会让事情变得混乱?我可以让线程ServerA与线程ClientA通信,并且线程ServerB与线程ClientB进行通信而不会相互干扰吗?我可以从同一个套接字中拥有多个流并单独处理它们吗?

0 个答案:

没有答案