Я не совсем уверен, что я делаю неправильно. Я новичок в работе с серверами / сокетами и несколько раз пытался взломать этот l oop, но каждый раз, когда он просто блокирует и не разрешает клиенту доступ к серверу. Это сервер:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(2999);
while(true){
Socket s = ss.accept();
System.out.println("Client Connected to Server");
ServerThread th = new ServerThread(s);
th.start();
}
}
Вот рабочая тема
import org.apache.commons.lang3.StringUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ServerThread extends Thread {
private final Socket s;
public ServerThread(Socket s){
this.s=s;
}
public void run(){
try {
username();
} catch (IOException e) {
e.printStackTrace();
}
try {
readMessageAndPrint();
if (closeServer(s)==0){
s.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void username() throws IOException {
InputStreamReader in = new InputStreamReader(s.getInputStream());
BufferedReader bf = new BufferedReader(in);
String str;
try {
str = bf.readLine();
String []firstStatement = StringUtils.split(str);
PrintWriter pr = new PrintWriter(s.getOutputStream());
pr.println("Hello "+firstStatement[4] +", this is the server. " +
"Type 'Hi' to start talking. " +
"Type 'Quit' to leave");
pr.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
private void readMessageAndPrint() throws IOException {
while (true) {
InputStreamReader in = new InputStreamReader(s.getInputStream());
BufferedReader bf = new BufferedReader(in);
String str = bf.readLine();
System.out.println(str);
if ("Quit".equals(str)) {
break;
}
}
}
private static int closeServer(Socket s) throws IOException {
int numberOfClients = 0;
while (true) {
InputStreamReader in = new InputStreamReader(s.getInputStream());
BufferedReader bf = new BufferedReader(in);
String str = bf.readLine();
if ("Quit".equals(str)) {
numberOfClients--;
}
if ("Hi".equals(str)){
numberOfClients++;
}
if (numberOfClients == 0) {
return 0;
}
}
}
}
Как только все клиенты покидают комнату чата, сервер сбрасывается вместо closin. Я попытался поместить метод close server в то время как l oop, чтобы, если ServerThread.closeServer (s) == 0, l oop ломался, но это просто блокировало клиента, достигающего сервера. Опять же, я новичок в программировании и работе в сети, поэтому любая помощь будет принята.