Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> предача данных через Socket, предача данных через Socket 
V
    Опции темы
hagerds
Дата 1.1.2012, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.12.2011

Репутация: нет
Всего: нет



есть некое окно программы. в этом окне две клавиши 
logButton - выполняет роль проверки логина в БД на сервере
regButton - выполняет роль вставки данных в БД на сервере

При передаче данных на сервер
"log" 
или 
"192.168.0.1
log
123"

Как правильно будет передать данные через один порт сокета,  с разными методами обработки событий клавиш logButton,regButton?

т.е. по порту 8190 передаём "log" вызывается "метод проверки логина в БД"
или передаём "192.168.0.1 log 123" вызывается "метод вставки данных в БД"

Можно передать метку вместе с данными. и через if в классе отделять их между собой.

PS. я использую многопоточность для подключения нескольких клиентов.

Клиент:
Код

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class test extends JFrame{

    public static void main(String[] args) {
        new test();
    }
    
    public test()
    {
     super("Регистрация");
     
     addWindowListener(new WindowAdapter(){
         public void windowClosing(WindowEvent e) { 
                System.exit(0); 
            } 
     });
     setSize(300,200);
     setLocationRelativeTo(null);
     
     Container contentPane = getContentPane();
     
     //add TextArea
     
     final JTextArea out =new JTextArea();
     
     mainPanel=new JPanel();
     mainPanel.setLayout(new GridLayout(0,2));
     contentPane.add(mainPanel, BorderLayout.NORTH);
     
     final JFormattedTextField server=new JFormattedTextField("192.168.0.1");
     addLabelEdit("Адрес Сервера :",server);
     
     final JFormattedTextField login=new JFormattedTextField("log");
     addLabelEdit("Логин :",login);
     
     final JFormattedTextField password=new JFormattedTextField("123");
     addLabelEdit("Пароль :",password);
     
     //add buttonPanel
     
     JPanel buttonPanel=new JPanel();
     
     addButton(buttonPanel,"Регистрация",new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                // отправка данных на сервер логина пароля и т.д.
                Object value = server.getValue();
                Object value1 = login.getValue();
                Object value2 = password.getValue();
                out.setText(value.toString()+"\n"+value1.toString()+"\n"+value2.toString());
            }});
     addButton(buttonPanel,"Проверить логин",new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                //отправка логина на сервер, для проверки на совместимость его в базе
                Object value = login.getValue();
                out.setText(value.toString());
            }});
     
     contentPane.add(out,BorderLayout.CENTER);
     contentPane.add(buttonPanel,BorderLayout.SOUTH);
     
     show(); 
    }
    
    public void addButton(Container c, String title,ActionListener listener)
    {
     JButton button=new JButton(title);
     button.addActionListener(listener);
     c.add(button);
    }
    
    public void addLabelEdit(final String labelText,final JFormattedTextField field)
    {
     mainPanel.add(new JLabel(labelText));
     mainPanel.add(field);
    }
    
    private JPanel mainPanel;
}



Сервер:
Код

import java.io.*;
import java.net.*;
import java.util.*;

public class test2 {

    public static void main(String[] args) {
        try
        {
            int i=1;
            ServerSocket s=new ServerSocket(8190);
            while(true)
            {
             Socket client=s.accept();
             System.out.println("User:"+i);
             Thread t=new ConnectionOfClient(client,i);
             t.start();
             i++;
            }    
        }
        catch(IOException e){e.printStackTrace();}
    }

}

// соединение с i-м клиентом 
class ConnectionOfClient extends Thread
{
    public ConnectionOfClient(Socket s,int i)
    {
        client=s; counter=i;
    }
    
    public void run()
    {
        try
        {
            
            InputStream inStream=client.getInputStream();
            OutputStream outStream=client.getOutputStream();
            
            Scanner in=new Scanner(inStream);
            PrintWriter out=new PrintWriter(outStream,true);
            
//             if(меткаLOG){проверки логина в БД}
//             else if (меткаREG){вставки данных в БД}
            
            client.close();
        }
        catch(IOException e)
        {e.printStackTrace();}
    }
    
    private Socket client;
    private int counter;
}

PM MAIL   Вверх
rang3r
Дата 7.1.2012, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 2.4.2009

Репутация: нет
Всего: нет



Если передавать метку , то получается паттерн Command, кстати для удобства попробуй создать класс Envelope в котором храни имя комманды, сам запрос, и результат, а для передачи объектов ObjectInputStream и ObjectOutputStream.
 Или второй вариант можешь использовать  Java Reflection API, т.е. будешь передвавать имя метода и параметры которые должен вызывать сервер. Или можешь посмотреть на proxy классы, тоже из области рефлексии
PM MAIL Skype   Вверх
hagerds
  Дата 10.2.2012, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.12.2011

Репутация: нет
Всего: нет



передача:
Код

Socket client;

Scanner in=new Scanner(client.getInputStream());
PrintWriter out=new PrintWriter(client.getOutputStream(),true);

out.println("метка:=данные1:=данные2:=данные3");//число данных может быть любое


приём:
Код

Socket client;

Scanner in=new Scanner(client.getInputStream());
PrintWriter out=new PrintWriter(client.getOutputStream(),true);

String str=in.nextLine();
StringTokenizer ravno=new StringTokenizer(str,":=");

String mark=ravno.nextToken();//в зависимости от метки делаем разные вещи с данными (вызываются разные методы)

String data1,data2//и т.д.
data1=ravno.nextToken();
data2=ravno.nextToken();


как я делаю это не есть хорошо. передавать в одной строке потока метку с данными, разделяя их символами":=":-D smile  smile  . ща пишу чат. так с этой реализацией запутался. и код получается большой smile  

перефразирую вопрос. 

Можно ли в одном потоке передавать сразу не строку  а к примеру(метку, массив данных) - (byte b,Data[]). 
какой класс использовать? smile  smile  smile 
PM MAIL   Вверх
hagerds
Дата 16.2.2012, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.12.2011

Репутация: нет
Всего: нет



надо использовать XML или JSON.

теорию по соданию XML читал, но как использовать для передачи. для меня это загадка 
теже самое. c теорией JSON все понятно http://json.org/json-ru.html, а с реализацией проблемы smile  smile  smile 

подскажите плюсы и минусы этих двух передач. и какую лучше взять для работы со своим проектом? 
требования по передаче данных немного изменились. Передаю сообщения чата, передача данных вытащенных из базы или записываемых в неё, отдельные сообщения типа "задания" (которые не отображаются в чате, а идут на обработку в тот или иной код программы),  паредача файлов (я так понимаю это передача обьектов). 

было бы очень здорово увидить пример. передачи данных XML и JSON. ("192.168.0.1", "log", "123") smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.