11 / 11 / 0
Регистрация: 04.11.2012
Сообщений: 127

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

29.01.2014, 10:56. Показов 3085. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru