Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/14: Рейтинг темы: голосов - 14, средняя оценка - 4.93
11 / 11 / 0
Регистрация: 04.11.2012
Сообщений: 127

Сокеты, сервер и как это должно работать

29.01.2014, 10:56. Показов 3042. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нашел хорошую статью работы с сокетами:
http://www.quizful.net/post/ja... rogramming
Вроде как бы разобрался, но проблема в следующем...
Есть задание :
Сервер хранит базу данных аукциона, состоящую из произвольного числа записей
вида (номер товара, наименование товара, минимальная цена, последняя ставка,
число времени прошедшее с момента последней ставки, идентификатор клиента,
сделавшего последнюю ставку). Клиент, подключаясь к серверу, может получить
содержимое базы данных и сделать новую ставку на товар (большую, чем уже
сделанная), если ставку клиента никто не перебивает в течении N единиц времени
(N определяется сервером), товар продается и сервер удаляет его из базы. Сервер
должен уметь работать со многими клиентами одновременно.


Я написал авторизацию и регистрацию для пользователей:
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import java.awt.*;
import javax.swing.*;
 
import java.io.*;
import java.util.*;
 
 
public class main {
    
    public static void main(String args[]) throws IOException {
        
        LoginPanel message = new LoginPanel();
        JRegestration message1 = new JRegestration();
        String LoginOfCheck = "";
        String PasswordOfCheck = "";
        FileWriter writer;
        File fileLogin;
        File filePassword;
        char a = 'a';
        do{
            
        int windowAutorization = JOptionPane.showOptionDialog(null, message, "Авторизация", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, null, new Object[] {"Вход", "Регистрация"}, "Вход");
            
            if (windowAutorization == JOptionPane.NO_OPTION){
                int windowRegestration = JOptionPane.showOptionDialog(null, message1, "Регистрация", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, null, new Object[] {"               Сохранить              ", "              Отмена              "},"Сохранить");
                
                if(windowRegestration == JOptionPane.YES_OPTION){
                    
                    try{
                        
                        String.format(" %s %s", message1.getName(), message1.getPassword());
                        fileLogin = new File("/home/apelsin1/workspace/cursovoy2/LoginOf" + message1.getName() + ".txt");
                        if(!fileLogin.exists()){
                            fileLogin.createNewFile();
                        }
                        System.out.println(message1.getName());
                         writer = new FileWriter(fileLogin,true);
                         writer.write("\n" + message1.getName());
                         writer.close();
                         filePassword = new File ("/home/apelsin1/workspace/cursovoy2/Password" + message1.getName() + ".txt");
                         if(!filePassword.exists()){
                                filePassword.createNewFile();
                            }
                         writer = new FileWriter(filePassword,true);
                         writer.write("\n" + message1.getPassword());
                         writer.close();
                        
                    }catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                    
                }
                
            }
            else{
            String.format("%s %s", message.getLogin(), message.getPassword());
 
            try{
                fileLogin = new File("/home/apelsin1/workspace/cursovoy2/LoginOf" + message.getLogin() + ".txt");
                filePassword = new File ("/home/apelsin1/workspace/cursovoy2/Password" + message.getLogin() + ".txt");
                LoginOfCheck = message.getLogin();
                if(!fileLogin.exists()){
                    a = 'n';
                    JOptionPane.showMessageDialog(null,
                            " Неправильно введен логин или пароль!" +
                    "\n Перезапустите приложение и повторите ввод!",
                            "Ошибка авторизации",
                            JOptionPane.ERROR_MESSAGE);
                    break;
                }
                Scanner text = new Scanner(filePassword);
                while(text.hasNextLine()){
                    PasswordOfCheck = text.nextLine();
                    if(PasswordOfCheck.intern() == message.getPassword().intern())
                        break;
                }
                    if(PasswordOfCheck.intern() != message.getPassword().intern()){
                        JOptionPane.showMessageDialog(null,
                                " Неправильно введен логин или пароль!" +
                        "\n Перезапустите приложение и повторите ввод!",
                                "Ошибка авторизации",
                                JOptionPane.ERROR_MESSAGE);
                    }
                
            }catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            
            }
        }while(LoginOfCheck.intern() != message.getLogin().intern() && PasswordOfCheck != message.getPassword());
        
        //System.out.println(LoginOfCheck);
        System.out.println(message.getLogin() + "123");
    }
    
    
    private static class LoginPanel extends JPanel {
         
        public JTextField login;
        private JPasswordField password;
 
        public LoginPanel() {
            GridBagLayout l = new GridBagLayout();
            l.columnWeights = new double[] {.4, 1};
            setLayout(l);
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 30;
            gbc.anchor = GridBagConstraints.WEST;
            add(new JLabel("Логин:"), gbc);
            gbc.gridy = 1;
            add(new JLabel("Пароль:"), gbc);
 
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.fill = GridBagConstraints.BOTH;
            login = new JTextField();
            add(login, gbc);
 
            password = new JPasswordField();
            gbc.gridy = 1;
            add(password, gbc);
            
        }
 
        public String getLogin() {
            return login.getText();
        }
        public String getPassword() {
            return new String(password.getPassword());
        }
    }
    
    public static class JRegestration extends JPanel{
        
        private JTextField name;
        private JPasswordField password;
 
        
        public JRegestration() {
            GridBagLayout g = new GridBagLayout();
            g.columnWeights = new double[] {.6, 1};
            setLayout(g);
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 70;
            gbc.anchor = GridBagConstraints.WEST;
            add(new JLabel("Имя:"), gbc);
            gbc.gridy = 3;
            add(new JLabel("Пароль:"), gbc);
            //gbc.gridy = 4;
            
            
 
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.fill = GridBagConstraints.BOTH;
            name = new JTextField();
            add(name, gbc);  
            
            password = new JPasswordField();
            gbc.gridy = 3;
            add(password, gbc);
 
             
        }
        
        public String getName(){
            return name.getText();
        }
 
        public String getPassword() {
            return new String(password.getPassword());
        }
    }
    
}
Я больше чем уверен, что делается это все намного проще... Но как есть ) Будут замечания, буду рад послушать, только с замечанием предложите альтернативу...
Нужен совет, следующего содержания... После авторизации, я подключаюсь к серверу, все действия происходят на сервере, так? Как мне туда запилить базу данных? И главное, написал я к примеру граф. интерфейс самого аукциона, как сделать так, чтоб после авторизации, клиент сразу попадал в этот граф. интерфейс?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.01.2014, 10:56
Ответы с готовыми решениями:

ASUS M2N-E + Атлон 5000+ 64 X2 + ASUS Geforce 8600 GT. Это должно нормально работать???

Как работать с LPCWSTR? Как перевести char в это? И что это вообще такое?
Как работать с LPCWSTR? Как перевести char в это? И что это вообще такое?

Сокеты. Как правильно написать сервер?
Поясните, плиз, как правильно написать сервер для работы с несколькими клиентами через сокеты (с++, линукс) ?

23
11 / 11 / 0
Регистрация: 04.11.2012
Сообщений: 127
29.01.2014, 16:30  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от _Den_ Посмотреть сообщение
while (true) {
* * * * * * * * System.out.println("Waiting for a client...");
* * * * * * * * Socket socket = ss.accept(); // заставляем сервер ждать подключений и выводим сообщение когда кто-то связался с сервером
* * * * * * * * System.out.println("Got a client " + ++i);
* * * * * * * * System.out.println();
* * * * * * }
Код понятен и удобен, но тут возникают проблемы с клиентами... Мне нужно, чтоб клиенты что то делали, и действия этих клиентов я могу вставить либов цикл while(true){}, либо после... Но если я вставляю в цикл, то второй клиент ничего не сможет сделать, пока первый не закончил работу, а если после цикла я вставляю, то клиенты вообще ничего не могут делать, пока не зайдут все клиенты... Может у вас еще варианты реализации есть?
0
 Аватар для _Den_
161 / 157 / 29
Регистрация: 21.09.2013
Сообщений: 487
Записей в блоге: 2
29.01.2014, 16:52
Нужны потоки, сейчас посмотрю

Добавлено через 16 минут
Подходящей реализации не найду но вот, как я думаю, нужно сделать
В прошлом примере поток был один для всех main(), по этому еще кто-то не мог подключится пока кто-то работает.Наш сервер должен создавать новый поток для работы с ним
Java
1
2
3
4
5
6
while (true) {
                Socket socket = ss.accept();
                System.out.println("Connected :)");
                Thread serverThread = new Thread(new Server(socket));
                serverThread.start();
            }
Что мы имеем. Поток main() в цикле ждет нового подключения, как только клиент подключился, создаем новый и запускаем для нашего клиента. Кажется как-то так, нужно еще подумать

Добавлено через 4 минуты
У меня есть код, в котором сервер ждет данных на вход, в методе run() и обрабатываются данные от клиентов, но код не совсем подходящий
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
public class Server implements Runnable {
 
    private Socket incoming;
 
    public Server(Socket incoming) throws IOException {
        this.incoming = incoming;
    }
 
    @Override
    public void run() {
 
        try {
            try {
 
                InputStream inStream = incoming.getInputStream();
                DataInputStream in = new DataInputStream(inStream);
 
                while (true) {
                    String msg = in.readUTF();
                    System.out.println(msg);
                }
 
            } finally {
                incoming.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
}
1
11 / 11 / 0
Регистрация: 04.11.2012
Сообщений: 127
29.01.2014, 16:53  [ТС]
Цитата Сообщение от _Den_ Посмотреть сообщение
Что мы имеем. Поток main() в цикле ждет нового подключения, как только клиент подключился, создаем новый и запускаем для нашего клиента. Кажется как-то так, нужно еще подумать
Логично ) Но я постараюсь распоралелить программу средствами, которые это позволяют, ибо в дальнейшем, мне все равно предется изучить эти средства, так как в программе будут еще каверзные места )
Что касается этих самых средств распоралеливания....
Есть потоки, а есть процессы. Оба этих инструмента делают программу многопоточной. Что лучше использовать в моей задачи на ваш взгляд? И если я в чем то выше сказанном был не прав, буду рад, если вы меня поправите )
0
 Аватар для _Den_
161 / 157 / 29
Регистрация: 21.09.2013
Сообщений: 487
Записей в блоге: 2
29.01.2014, 17:01
Лучший ответ Сообщение было отмечено Apelsin199 как решение

Решение

Читайте Хорстман 2-й том, 1 и 3 глава, параллельное и сети соответственно.
Он говорит что отдельный процесс имеет свой набор данных, тогда как потоки обращаются к одним и тем же данным. У вас БД это один и тот же ресурс. Собственно я привел пример выше с многопоточной программы. При создании нового экземпляра класса Server в потоке, метод run() как бы стает отдельным для каждого нового потока
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.01.2014, 17:01

Как может сервер-сайд код работать или не работать на конкретном компе?
Всем привет! Вот такая проблема. Есть сайт, все работает ок, но - один из компов имеющий Win98 и IE6.0 and service pack 1 работает очень...

Как это выражение должно выглядеть в c++?
w=\left|cos\,x-cos\,y \right|^{\left(1+2sin^2y \right)}\left(1+z+\frac{z^2}{2}+\frac{z^3}{3}+\frac{z^4}{4} \right)\\ x=3.74\times...

Как организовать многопоточный сервер через сокеты
Ребят, как создать сервер, который работает через сокеты и принимает сообщения от нескольких клиентов и на каждое принятое от них сообщение...

Сокеты. Клиент-сервер. Как узнать MAC?
Засада!!!!! Не могу получить Mac адрес у клиент-серверного приложения на Winsock. На сервере: получил IP-адрес и доменное имя клиента....

FileStream.Open, Create как должно работать?
Скажите, если я пишу в программе код FileStream.Open или FileStream.Create - файл должен открываться автоматически во время действия...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru