Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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 发送请求并处理多个线程通过套接字相互通信而不受干扰_Java_Multithreading_Sockets - Fatal编程技术网

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

Java 发送请求并处理多个线程通过套接字相互通信而不受干扰,java,multithreading,sockets,Java,Multithreading,Sockets,我正在创建一个基于客户机-服务器模型的Java程序,在这个模型中,我需要服务器和客户机进行通信 更具体地说,我需要他们相互“下达命令”或请求,并在这些命令/请求中传输数据,你可以看到我试图实现的东西看起来像一个方法,但这些“方法”不是在本地发生的,而是由一方调用,由另一方执行 例如,一种可能的情况是: 服务器正在侦听订单 客户端尝试进行身份验证 并将用户名和密码发送到服务器 服务器接收 身份验证请求控制用户名和 密码正确,并向客户端报告 客户是 现已认证 服务器再次侦听订单 现在,我的第一个想法

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

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

例如,一种可能的情况是:

  • 服务器正在侦听订单
  • 客户端尝试进行身份验证 并将用户名和密码发送到服务器
  • 服务器接收 身份验证请求控制用户名和 密码正确,并向客户端报告
  • 客户是 现已认证
  • 服务器再次侦听订单
  • 现在,我的第一个想法是使用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
    } 
    
    对我来说,这似乎不是最好的选择,我认为有更好的方法可以做到这一点,但我只是不知道如何做到,我已经寻找了一个更好的解决方案,但什么也没有找到

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

    例如:假设客户端正在进行身份验证,它正在发送用户名、密码等。。。但与此同时,服务器希望检查客户端是否仍然连接,因为线程每秒都在连接,我如何确保每个信息都在正确的位置传递,而不会阻塞流或线程接收不需要的数据?如果客户端正在等待知道用户名和密码是否正确,我不想让另一个线程的请求阻塞它,因为它正在做完全不同的事情


    基本上:我的客户机/服务器程序可以是多线程的,套接字也可以吗?我可以让线程服务器A与线程客户端A通信,线程服务器B与线程客户端B通信而不相互干扰吗?我可以从同一个套接字中获得多个流并分别处理它们吗?

    你看过吗?是的,但在这种情况下,他只读和写了一次。我需要能够同时阅读两个不同的来源,例如:服务器需要能够在一个线程中侦听一个字符串,在另一个线程中侦听另一个字符串,而无需这些字符串交换并进入错误的线程查看ThreadLocal类的方向以存储线程相关的值并对其进行操作-请参阅,例如,你看过吗?是的,但在这种情况下,他只读和写了一次。我需要能够同时阅读两个不同的来源,例如:服务器需要能够在一个线程中侦听一个字符串,在另一个线程中侦听另一个字符串,而无需这些字符串交换并进入错误的线程查看ThreadLocal类的方向以存储线程相关的值并对其进行操作-例如,请参阅