我不是在谈论线程或任何使这更复杂的事情。 我看到的大多数服务器程序都是这样或同时(真){...}(同样结束)。
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();
}
}
}
答案 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
。