如何将简单的Java Echo Server更改为多线程?

时间:2015-12-02 15:41:54

标签: java multithreading

对于大学的任务,我们必须改变一个给出的例子:

"使用Java构建并测试一个简单的单线程服务器程序,该程序将接受连接,通过该连接返回当前日期和时间,然后关闭连接。"

我们这个班的大多数人之前从未使用过JAVA,而且讲师说只要有效,我们就可以用任何方式编写它。

我修改了代码以生成以下内容:

import java.net.*;
import java.io.*;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class EchoServer {
        public static void main(String[] args) throws IOException {


            int portNumber = 8080;


            try {
                ServerSocket serverSocket = new ServerSocket(portNumber);

                while(true) {

                    Socket clientSocket = serverSocket.accept();

                    PrintWriter out =
                            new PrintWriter(clientSocket.getOutputStream(), true);

                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(clientSocket.getInputStream()));

                    DateFormat df = new SimpleDateFormat("EEEE dd MMMM yyyy - HH:mm:ss");
                    Date dateobj = new Date();
                    //System.out.println(df.format(dateobj));

                    out.write("HTTP/1.1 200 OK\n\n<html><body>" + "The Date and Time is: " + df.format(dateobj) +
                    "</body></html>");

                    out.close();

                    serverSocket.close();

                    } //while
                }

            catch (IOException e) {
                System.out.println("Oops!");
                System.out.println(e.getMessage());
                }


        } //main

}

这是正常的,所以我很满意。

我们要做的下一部分是:

&#34;复制您的解决方案并将其更改为多线程版本。&#34;

我们给了一些多线程代码的样本:

    public class SimpleThread extends Thread{


        protected String threadName;




    public SimpleThread(String name){
        threadName = name;
        }



    public void run(){
            for(int count = 1; count< 100; count++) {
                System.out.println("I am thread " + threadName + ". My count is: " + count);
            //do something slow
            //double result = Math.pow, 1.5);
            }
        }






public static void main(String[] args) {

    System.out.println("Test");


    for (int i = 0; i <10; i++) {
        SimpleThread ste = new SimpleThread("Thread " + i);
        ste.start();
        }


    }

}       

我已经在网上搜索了很多教程,并试图将代码实现到我的中,但我最终还是打破了它并且它不会编译。

那么如何更改代码以使其成为多线程?

1 个答案:

答案 0 :(得分:1)

在第一个版本中,您只接受一个连接,使用它进行操作,然后退出。

这里的想法是接受几个连接,这意味着循环(可能永远):

Socket clientSocket = serverSocket.accept();

每次以这种方式检索新的 clientSocket 时,你应该实例化一个Thread,将它传递给 clientSocket ,然后运行它并让它用 clientSocket (读取,写入......)。

这些线程中的一些可能会同时运行。