Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346

Клиент-серверное взамодействие

08.02.2016, 21:47. Показов 804. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Подскажите пожалуйста с чего начать или материалом для чтения? Есть программка , у клиента и сервера меню одинаковое. Сервер создаёт и отправляет запросы, реализовать через (Socket, ServerSocket). Серверная часть должна обеспечивать потокобезопасность операций.

Добавлено через 6 минут
И ещё вопрос ,что значит тут потокобезопасность ?.Чтобы много клиентов могли подключаться?

Добавлено через 8 часов 35 минут
не могу прочитать данные с клиента
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
package com.company;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
/**
 * Created by Andrei on 08.02.2016.
 */
public class ClientThread implements Runnable {
    Socket s;
    int digitMes;
    private boolean shutdown=false;
    private InputStreamReader inStream;
    private OutputStreamWriter outStream;
    private Scanner scanner;
    private String message;
    private PrintWriter out;
    ClientThread(Socket s){
        this.s=s;
    }
 
    @Override
    public void run() {
 
        while(s!=null){
            try {
                Catalog myObj=new Catalog();
                inStream =new InputStreamReader(s.getInputStream(),"UTF8");
                outStream=new OutputStreamWriter(s.getOutputStream(),"UTF8");
                scanner=new Scanner(inStream);
                Scanner sc=new Scanner(System.in);
                out=new PrintWriter(outStream,true);
                out.println("Input of menu  item\n1-read the list\n2-add in the list\n3-edit the list\n4-delete in the list\n5-create new the file and delete old data\n6-download from the file\n7-upload to the file\n");
                System.out.println("this message");
                takeMes();
                System.out.println("this message");
 
                while(!shutdown&&scanner.hasNextLine()){
 
                    Control._control.sendAll(message);
                    out.println("first message");
                    message=scanner.nextLine();
                    out.println("second message");
                    System.out.println(takeMes());
                }
            } catch (IOException ex) {
                System.out.println("Error initialization clients streams:  "+ex.getMessage());
            }finally{
                try {
                    inStream.close();
                    shutdown=true;
                    s.close();
                    s=null;
                    Control._control.shutdownClient(this);
                    System.out.println("Client disconnect");
                } catch (IOException ex) {
                    System.out.println("Client thread error:  "+ex.getMessage());
                }
 
            }
        }
    }
    public void send(String s){
        out.println(s);
    }
    public String takeMes(){
        System.out.println(scanner.nextLine());
       return scanner.nextLine();
    }
 
}
Добавлено через 33 минуты
мб проблема в клиенте?
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
package com.company;
 
import java.io.*;
import java.net.*;
import java.util.Scanner;
 
