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

Сервер на несколько клиентов

30.07.2016, 12:37. Показов 2201. Ответов 4
Метки нет (Все метки)

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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package serverforgame;
import java.net.*;
import java.io.*;
 
 
/**
 *
 * @author User
 */
public class Server
{
    ServerSocket ss;
    int port = 6666;
    private String serverstatus = null;
    DataInputStream in;
    DataOutputStream out;
    String answer = null;
    Socket socket1;
    
    
    
    
    public String getStatusServer()
    {
        return serverstatus;
    }
    public void serverStart()
    {
        try
        {
        ss = new ServerSocket(port);
        }catch(Exception e){}
        
    }
    public String userConection()
    { 
        String res = null;
        try{
            
            
            
            
            System.out.println(serverstatus);
           
            socket1 = ss.accept();
          
           
           
            System.out.println(serverstatus);
            
            // Берем входной и выходной потоки сокета
            InputStream sin1 = socket1.getInputStream();
            OutputStream sout1 = socket1.getOutputStream();
 
            // Конвертируем потоки в другой тип
            in = new DataInputStream(sin1);
            out = new DataOutputStream(sout1);         
            System.out.println(serverstatus);
            
            
           
         
                res = "Client connected.....";
         
            
            
         
    
            
        }
        catch(Exception e)
        {
            e.getStackTrace();
        }
    
    return res;
    }
 
    public String serverTalker()
    {
    
        try{
            
             serverstatus = "Waiting message";
             System.out.println(serverstatus);
            answer = in.readUTF();                       
            out.writeUTF(answer);
            out.flush(); 
            serverstatus = "Answered";
            System.out.println(serverstatus);
           
           
           
           
            }catch(Exception e)
            {
                  e.getStackTrace();
             }
    
        return answer;
    }
         
   
  
   
   
}
И клиент
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
package clientforgame;
import java.net.*;
import java.io.*;
/**
 *
 * @author User
 */
public  class Client {
    
   
   private static String address = "127.0.0.1";
   int serverPort = 6666;
   Socket socket;
   DataInputStream in;
   DataOutputStream out;
   
 
   
     
    public void createConnect (){
    
    try{
    
    
     InetAddress ipAddress = InetAddress.getByName(address);
     socket = new Socket(ipAddress, serverPort);
    
    InputStream sin = socket.getInputStream();
    OutputStream sout = socket.getOutputStream();
 
            
    in = new DataInputStream(sin);
    out = new DataOutputStream(sout);
   
    
    
    
    }catch(Exception e){}
    
    }
  
    public void sendMessage(String message){
       
    try{
            
            
            out.writeUTF(message);
            out.flush();
            
    
    
    
    }catch(Exception e){}
    
    }
    
    public String receivMessage(){
        String mesg = null;
        try{
            
            
            mesg = in.readUTF();
            
    
    
    
            }catch(Exception e){}
    return mesg;
    }
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2016, 12:37
Ответы с готовыми решениями:

Сервер и несколько клиентов
Доброго времени суток. Скажите, при создании клиент-сервера, к которому подключаются несколько...

Один сервер и несколько клиентов
Здравствуйте! У меня есть приложение на JavaFX, которое показывает список фильмов (их можно...

Сервер -> множество клиентов
День добрый. Пытаюсь решить задачу на сокеты, всё как всегда. Нужно создать сервер, к которому...

Клиент-сервер со множеством клиентов java
Добрый день. Писал программу клиент-сервер со множественным подключением клиентов, но столкнулся...

4
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
06.08.2016, 22:34 2
Самый простой вариант - обрабатывать каждое соединение в отдельном потоке, а ss.accept() завернуть в цикл (например бесконечный):
Java
1
2
3
4
5
6
7
8
9
            while(true) {
                socket1 = ss.accept();
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        performConnection(socket1);
                    }
                }).start();
            }
1
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
28.02.2017, 03:55 3
Не подскажете как в этом бесконечном while() распараллелить потоки(буфера) ввода/вывода а то сервер посылает список из (наперед неизвестно) 10-ти(строк, элем..) а в клиента принимает всего 1 поток, и возникает разница ввода/вывода потоков.
Спасибо.
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
28.02.2017, 23:00 4
Ничего не понял
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
01.03.2017, 02:00 5
К примеру вот сервер, метод run:
Java
1
2
3
4
5
6
7
8
9
10
11
while(true) {
                string = in1.readLine();
                
                if(string.equalsIgnoreCase("exit")) break;
                if(string.equalsIgnoreCase("help")) {
                    // на запрос "help" вывесли список строчек
                    lambd_out.lam_2().forEach(i -> out1.println(i));
                }
                System.out.println("Client : " + string);
                out1.println("Echo.. " + string);
            }
Это к нему лямбда(ы) для "другого потока" или параллельной задачи
Java
1
2
3
4
5
6
7
8
9
10
interface Lambda_server {
    void lam_1();
    default List<String> lam_2() {
        List<String> a = Arrays.asList("menu : show you menu", "help : show you all command", "exit : exit(for client)", 
                "set_name : set you names to server names system", "get_ID : shows your ID in server's system", 
                "list<get>, list<set> : it's meta command looks like : <command> , with more stream-lines, and with <end> in ends list's", 
                "send<all> : send massege to all client", "send<name> : send message to client with name's");
        return a;
    }
}
С сервером все Ок, Лямбда посылает список строк (если быть точным то один поток построчно посылает весь список но в параллельном выполнении).
Но я не могу правильно все это принять на клиенте. На клиенте надо нажимать Enter чтобы построчно выводился весь список.
Что я делаю на клиенте :
Java
1
2
3
4
5
6
7
8
9
while ((str1 = in_out.readLine()) != null) {
                out1.println(str1);
                if(str1.equalsIgnoreCase("exit")) break;
                if(str1.equalsIgnoreCase("help")) {
                    l_client.lam_2(in1);
                }
str2 = in1.readLine();
System.out.println(str2);
}
где
Java
1
2
3
4
5
6
7
interface Lambda_client {
    void lam_1();
    default void lam_2(BufferedReader a) throws IOException{
        String b = a.readLine();
        System.out.println(b);
    }
}
По всей видимости именно lam_2 неправильно реализована.
Спасибо за отклик.
П.С. как отвечать адрессно?

Добавлено через 1 час 55 минут
Пару дней я добирался к этому решению и именно теперь, после взгяда со стороны, я его нашел.
Если кому интересно, то я просто на сервере добавил out1.println("end_stack"); в конец в тело условия с хэлпом
А на клиенте добавил в условие с хэлпом, бесконечный цикл с выходом if((l_client.lam_2(in1)).equalsIgnoreCase("end_stack")) break; и конечно же поменял возвращаемый параметр лямбды.
В любом случае спасибо.
0
01.03.2017, 02:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2017, 02:00
Помогаю со студенческими работами здесь

Как организовать сервер для многих клиентов?
Подскажите пожалуйста начинающему java-программисту. Как лучше организовать сервер для небольшой...

Сервер c использованием Java nio для множества клиентов
Все привет. Недавно познакомился с java nio, и возник такой вопрос при создании сервера для...

Один сервер несколько клиентов
Всем привет) написала простую сервер-клиент программку (udp), теперь нужно сделать, что бы к...

Несколько клиентов на один сервер
Доброго времени суток! Прошу совета ну или пинка под зад в правильную сторону. Есть приложение,...


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

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