使用两线程一个用来读取客户端的数据一个用来转发客户端数据给所有客户端,为什么在客户端输入第一次数据时候只能进行客户端的读取而进行第二次数据发送诗只能进行客户端所有发送,并按此循环

解决方案 »

  1.   

    你这个代码不全  看不出什么 只有两个读取数据的操作不过可以给你讲一下这个思路socket BIO 读写都是阻塞的   所以只能读只能写应该就懂了  一般 读写操作会分为两个线程来处理  一个线程只读 一个线程只写所以 client跟server至少需要四个线程来处理才能完成整个的读写交流操作  
      

  2.   

    在底下写个ClientHandler  里面写上线程操作  然后转发处理
      

  3.   

    开启服务器后端后,调用服务器端的线程,客户端连接后,直接发送消息到服务器端,服务器端跳转到线程服务器端执行直接给你上代码
    //服务器端
    ServerSocket serverSocket=new ServerSocket(8888);
    System.out.println("服务器已开启,等待连接......");

    while(true){
    socket=serverSocket.accept();
    ConnectSocketServer thread=new ConnectSocketServer(socket);
    thread.start();
    //线程
    @Override
    public void run() {
    try {
    System.out.println(socket.getInetAddress().getHostName()+"已连接");
    InputStream inputStream=socket.getInputStream();
    BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
    System.out.println(socket.getInetAddress().getHostName()+"给你发来消息:"+bufferedReader.readLine());
    socket.shutdownInput();

    Scanner scanner=new Scanner(System.in);
    System.out.print("请回复消息:");
    String message=scanner.next();
    OutputStream outputStream=socket.getOutputStream();
    byte [] b=message.getBytes();
    outputStream.write(b);
    outputStream.flush();
    }
    //客户端
    socket=new Socket("192.168.0.2", 8888);
    outputStream=socket.getOutputStream();
    System.out.print("请输入文本:");
    String message=scanner.next();
    //String message="";
    byte [] b=message.getBytes();
    outputStream.write(b);
    outputStream.flush();
    socket.shutdownOutput();

    InputStream is=socket.getInputStream();
    BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(is));
    System.out.println(bufferedReader.readLine());
      

  4.   

    Java 网络编程 之 TCPhttp://www.verejava.com/?id=16994896966324
      

  5.   

    //线程
    @Override
    public void run() {
    try {
    System.out.println(socket.getInetAddress().getHostName()+"已连接");
    InputStream inputStream=socket.getInputStream();
    BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
    System.out.println(socket.getInetAddress().getHostName()+"给你发来消息:"+bufferedReader.readLine());
    socket.shutdownInput();Scanner scanner=new Scanner(System.in);
    System.out.print("请回复消息:");
    String message=scanner.next();   //这里是阻塞的  所以你服务器收到消息之后只能在这里等着   等你打完字之后再回执行之后的代码
    OutputStream outputStream=socket.getOutputStream();
    byte [] b=message.getBytes();
    outputStream.write(b);
    outputStream.flush();
    }
    最后  读取操作也是阻塞的   只有当客户端发来消息之后再回执行之后的代码然后收不到消息的时候 就无法执行之后的输入操作 也就无法发送信息。反之亦然  所以 最终导致  你只能发一次信息收一次信息才能走下一个回合