Java套接字和线程

时间:2015-12-23 15:57:05

标签: java sockets server

你好我正在做这个任务,我无法弄明白这一点。这是作业的声音:

刺激一个拥有许多十字转门的大型足球场,每个十字架都会为每个通过旋转门的观众更新一个共用的计数器。

旋转栅门应使用网络连接和TCP更新计数器。

1.设计一个TCP服务器和一个简单的协议,其中每个旋转门最初报告它是一个旋转门(以区别于Monitor-clients下一步),它的id(旋转门-1-旋转门-n)然后报告通过旋转栅门的每个观众的增量。

我们被告知我们不必实施turstile-clients,我们应该使用telnet刺激十字转门。

我遇到的问题是我不知道如何使用线程,我刚刚开始学习它们,我理解这个任务的方式是我应该给每个旋转门一个线程是错的? 我知道我必须使用线程,因为在作业后期我必须确定竞争条件问题。这就是我到目前为止所做的:

public class Server { 
  static String ip; 
  static int port; 
  static int count; 

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

    ServerSocket serverSocket = new ServerSocket();

    serverSocket.bind(new InetSocketAddress("localhost", 23));

    while (true) {

        Socket turnstile = serverSocket.accept(); 
        PrintStream printToTerminal = new PrintStream(turnstile.getOutputStream());
        printToTerminal.println("Turnstile 1 " + turnstile.getPort() +  " , " + turnstile.getLocalAddress());

        String socketIp = turnstile.getLocalAddress().toString();
        String socketName = "Turnstile-" + socketIp.substring((socketIp.length()-1) , socketIp.length());
        System.out.println(socketName);

        while (true) {

            InputStreamReader input = new InputStreamReader(turnstile.getInputStream());
            BufferedReader bufreader = new BufferedReader(input);
            String message = bufreader.readLine();

            if (message.equalsIgnoreCase("ok")) {
                count++;
                printToTerminal.println(" Number of clients " + count);
            }
            if(message.equalsIgnoreCase("close")){
            turnstile.close();
            }
        }

    } 
  } 
} 

1 个答案:

答案 0 :(得分:1)

你的榜样做你需要的,对吗?然后它适用于一个线程。您可能希望将已经存在的代码“包装”到一个或两个类中,而不是在main方法中编写静态代码,并使至少一个类实现Runnable接口。然后,您可以为要旋转的每个“旋转”线程调用该代码一次。像这样的东西

Runnable r = new MyRunnableClass("someArgLikeThreadID");
r.start();

您可能还想实现一个“TurnstileManager”类来管理将要运行的所有线程的启动和关闭。

由于你使用了“赋值”这个词,我的回答是故意不拼写出来的。绝对最好的学习方法是“解决问题”,并通过自己的方式或通过您在制定心愿所需的应用程序时遇到的困难来解决问题。