如何在这个java服务器中避免无限循环?

时间:2015-10-22 09:40:13

标签: java loops optimization infinite-loop

我不是在谈论线程或任何使这更复杂的事情。 我看到的大多数服务器程序都是这样或同时(真){...}(同样结束)。

import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.io.DataOutputStream;
import java.io.IOException;

public class TCPServer {
    ServerSocket welcomeSocket;
    public TCPServer(int port) throws IOException {
        welcomeSocket = new ServerSocket(port);
    }

    public void go() throws IOException {
        // This is not a valid way to wait for a socket connection, You should
        // not have a forever loop or while(true) 
        **for (; ;) {**
            Socket connectionSocket = welcomeSocket.accept();
            Scanner clientIn = new Scanner(connectionSocket.getInputStream());
            DataOutputStream clientOut = new DataOutputStream(connectionSocket.getOutputStream());
            String clientLine = clientIn.nextLine();
            String modLine = clientLine.toUpperCase();
            clientOut.writeBytes(modLine + "\n");
        }
    }

    public static void main(String[] args){
        try {
            TCPServer server = new TCPServer(6789);
            server.go();
        }
        catch(IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

3 个答案:

答案 0 :(得分:2)

它不会永久循环,您的代码会阻塞在welcomeSocket.accept()行,直到有人连接,并且只有在执行了下一行之后才会等待welcomeSocket.accept()上的新连接。换句话说,它根据需要循环多次(每个连接)。 如果您只想允许一个客户端连接,请删除for (; ;)语句。但是每次都需要重启服务器。

答案 1 :(得分:0)

您可以使用池中任意数量的线程运行调度程序 并防止主线程终止。在这里,我使用了输入流,但您可以通过不同的方式进行操作。在这里,您可以使用多个线程来获取连接并自定义调度程序的频率。

import java.io.IOException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

import org.junit.Test;

public class MyTest {

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4);

@Test
public void hello() {
    final Runnable helloServer = new Runnable() {
        public void run() {
            // handle soket connection here
            System.out.println("hadling connection");
        }
    };
    final ScheduledFuture<?> helloHandle = scheduler.scheduleAtFixedRate(helloServer, 1000, 1000, TimeUnit.MILLISECONDS);

    try {
        System.in.read();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

}

答案 2 :(得分:0)

while(!finished)选项可能比&#34;空&#34;更好。 for循环。退出事件发生时,您只需将已完成设置为true