Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 - Fatal编程技术网

Java 服务器如何响应下面代码中的客户机?

Java 服务器如何响应下面代码中的客户机?,java,multithreading,Java,Multithreading,下面的代码创建了一个服务器 package practice; import java.io.*; import java.net.*; import java.util.*; public class SimpleChatServer { private ArrayList clientOutputStreams; public static void main(String args[]) { SimpleChatServer serve =

下面的代码创建了一个服务器

package practice;

import java.io.*;
import java.net.*;
import java.util.*;

public class SimpleChatServer 
{
    private ArrayList clientOutputStreams;

    public static void main(String args[])
    {
        SimpleChatServer serve = new SimpleChatServer();
        serve.go();
    }
    public void go()
    {
        clientOutputStreams = new ArrayList();


        try
        {
            ServerSocket sock = new ServerSocket(5001);
            while(true)
            {
                Socket clientSocket = sock.accept();
                PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
                clientOutputStreams.add(writer);

                Thread t = new Thread(new ClientHandler(clientSocket));
                t.start();
                System.out.println("New client connected");
            }

        }
        catch(Exception e)
        {
            System.out.println("Error in the go function");
            e.printStackTrace();
        }
    }

    private class ClientHandler implements Runnable
    {
        private Socket client;
        BufferedReader reader;
        public ClientHandler(Socket socket)
        {
            try
            {
            client = socket;
            InputStreamReader instream = new InputStreamReader(client.getInputStream());
            reader = new BufferedReader(instream);
            }
            catch(Exception e)
            {

            }
        }
        public void run()
        {
            try
            {
            String inMessage = null;
            while((inMessage = reader.readLine())!=null)
            {
                tellEveryone(inMessage);
            }
            }
            catch(Exception e)
            {

            }
        }
    }

    private void tellEveryone(String message)
    {
        Iterator it = clientOutputStreams.iterator();
        while(it.hasNext())
        {
            PrintWriter pen = (PrintWriter)it.next();
            pen.println(message);
            pen.flush();
        }
    }
}
我不明白的代码是

while((inMessage = reader.readLine())!=null)
{
                tellEveryone(inMessage);
}
我的疑问是:如果最初没有来自客户端的消息,while()中的语句是否会计算为false,从而导致线程完成运行它必须运行的代码。它如何能够在没有无限循环的情况下继续侦听来自同一客户机的消息


如果你否决了我的问题,请告诉我原因

inMessage=reader.readLine()
不会生成空值,因为它会阻塞

  • 直到它得到任何要处理或
  • 套接字连接已终止

  • 希望这对客户端有所帮助。getInputStream()返回阻塞流。这意味着读取此流的线程将被阻止,直到可以读取某些字节为止


    所以,
    while((inMessage=reader.readLine())!=null)
    line将等待收到消息。当消息到达时,读取器将返回消息并执行while块。

    如果使用Java 1.5或更高版本,则应使用参数化(通用)列表接口和ArrayList实现,而不仅仅是存储对象的普通ArrayList