Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
-12 / 0 / 4
Регистрация: 04.10.2014
Сообщений: 272
1

Многопоточный сервер на сокетах

02.10.2016, 23:47. Показов 6244. Ответов 3

Author24 — интернет-сервис помощи студентам
Задание: Написать многопоточный сервер на сокетах.Схема работы на подобии чата: клиент отправляет сообщение, сервер получает и отправляет ответ, взаимодействие осуществляется пока клиент "не отключится".
Вот, что получилось:
Клиент:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
 
public class Main {
 
    public static void main(String args[]) throws IOException
    {
        Client obj = new Client();
        obj.Run();
        return;
    }
}
 
class Client {
 
    Socket client = null;
    PrintWriter out;
    BufferedReader inputLine;
 
    public Client()
    {
        try {
 
            client = new Socket(InetAddress.getLocalHost().getLocalHost(), 3456);
 
            //Создаем выходной поток клиента
            OutputStream outStream = client.getOutputStream();
            out = new PrintWriter(outStream, true);
 
            //Создаем входной поток клиента
            InputStream inStream = client.getInputStream();
            inputLine = new BufferedReader(new InputStreamReader(inStream));
 
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
    }
 
    public void Run()
    {
        int checksolve = 0;
        try {
            BufferedReader bRead = new BufferedReader(new InputStreamReader(System.in));
            String str = null ;
 
            while (checksolve != 1) {
                System.out.println("Vvod:");
                str = bRead.readLine();
                try {
                    checksolve = Integer.parseInt(str);
                }
                catch (NumberFormatException ex)
                {
 
                }
                //Отправляем строку серверу
                out.println(str);
                String str2;
                //Получаем строку от сервера
                while((str2 = inputLine.readLine())!= null)
                {
                    System.out.println("Otvet:");
                    System.out.println(str2);
                }
            }
            this.Stop();
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
    }
 
    public void Stop()
    {
        try {
            out.close();
            inputLine.close();
            client.close();
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
    }
 
 
}
Сервер:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Main {
 
    public static void main(String args[]) throws IOException
    {
        Server server = new Server();
        return;
    }
 
}
 
class Server {
 
    private ServerSocket server = null;
    private Socket client = null;
    public static int  numberOfOnline = 0;
 
    public Server()
    {
        try {
            try {
                server = new ServerSocket(3456);
                System.out.println("Waiting...");
                while (true) {
                    client = server.accept();
                    numberOfOnline++;
                    System.out.println("One more clients has been conected");
                    System.out.println("The are " + numberOfOnline + "clients online");
                    Runnable r = new ThreadEchoHandler(client);
                    Thread t =  new Thread(r);
                    t.start();
                }
            }
            finally {
                client.close();
                server.close();;
            }
        }
 
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
 
 
 
    }
 
}
 
class ThreadEchoHandler implements Runnable {
 
    private Socket client = null;
 
    private boolean stoped;
 
    public ThreadEchoHandler(Socket socket)
    {
        client = socket;
    }
 
    public void setStop() {
        stoped = true;
    }
 
    public void run()
    {
        try{
 
            //Входной поток сервера
            InputStream inStream = client.getInputStream();
            BufferedReader inputLine = new BufferedReader(new InputStreamReader(inStream));
 
            //Выходной поток сервера
            OutputStream outStream = client.getOutputStream();
            PrintWriter out = new PrintWriter(outStream,true);
 
            BufferedReader bRead = new BufferedReader(new InputStreamReader(System.in));
            String str = null;
            int chechk = 0;
            //Принимаем строку от клиента
            while ((str = inputLine.readLine())!= null)
            {
                //Выводим полученную строку на экран
                System.out.println(str);
            }
            try{
                //Приводим полученную строку к int
                chechk = Integer.parseInt(str);
                //Проверяем int
                if(chechk != 1)
                {
 
                    String m;
                    System.out.println("Ввод:");
                    m = bRead.readLine();
                    //Отправляем сообщение клиенту
                    out.println(m);
                }
            }
            catch (NumberFormatException ex)
            {
 
            }
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
        try {
            client.close();
            Server.numberOfOnline--;
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
    }
 
 
}
Проблема: сервер получает сообщение и отображает, а дальше все глухо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2016, 23:47
Ответы с готовыми решениями:

Сервер java реализация на сокетах
Здравствуйте, уважаемые жители форума) Есть вопрос. Создание сервера на сокетах, в случае...

Многопоточный сервер и 2 клиента
Есть сервер на котором работают два потока: один поток принимает сообщения от первого клиента,...

Многопоточный Http сервер, работающий внутри сети
Всем добрый вечер, начинаю изучать java, поэтому честно даже и не знаю где писать и в какой теме)...

Сервер на сокетах: Нельзя повторно отправить данные на сервер
Делаю сервер на сокетах. Первая отправка данных на сервер проходит успешно, сервер получает и...

3
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
03.10.2016, 09:51 2
Цитата Сообщение от artart96 Посмотреть сообщение
Java
1
2
3
4
5
while ((str = inputLine.readLine())!= null)
* * * * * * {
* * * * * * * * //Выводим полученную строку на экран
* * * * * * * * System.out.println(str);
* * * * * * }
классика. ты читаешь в str по строчке пока str не станет равна null, а предыдущие данные то теряются
1
-12 / 0 / 4
Регистрация: 04.10.2014
Сообщений: 272
03.10.2016, 21:18  [ТС] 3
Цитата Сообщение от LeX BB Посмотреть сообщение
классика. ты читаешь в str по строчке пока str не станет равна null, а предыдущие данные то теряются
И что? Я не понимаю почему дальше не выводится сообщение, чтобы со стороны сервера было введено сообщение и отправлено клиенту.

Добавлено через 14 минут
Цитата Сообщение от artart96 Посмотреть сообщение
И что? Я не понимаю почему дальше не выводится сообщение, чтобы со стороны сервера было введено сообщение и отправлено клиенту.
Получается я не выхожу из массива считывания строки, мне нужно передавать какое-то слово от клиента, чтобы сервер в процессе считывания в случае этого слово прекращал считывание?
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
04.10.2016, 16:47 4
Цитата Сообщение от artart96 Посмотреть сообщение
Java
1
while ((str = inputLine.readLine())!= null)
этот цикл будет крутиться пока str не станет равна null
поэтому в этой строчке данных в str не будет - значение null
Цитата Сообщение от artart96 Посмотреть сообщение
Java
1
chechk = Integer.parseInt(str);
вообще учись отладчиком пользоваться
0
04.10.2016, 16:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2016, 16:47
Помогаю со студенческими работами здесь

Сервер на сокетах: невозможно повторно запустить сервер
пишу сервер на сокетах, но надо не в консоли, а на Windows Forms, значит по кнопке у меня сервер...

Сервер на сокетах
Задача написать сервер принимающий сообщения со всех клиентов и выводящий их в консоль. Что...

Сервер на сокетах с многопоточностью
подскажите пожалуйста что я может делаю не так хочу сделать сервер что бы к нему могли подключатся...

Многоклиентный сервер на сокетах
Нужен пример того как правильно обрабатывать клиентов и реагировать на ошибки при разрыве...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru