Server.java:Многопоточный сервер Java Socket; Болтаем
private Socket connection;
private int ID;
public static void main(String[] args) {
int port = 19999;
int count = 0;
try{
ServerSocket socket1 = new ServerSocket(port);
System.out.println("Server Initialized");
while (true) {
Socket connection = socket1.accept();
Runnable runnable = new Server(connection, ++count);
Thread thread = new Thread(runnable);
thread.start();
}
}
catch (Exception e) {}
}
Server(Socket s, int i) {
this.connection = s;
this.ID = i;//could use a client name as it is individual id for each thread.?
}
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
PrintWriter out = new PrintWriter(connection.getOutputStream(), true);
String inputLine;
while ((inputLine = in.readLine()) != null) {
Process p = new Process();
String output = p.input(inputLine);
out.println(output);
}
}
}
catch (Exception e) {
System.out.println(e);
}
finally {
try {
connection.close();
}
catch (IOException e){}
}
}
}
При запуске создает сервер, который при подключении к клиентом создает поток для него, так что он может работать с несколькими клиентами одновременно.
Однако код:
while ((inputLine = in.readLine()) != null) {
Process p = new Process();
String output = p.input(inputLine);
out.println(output);
}
петли на BufferedReader, чтобы получить все входные заданный от клиента. и когда он принимает процессы, а затем отправляет ответ обратно клиенту для печати.
Как я могу получить его, чтобы я мог отправить/получить другой вопрос через клиента одновременно с первым?
например
"пользователь: привет компьютер, как вы" "компьютер: Я хорош, как дела?" «пользователь: я хороший» «компьютер: это приятно слышать»
работает нормально. но:
"пользователь: was is 1 + 1?" "компьютер: 1 + 1 = 2" "компьютер: больше вопросов?" "Пользователь: хорошо?"
нет.
как это сделать, чтобы сервер дал несколько ответов, вместо того, чтобы ждать другого ввода?
Было бы легко сделать, если я установить результат в виде строки в Server.java однако каждый раз, когда я пытаюсь получить доступ к строке, чтобы изменить его (с помощью
Server s = new Server(); s.output = "stuff";
), как код предполагает, что это просто делает новый сервер нитей. как я могу получить доступ к уже созданному потоку?
кажется хорошей идеей, но доступ к карте в классе сервера создаст новый поток – Greg
Не обязательно новый поток. Вы можете использовать существующий клиентский поток для доступа к карте. Сама карта может быть расположена в основном потоке сервера. – Wins
Как я могу это сделать? – Greg