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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание клиент-сервера на java как? 
V
    Опции темы
finomen
Дата 5.3.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Надо написать клиент-серверное приложение. сервер 1, а клиентов моного. Надо чтобы сервер мог отправить в любой момент времени клиенту сообщение и клиен также. при этом если на сервере вполне пойдет бесконечный цикл
Код

ServerSocket serverSocket = null;
serverSocket = new ServerSocket(777); 
BufferedReader in=null;
Socket s;
while(1<2)
{
s=serverSocket.accept();
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
String fromServer;
while ((fromServer = in.readLine()) != null) { 
//обработка сообщения
}
 }

но в этом случае непонятно как отправить сообщения с сервера....только если делать его из нескольких приложений
а вот клиент виснуть не должен ни при каких условиях. как это грамотно реализовать?

ЗЫ может возможно обрабатывать события на сокетах? (on connect, on disconnect, on recive)?
PM MAIL   Вверх
ecologist
Дата 6.3.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вариантов несколько:

1. На клиенте сделать тред, который регулярно опрашивает сервер по поводу новых сообщений.
2. На клиенте сделать два треда - один слушает, другой опрашивает. 
3. В принципе если сетка локальная вполне можно посылать UDP, что упрощает - не надо открывать коннект каждый раз.
PM MAIL   Вверх
Sigertheit
Дата 6.3.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пример типа серверно-клиентской програмки - пинговалка через TCP..... немного лишнего(проверка что пакет пришедший в нуный порт предназначен для этой программы...то есть пришла комманда пинга)..... Для вашей ж задачи просто как и предлагалось надо слушатель повесить на отдельный поток 
и в клиенте и на сервере, чтобы небыдо висяка, и сделать отправщик сообщений, которые будут слушаться этими листнерами.

Код

public class TcpIp {
    private MainFrame main = null;
    private int port;
    private InetAddress ip = null;
    private boolean b = true;
    private ServerSocket ss = null;
    private Socket s = null;

    public TcpIp(MainFrame main, int port, InetAddress ip) {
        this.port = port;
        this.main = main;
        this.ip = ip;
    }

    public void killThread(){
        b = false;
        try {
            ss.close();
            if (s!=null){
                s.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public void listening(){
        Thread t = new Thread(new Runnable(){
            public void run() {
                try {
                    ss = new ServerSocket(port);
                    while (b) {
                        s = ss.accept();
                        Reader in = new InputStreamReader(s.getInputStream());
                        BufferedReader buff = new BufferedReader(in);
                        String message = buff.readLine();
                        if (message != "pinging"){
                            main.console.append("Found comp:" +
                                                message + "\n");
                        }else{
                            Writer out = new OutputStreamWriter(s.getOutputStream());
                            out.write(InetAddress.getLocalHost().toString());
                            out.flush();
                        }
                        s.close();
                    }
                } catch (Exception ex) {
                    if (b) ex.printStackTrace();
                }
            }
        });
        t.setPriority(Thread.NORM_PRIORITY);
        t.start();
    }

    public void tcpPing() throws IOException {
        System.out.println(ip+", "+port);
        Socket sock = new Socket(ip, port);
        System.out.println("Opening socket....");
        main.console.append("Pinging[tcp/ip] " + ip + "\n");
        String message = "pinging";
        Writer out = new OutputStreamWriter(sock.getOutputStream());
        out.write(message);
        out.flush();
        out.close();
    }
}   



через UDP

Код

public class Udp {
    private int port;
    private MainFrame main = null;
    private InetAddress ip = null;
    private DatagramSocket ds = null;
    private boolean curr = true;
    private  byte[] ggg = {111};

    public Udp(MainFrame main, int port, InetAddress ip) {
        this.port = port;
        this.main = main;
        this.ip = ip;
        try {
           ds = new DatagramSocket(this.port);
        } catch (SocketException ex) {
            ex.printStackTrace();
        }
    }

    public void killThread(){
        ds.close();
        curr = false;
    }

    public void listening(){
        Thread t = new Thread(new Runnable() {
            public void run() {
                try {
                    byte[] b = new byte[30];
                    DatagramPacket dp = new DatagramPacket(b, b.length);
                    while(curr){
                        ds.receive(dp);
                        byte[] message = dp.getData();
                        if (!Arrays.equals(ggg, message)){
                            main.console.append("Found comp: " + dp.getAddress() + "\n");
                        }else{
                            dp.setData(ggg);
                            ds.send(dp);
                        }
                    }
                } catch (IOException ex) {
                    if (curr) ex.printStackTrace();
                }
            }
        });
        t.start();
    }

    public void udpPing(){
        try {
            byte[] b = new byte[30];
            main.console.append("Pinging[udp] " + ip + "\n");
            DatagramPacket dp = new DatagramPacket(b, b.length);
            dp.setSocketAddress(new InetSocketAddress(ip,port));
            dp.setData(ggg);
            ds.send(dp);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}




Это сообщение отредактировал(а) Sigertheit - 6.3.2008, 15:27
PM MAIL   Вверх
Platon
Дата 6.3.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



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

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

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


 




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


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

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