public class Client {
    public static void main(String[] args) throws IOException {
 
        System.out.println("Welcome to Client side");
 
        Socket fromserver = null;
 
        String s = "localhost";
        fromserver = new Socket(s, 1000);
        System.out.println("Connecting to... " + s);
 
 
        BufferedReader in = new BufferedReader(new InputStreamReader(fromserver.getInputStream()));
        PrintWriter outThread = new PrintWriter(fromserver.getOutputStream(),true);
        BufferedReader inu = new BufferedReader(new InputStreamReader(System.in));
        Scanner sc = new Scanner(System.in);
        String fuser, fserver;
        int digitMes;
 
        while ((fuser = inu.readLine()) != null) {
            System.out.println("press enter");
            while(in.ready()) {
                fserver = in.readLine();
                System.out.println(fserver);
            }
            outThread.print("hi");
            System.out.println("press enter");
 
        }
 
        outThread.close();
        in.close();
        inu.close();
        fromserver.close();
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.02.2016, 21:47
Ответы с готовыми решениями:

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

Многопточное клиент-серверное приложение
Добрый день. Собственно задача такая: Написать консольное клиент-серверное приложение, реализующее функцию словаря. Словарь должен...

Простое клиент-серверное игровое приложение
Доброго времени суток форумчани. Хотел бы спросить совета , а точней напутствий. Хочу написать небольшую многопользовательскую игру,...

8
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
08.02.2016, 22:02
vifelso, привет.
Про потокобезопасность, думаю имеется ввиду возможность подключения кучи клиентов и чтобы при этом сервер не глюканул.

По поводу Вашего кода - не пойму где сервер?

На работе как раз этой темой занимаюсь (надо брать из контроллеров данные и раздавать по сети), завтра могу показать куски кода и будет интересно - может тут подскажут правильно/нет или вообще безграмотно (хоть на работе все и работает)
0
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346
08.02.2016, 22:50  [ТС]
Спасибо за внимание) , про потокобезопасность так и думал. Сервер -первый код, клиент- второй. Не пойму толи отсылает клиент неправильно , толи сервер не принимает(

Добавлено через 34 минуты
Exception in thread "Thread-1" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java: 1540)
at com.company.ClientThread.run(ClientThrea d.java:31)
at java.lang.Thread.run(Thread.java:745)

Добавлено через 41 секунду
Что же такое ? Не принимает и всё (
0
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
09.02.2016, 00:04
А можно посмотреть часть кода с упоминанием ServerSocket?
0
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346
09.02.2016, 00:22  [ТС]
сервер
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
package com.company;
 
import java.net.*;
import java.io.*;
public class Server {
    public static void main(String[] ar)    {
        int port = 6666; // случайный порт (может быть любое число от 1025 до 65535)
        try {
            ServerSocket ss = new ServerSocket(port); // создаем сокет сервера и привязываем его к вышеуказанному порту
            System.out.println("Waiting for a client...");
 
            Socket socket = ss.accept(); // заставляем сервер ждать подключений и выводим сообщение когда кто-то связался с сервером
            System.out.println("Got a client :) ... Finally, someone saw me through all the cover!");
            System.out.println();
 
            // Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиенту.
            InputStream sin = socket.getInputStream();
            OutputStream sout = socket.getOutputStream();
 
            // Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения.
            DataInputStream in = new DataInputStream(sin);
            DataOutputStream out = new DataOutputStream(sout);
 
            String line = null;
            while(true) {
                int digitResponse= in.readInt(); // ожидаем пока клиент пришлет строку текста.
                System.out.format("this digit response from client %d",digitResponse);
                System.out.println("The dumb client just sent me this line : " + line);
                System.out.println("I'm sending it back...");
                out.writeUTF("hi"); // отсылаем клиенту обратно ту самую строку текста.
                out.flush(); // заставляем поток закончить передачу данных.
                System.out.println("Waiting for the next line...");
                System.out.println();
            }
        } catch(Exception x) { x.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
package com.company;
 
import java.net.*;
import java.io.*;
 
public class Client {
    public static void main(String[] ar) {
        int serverPort = 6666; // здесь обязательно нужно указать порт к которому привязывается сервер.
        String address = "127.0.0.1"; // это IP-адрес компьютера, где исполняется наша серверная программа.
        // Здесь указан адрес того самого компьютера где будет исполняться и клиент.
 
        try {
            InetAddress ipAddress = InetAddress.getByName(address); // создаем объект который отображает вышеописанный IP-адрес.
            System.out.println("Any of you heard of a socket with IP address " + address + " and port " + serverPort + "?");
            Socket socket = new Socket(ipAddress, serverPort); // создаем сокет используя IP-адрес и порт сервера.
            System.out.println("Yes! I just got hold of the program.");
 
            // Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиентом.
            InputStream sin = socket.getInputStream();
            OutputStream sout = socket.getOutputStream();
 
            // Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения.
            DataInputStream in = new DataInputStream(sin);
            DataOutputStream out = new DataOutputStream(sout);
 
            // Создаем поток для чтения с клавиатуры.
            BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            System.out.println("Type in something and press enter. Will send it to the server and tell ya what it thinks.");
            System.out.println();
 
            while (true) {
                int digitResponse = keyboard.read(); // ждем пока пользователь введет что-то и нажмет кнопку Enter.
                System.out.println("Sending this line to the server...");
                out.writeInt(digitResponse); // отсылаем введенную строку текста серверу.
                out.flush(); // заставляем поток закончить передачу данных.
                line = in.readUTF(); // ждем пока сервер отошлет строку текста.
                System.out.println("The server was very polite. It sent me this : " + line);
                System.out.println("Looks like the server is pleased with us. Go ahead and enter more lines.");
                System.out.println();
            }
        } catch (Exception x) {
            x.printStackTrace();
        }
    }
}
числа передаются не правильно(

Добавлено через 4 минуты
по отладчику вроде здесь проблема int digitResponse = keyboard.read(); ввожу 1 записывает 49)

Добавлено через 4 минуты
Выход из ситуации класс Scanner sc=new Scanner(System.in);

Добавлено через 2 минуты
так, осталось как-то прикрутить Rannable)
0
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
09.02.2016, 00:41
49 - это ASCII код.
Сейчас у Вас сервер принимает одного клиента. А надо чтобы он делал ss.accept(), создавал поток для обработки полученного сокета и снова ждал.
А в чем смысл пользоваться InetAddress? Можно же просто new Socket(address, serverPort).
0
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346
09.02.2016, 00:52  [ТС]
Можно и так.) Нужно подумать как вот сделать . В общем программка типа каталога (в каталоге объекты, хранятся в ArrayList), и вот думаю что мне на клиент передавать логику или не стоит? , делать просто запрос на сервер, потом на сервере всё выполняется и результат на клиент?
0
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
09.02.2016, 12:45
Покопался в своих дебрях... Понял, что они не очень годятся для примера, т.к. дебри
Быстренько набросал маленький примерчик:

Начало
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package fortests_001;
 
import java.io.IOException;
 
public class ForTests_001 {
 
    public static void main(String[] args) throws IOException, InterruptedException {
        System.out.println("Запускаем server и штук 100 клиентов...");
        new Thread(new Server()).start();
        for (int i = 0; i < 100; i++) {
            new Thread(new Client()).start();
            Thread.sleep(10); // Для красоты :)
        }
    }
}
Сервер
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
package fortests_001;
 
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
 
public class Server implements Runnable {
 
    private static ServerSocket ssocket;
 
    @Override
    public void run() {
        try {
            ssocket = new ServerSocket(4546);
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            return;
        }
 
        Socket socket;
        try {
            while ((socket = ssocket.accept()) != null) {
                new Thread(new SocketProcessor(socket)).start();
            }
        } catch (IOException ex) {
            System.out.println("ssocket закрылся.");
        }
 
        System.out.println("Работа сервера завершена.");
    }
 
    public static void KillServer() {
        try {
            ssocket.close();
        } catch (IOException ex) {
        }
    }
 
}
Обработчик соединения
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
package fortests_001;
 
import java.io.IOException;
import java.net.Socket;
 
public class SocketProcessor implements Runnable {
 
    Socket socket;
 
    public SocketProcessor(Socket socket) {
        this.socket = socket;
    }
 
    private String GetRespFromSocket() {
        int ci;
        StringBuilder si = new StringBuilder();
        try {
            while ((ci = socket.getInputStream().read()) > 0) {
                si.append((char) ci);
            }
        } catch (IOException ex) {
            return "";
        }
        return si.toString();
    }
 
    @Override
    public void run() {
        while (!socket.isClosed()) {
            String cmd = GetRespFromSocket();
            System.out.println("msg = " + cmd);
        }
    }
}
Ну и безумный клиент
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
package fortests_001;
 
import java.io.IOException;
import java.net.Socket;
 
public class Client implements Runnable {
 
    @Override
    public void run() {
        Socket socket;
        try {
            socket = new Socket("localhost", 4546);
        } catch (IOException ex) {
            return;
        }
 
        int i = 0;
        while (!socket.isClosed()) {
            try {
                socket.getOutputStream().write(("I am a client "" + this.toString() + ""! This is my message #" + i + "!\000").getBytes());
                i++;
            } catch (IOException ex) {
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
            }
        }
    }
}
Вот предлагаю от этого плясать... Если нужно, отвечу чуть позже (сервак на работе упал... разгребаю).
1
1 / 1 / 2
Регистрация: 06.11.2014
Сообщений: 346
09.02.2016, 13:08  [ТС]
Спасибо , но это я уже сделал. Счас вот другое нужно сделать restfull-сервис. Отдельная тема уже создана мною.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2016, 13:08
Помогаю со студенческими работами здесь

Клиент-серверное приложение
Всем доброго времени суток! Задание: Разработать программу на языке JavaК, демонстрирующую сетевые возможности языка Java. Сетевая...

Клиент серверное приложение на java
Здравствуйте, помогите с данным заданием: 3. Клиентская часть: 1) Графический интерфейс(фрейм), с переключением между командами при...

Клиент-серверное приложение Шилдт
Здравствуйте. Изучаю Java по Шилдту, дошёл до главы 27, раздел удаленный вызов методов. Приводится пример клиент-серверного приложения....

Клиент-серверное приложение. Протокол взаимодействия
Здравствуйте. Сервер может обрабатывать около 300 соединений. Думал реализовать всё на сокетах, но есть одно но. Надо при определенных...

Клиент-серверное приложение отправка сообщений
Помогите разобраться создаю клиент-серверное приложение отправка сообщений. //Сервер package ClientServer; import...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru