Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2013, 13:33   #1
kipill
Пользователь
 
Регистрация: 17.12.2010
Сообщений: 14
По умолчанию Простой сокет сервер

Добрый день форумчане.
Если сервер получающий сообщение:
Код:
package server;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

//Класс Server является примитивным сервером и пересылает обратно присланные на него строки

public class Server {
    
    //Создаем переменную порта
    public static final int PORT = 7070;
    
    public static void main(String[] args) throws IOException {
        //Создаем пользовательский сокет
        Socket s = null;
        //Создаем серверный сокет
        ServerSocket socket = null;
        try {
            //Инициализируем серверный сокет
            socket = new ServerSocket(PORT);
            System.out.println("Start "+socket);
            //Блокируем до установки соединения
            //Инициализируем пользовательский сокет
            //Метод accept() позволяет следить за портом и ожидать соединения
            //В противном случае выбрасывается исключение
            s=socket.accept();
            System.out.println("Connection accepted: "+s);
            //Поток BufferedReader буферезирует данные в процесе чтения и тем самым увеличивает эффективность
            //Метод InputStreamReader является мостом между симбольными и байтными данными
            //Метод считывает байты из потока и преобразует их в символы
            //Метод getInputStream() возыращает входной байтовый поток
            //Создаем поток ввода
            BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
            //Обьект PrintWriter необходим для вывода информации на консоль
            //Поток BufferedWriter так же буферезирует данные в процессе записи
            //Метод OutputStreamWriter преобразует символы в байты
            //Метод getOutputStream()возыращает выходной байтовый поток
            //Создаем поток вывода
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())),true);
            //Запускаем цикл обработки сообщения
            while(true){
                System.out.println("Server start");
                //Считываем следующую строку
                String str = null;
                System.out.println(str);
                str=in.readLine();
                System.out.println("Считано");
                //Если строка является "END" то выходим из цикла
                if(str.equals("END")){
                    break;
                }
                System.out.println("Эхо отсылка: "+str);
                //Отсылаем  строку обратно
                out.println(str);
            }
        } catch (IOException ex) {
            System.out.println(ex.toString());
        } finally{
            //Закрываем пользовательский сокет
            s.close();
            System.out.println("Close "+s);
            //Закрываем серверный сокет
            socket.close();
            System.out.println("Close "+socket);
        }        
    }
    
}
Процесс зависает на этапи считывания сервером полученого сообщения:

Код:
String str =in.readLine();
Подскажите пожалуйста в чем может быть проблема.Заранее благодарен.
kipill вне форума Ответить с цитированием
Старый 04.07.2013, 21:36   #2
bedman
Пользователь
 
Регистрация: 24.07.2012
Сообщений: 28
По умолчанию

ваше сообщение должно заканчиваться байтом 0x13 и 0x10(Line Feed)
bedman вне форума Ответить с цитированием
Старый 05.07.2013, 16:10   #3
kipill
Пользователь
 
Регистрация: 17.12.2010
Сообщений: 14
По умолчанию

Спасибо за подсказку, а можно пример строки если есть такая возможность?
kipill вне форума Ответить с цитированием
Старый 06.07.2013, 00:03   #4
bedman
Пользователь
 
Регистрация: 24.07.2012
Сообщений: 28
По умолчанию

"eeeee\r\n"
bedman вне форума Ответить с цитированием
Старый 08.07.2013, 10:02   #5
kipill
Пользователь
 
Регистрация: 17.12.2010
Сообщений: 14
По умолчанию

Добавил байты, все равно не помогает.
kipill вне форума Ответить с цитированием
Старый 08.07.2013, 10:03   #6
kipill
Пользователь
 
Регистрация: 17.12.2010
Сообщений: 14
По умолчанию

Код клиента

Код:
package client;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

//Класс Client реализует простейший пример клиенского приложения
//Клиент передает на сервер 10 приветов и выводит ответ

public class Client {

    public static void main(String[] args) throws UnknownHostException, IOException {
        //Создаем адресс подключения
        //Указание параметра null означает что был выбран localhost (127.0.0.1)
        //При указании другого адресса необходима конструкция вида InetAddress addr = InetAddress.getByName("192.168.0.67");
        InetAddress addr = InetAddress.getByName(null);
        System.out.println("IPAddr " + addr);
        //Созраем пользовательский сокет подключения в качестве параметров передаем адресс сервера и номер порта
        Socket socket = new Socket(addr, 7070);
        System.out.println("Socket = " + socket);
        try {
            //Создаем буферизированый поток ввода
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //Создаем буферизированый поток вывода
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
            //Запускаем цикл для передачи параметров
            for (int i = 0; i < 10; i++) {
                System.out.println("client start");
                //Передаем поочередно 10 приветов с номером
                out.println("Start " + i + "\r \n");
                System.out.println("Отправлено");
                //Считываем ответ
                String str = in.readLine();
                //Выводим ответ на консоль
                System.out.println(str);
            }
            //Посылаем строку означающую окончакние сесии
            out.println("END");
        }catch(Exception e){
            System.out.println("Error: "+e.toString());
        }finally {
            System.out.println("Close "+socket);
            //Закрываем сокет
            socket.close();
        }
    }
    
}
kipill вне форума Ответить с цитированием
Старый 09.07.2013, 03:59   #7
bedman
Пользователь
 
Регистрация: 24.07.2012
Сообщений: 28
По умолчанию

у тебя клиент сообщение не отправляет, тоесть можно после каждой отправки делать
Код:
out.flush();
или выставить autoFlush
Код:
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
bedman вне форума Ответить с цитированием
Старый 09.07.2013, 10:34   #8
kipill
Пользователь
 
Регистрация: 17.12.2010
Сообщений: 14
По умолчанию

Огромное спасибо.
Заработало
kipill вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен сокет-сервер от ХЕ или ХЕ2. Прик Общие вопросы Delphi 3 02.11.2012 20:53
Java сокет, клиент - сервер, прокси Sab_zero Помощь студентам 0 13.07.2012 15:09
Сокет-сервер для чата bitrop C/C++ Сетевое программирование 0 09.10.2011 12:24
простой COM-сервер RM_ Фриланс 1 10.01.2011 18:46