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

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

08.02.2016, 21:47. Показов 814. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru