У меня очень простая Java-программа капитализации. Клиент отправляет текст, считанный со стандартного ввода на сервер, который преобразует этот текст в заглавные буквы. Программа работает хорошо, но как только клиент остановлен (используется NetBeans ide), сервер также сбрасывается. Серверный сокет должен продолжать слушать новое соединение с клиентами независимо от остановленного клиента.
public class Client
{
public static void main(String[] args) throws IOException
{
try(Socket s=new Socket("localhost",9090))
{
while(true)
{
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
BufferedReader rd=new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedReader from=new BufferedReader(new InputStreamReader(System.in));
String read=from.readLine();
out.println(read);
String answer;
answer=rd.readLine();
System.out.println(answer);
}
}
}
}
public class Server
{
public static void main(String[] args) throws IOException
{
try(ServerSocket listener = new ServerSocket(9090);
Socket socket = listener.accept();)
{
while (true)
{
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
System.out.println("Started...");
String transform=br.readLine();
String newStr=transform.toUpperCase();
out.println(newStr);
}
}
}
}
Случается нормальное поведение. Код сервера включает только обработку одного клиента. Функция listener.accept() принимает только последнее соединение с сервером. Вам нужно поместить прослушанный.accept() в цикл и обработать все исключения, которые возникают внутри. Код на стороне сервера должен выглядеть следующим образом:
public class Server
{
public static void main(String[] args) throws IOException
{
try(ServerSocket listener = new ServerSocket(9090);
while (true) {
try {
Socket socket = listener.accept();)
…
} catch (SocketException ex) {
...
}
}
}
}
Но имейте в виду, что этот код будет обрабатывать только один клиент за раз. Нет многопоточности в этом коде.
Ваш Server
закрывает соединение, а затем завершает работу, потому что он создается вне цикла while. Я считаю, что это то, что вам нужно.
public class Server {
public static void main (final String[] args)
throws IOException {
while (true) {
try (ServerSocket listener = new ServerSocket(9090); Socket socket = listener.accept();) {
while (true) {
final BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
final PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
System.out.println("Started...");
final String transform = br.readLine();
if (transform == null)
break;
final String newStr = transform.toUpperCase();
out.println(newStr);
}
}
}
}
}