Basic Echo Server, отношения клиент-сервера -- java поле с участием sockets поле с участием networking поле с участием client-server поле с участием echo пол Связанный проблема

Basic echo server, client-server relationship


0
vote

проблема

русский

Так как мой проект, который мне пришлось написать класс клиента и простой класс серверов, который будет эхом сообщение, написанным клиентом.

По какой-то причине я либо получаю исключение ввода / вывода, либо петлю исключений, которые гнездо закрываются.

Я бы действительно ценю некоторую помощь, потому что я борюсь с этой программой в течение 2 дней прямо и не могу найти никаких решений.

Мой класс сервера:

 <код> import java.io.*; import java.net.*; import java.util.regex.Pattern;  public class SimpleServer {     private ServerSocket ss = null;     private BufferedReader in = null;     private PrintWriter out = null;  public SimpleServer(String host, int port) {     try {     InetSocketAddress isa = new InetSocketAddress(host, port);     ss = new ServerSocket();     ss.bind(isa);     } catch (IOException exc) {         System.out.println("Error in constructor");         System.exit(1);     }     System.out.println("Server started.");     System.out.println("on port: " + ss.getLocalPort());     System.out.println("bind address: " + ss.getInetAddress());     serviceConnections();        }//constructor  private void serviceConnections() {          boolean serverRunning = true;      while(serverRunning) {         try {             Socket conn = ss.accept();             System.out.println("Connection established!");             serviceRequests(conn);                       } catch (Exception exc) {             exc.printStackTrace();         }          try { ss.close(); } catch (Exception exc) {}     }        }//serviceConnections  private void serviceRequests(Socket connection) throws IOException {     try {         in = new BufferedReader(new      InputStreamReader(connection.getInputStream()));         out = new PrintWriter(connection.getOutputStream(), true);         String line = in.readLine();                     out.println(line);     } catch (Exception exc) {         exc.printStackTrace();     } finally {         try {             in.close();             out.close();             connection.close();             connection = null;         } catch(Exception exc) {}     } }//serviceReq         public static void main(String[] args) {      String host = "localhost";     int port = 2401;                 new SimpleServer(host,port);         }//main  }//class   

Мой класс клиента:

 <код> import java.net.*; import java.io.*;   public class SimpleServerClient {      private Socket sock = null;     private PrintWriter out = null;     private BufferedReader in = null;  public SimpleServerClient (String host, int port) {          try {         sock = new Socket(host, port);         out = new PrintWriter(sock.getOutputStream(),true);         in = new BufferedReader(new InputStreamReader(sock.getInputStream()));     //  System.out.println("Connected to the: " + sock.getInetAddress() );         makeRequest("ECHO Howdy boy");             } catch (UnknownHostException e) {         System.err.println("Unknown host: "+host);         System.exit(2);     } catch (IOException e) {         System.err.println("I/O error for");         System.exit(3);     } catch (Exception exc) {         exc.printStackTrace();         System.exit(4);     } }//constructor  private void makeRequest(String req) throws IOException {     System.out.println("Request: " + req);     out.println(req);     String resp = in.readLine();     System.out.println(resp);     disconnect(); }//method  public void disconnect() {     try {     out.close();     sock.close();     in.close();          } catch(IOException exc) {         System.out.println("Error while closing");         System.exit(5);     } }//method  public static void main(String[] args) {     new SimpleServerClient("localhost", 2401); }//main }//class   
Английский оригинал

So as my project I had to write a client class and a simple server class that will ECHO message written by the client.

For some reason I either get I/O exception or a loop of exceptions that socket's closed.

I would really appreciate some help, because I struggle with this program for 2 days straight and cannot find any solutions.

My Server class:

import java.io.*; import java.net.*; import java.util.regex.Pattern;  public class SimpleServer {     private ServerSocket ss = null;     private BufferedReader in = null;     private PrintWriter out = null;  public SimpleServer(String host, int port) {     try {     InetSocketAddress isa = new InetSocketAddress(host, port);     ss = new ServerSocket();     ss.bind(isa);     } catch (IOException exc) {         System.out.println("Error in constructor");         System.exit(1);     }     System.out.println("Server started.");     System.out.println("on port: " + ss.getLocalPort());     System.out.println("bind address: " + ss.getInetAddress());     serviceConnections();        }//constructor  private void serviceConnections() {          boolean serverRunning = true;      while(serverRunning) {         try {             Socket conn = ss.accept();             System.out.println("Connection established!");             serviceRequests(conn);                       } catch (Exception exc) {             exc.printStackTrace();         }          try { ss.close(); } catch (Exception exc) {}     }        }//serviceConnections  private void serviceRequests(Socket connection) throws IOException {     try {         in = new BufferedReader(new      InputStreamReader(connection.getInputStream()));         out = new PrintWriter(connection.getOutputStream(), true);         String line = in.readLine();                     out.println(line);     } catch (Exception exc) {         exc.printStackTrace();     } finally {         try {             in.close();             out.close();             connection.close();             connection = null;         } catch(Exception exc) {}     } }//serviceReq         public static void main(String[] args) {      String host = "localhost";     int port = 2401;                 new SimpleServer(host,port);         }//main  }//class 

My client class:

import java.net.*; import java.io.*;   public class SimpleServerClient {      private Socket sock = null;     private PrintWriter out = null;     private BufferedReader in = null;  public SimpleServerClient (String host, int port) {          try {         sock = new Socket(host, port);         out = new PrintWriter(sock.getOutputStream(),true);         in = new BufferedReader(new InputStreamReader(sock.getInputStream()));     //  System.out.println("Connected to the: " + sock.getInetAddress() );         makeRequest("ECHO Howdy boy");             } catch (UnknownHostException e) {         System.err.println("Unknown host: "+host);         System.exit(2);     } catch (IOException e) {         System.err.println("I/O error for");         System.exit(3);     } catch (Exception exc) {         exc.printStackTrace();         System.exit(4);     } }//constructor  private void makeRequest(String req) throws IOException {     System.out.println("Request: " + req);     out.println(req);     String resp = in.readLine();     System.out.println(resp);     disconnect(); }//method  public void disconnect() {     try {     out.close();     sock.close();     in.close();          } catch(IOException exc) {         System.out.println("Error while closing");         System.exit(5);     } }//method  public static void main(String[] args) {     new SimpleServerClient("localhost", 2401); }//main }//class 
</div
              

Список ответов

0
 
vote
vote
Лучший ответ
 

Я уже поделился приятной программой чата, имеющей один сервер, который связывается с несколькими клиентами, используя протокол TCP.

Пожалуйста, посмотрите на Java Server с многоквартирной связь.

Это может помочь вам. Между тем я смотрю свой код.

В вашем коде вы закрыли сокет после подключения с одним клиентом.

Вот исправление:

 <код> private void serviceConnections() {     boolean serverRunning = true;      while (serverRunning) {         try {             Socket conn = ss.accept();             System.out.println("Connection established!");             serviceRequests(conn);         } catch (Exception exc) {             exc.printStackTrace();         }      }     try {         ss.close();     } catch (Exception exc) {     } }// serviceConnections   
 

I have already shared a nice Chat Program having one server that is communicating with multiple clients using TCP protocol.

Please have a look at Java Server with Multiclient communication.

It might help you. Meanwhile I am looking your code.

In you code you have closed the socket after connected with single client.

Here is the fix:

private void serviceConnections() {     boolean serverRunning = true;      while (serverRunning) {         try {             Socket conn = ss.accept();             System.out.println("Connection established!");             serviceRequests(conn);         } catch (Exception exc) {             exc.printStackTrace();         }      }     try {         ss.close();     } catch (Exception exc) {     } }// serviceConnections 
</div
 
 
         
         
0
 
vote

Путь это (должно) Работа:

Сервер открывается <код> ServerSocket и принимает соединения на этом <код> ServerSocket .
Каждое соединение (новый клиент) [следует обрабатывать в отдельном потоке] - это отдельный новый <код> Socket соединение с собственными каналами ввода / вывода.
Для каждого нового Socket вы должны открыть каналы ввода / вывода один раз и держать их открытыми, пока клиент не отключится.

Если вы будете следовать этой логике, все будут работать.

 

The way it (should) work:

Server opens ServerSocket and accept connections on that ServerSocket.
Every connection (new client) [should be handled in separate thread] is a separate new Socket connection with it's own I/O channels.
For each new Socket you should open I/O channels once and keep them open until the client disconnects.

If you follow this logic everything will work.

</div
 
 
 
 

Связанный проблема

0  Этикетки для вершин с использованием библиотеки Юнга  ( Labels for vertices using jung library ) 
Я начал использовать библиотеку Юнга для моей визуализации графика. Основная проблема в настоящее время в настоящее время я не знаю, как установить этикетки /...

9  Phone Gam [Ошибка] CMD: Команда не удалась с помощью выхода кода Enoent  ( Phone gap error cmd command failed with exit code enoent ) 
Я пытаюсь получить разрыв на телефоне работать на Android, и моя команда выводит следующее: <код> phonegap build android [phonegap] detecting Android SDK en...

0  Создание ссылки IPC между плагинами APC Java и C #  ( Establishing ipc link between a java app and c based plugins ) 
У нас есть приложение Java, а также ряд плагинов C #, для других приложений (например, Excel), которые могут взаимодействовать с основным приложением. Слой св...

0  Как удалить начальное нулевое значение?  ( How to remove initial null value ) 
Я загружаю файл и отображаю его как ссылку ... но изначально, когда я загружаю страницу, она отображает нулевое значение ... Я хочу удалить это нулевое значен...

2  Как получить направление на кратчайший путь внешнего круга в Google Maps Android, когда мое текущее местоположение находится внутри 2 или более кругов?  ( How to get direction to the shortest path outside circle in google maps android ) 
Как получить направление к ближайшему расположению внешний круг, если голубые точки - текущее местоположение? 1 [ 1 и как отображать маркеры только во...

1  Получить все идентификаторы элементов из Dynamodb Java с помощью dynamodbmapper  ( Retrieve all items ids from dynamodb java using dynamodbmapper ) 
Моя цель - получить идентификаторы всех предметов. Для этого я собираюсь использовать Java и Dynamodbmapper. Способ сделать это использовать сканирование . П...

1  Eclipse IDE отключается часто  ( Eclipse ide shuts down frequently ) 
Я пытался использовать SDK SDK SDK 22.3.0-887826, чтобы узнать о Develeopment Android, однако IDE отключается часто. Это происходит много, но в основном при и...

-1  Невозможно получить доступ к файлу из сетевого диска  ( Unable to access file from network drive ) 
Я создаю отображение виртуального каталога в Weblogic, передавая местоположение сети и, похоже, не работает. <Код> <wls:virtual-directory-mapping> <wls:...

0  Многонаправленное отношение много к одному в DataNucleus  ( Many to one unidirectional relation in datanucleus ) 
Для контекста, сторона клиента я использую шаблон MVP, поэтому вид с One One liste знает только идентификатор, а когда мой новый <код> Many получен Сервер...

1  Устройство не получают сообщение от GCM  ( Device not receive message from gcm ) 
Я пытаюсь использовать GCM для отправки уведомления с сервера на наше устройство. Все следуют в этом руководстве: http://hmkcode.com/android-google-cloud-m...

0  Чтение записи студентов из файла  ( Reading student record from file ) 
Я пытаюсь прочитать файл, который имеет запись студентов (имя, фамилия и оценка). Я написал простой код для выполнения этой задачи, но код не удается после пр...

1  Файл класса Java содержит комментарии - почему?  ( Java class file contains comments why ) 
Когда я открываю <код> MyClass.class файл в моем редакторе Eclipse, он также показывает мне комментарии кода. Не должен быть оптимизирован .class файла д...

0  Выберите JVM при запуске зажигания  ( Select jvm when running spark job ) 
Как я могу пройти путь Java, чтобы выпить, чтобы выбрать JVM, который не по умолчанию (не в Java_home)? Мне не разрешено устанавливать какие-либо env vars в м...

1  Проблема с использованием TextureView с NDK  ( Issue using textureview with ndk ) 
Я работаю над небольшим кусочком кода, используя текстуру, чтобы отобразить результат среды MediaPlayer. Я сталкиваюсь с проблемой, пытающимся смешивать упр...

-1  SQL Server для моего SQL  ( Sql server to my sql ) 
У меня есть новый проект от моего учителя, чтобы преобразовать базу данных в другую. Как я могу преобразовать базу данных MS SQL в MySQL с помощью Java? ...

Связанный проблема

0  Этикетки для вершин с использованием библиотеки Юнга 
9  Phone Gam [Ошибка] CMD: Команда не удалась с помощью выхода кода Enoent 
0  Создание ссылки IPC между плагинами APC Java и C # 
0  Как удалить начальное нулевое значение? 
2  Как получить направление на кратчайший путь внешнего круга в Google Maps Android, когда мое текущее местоположение находится внутри 2 или более кругов? 
1  Получить все идентификаторы элементов из Dynamodb Java с помощью dynamodbmapper 
1  Eclipse IDE отключается часто 
-1  Невозможно получить доступ к файлу из сетевого диска 
0  Многонаправленное отношение много к одному в DataNucleus 
1  Устройство не получают сообщение от GCM 
0  Чтение записи студентов из файла 
1  Файл класса Java содержит комментарии - почему? 
0  Выберите JVM при запуске зажигания 
1  Проблема с использованием TextureView с NDK 
-1  SQL Server для моего SQL