Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Создание клиент-сервера на java как?


Автор: finomen 5.3.2008, 20:58
Надо написать клиент-серверное приложение. сервер 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)?

Автор: ecologist 6.3.2008, 11:09
Вариантов несколько:

1. На клиенте сделать тред, который регулярно опрашивает сервер по поводу новых сообщений.
2. На клиенте сделать два треда - один слушает, другой опрашивает. 
3. В принципе если сетка локальная вполне можно посылать UDP, что упрощает - не надо открывать коннект каждый раз.

Автор: Sigertheit 6.3.2008, 15:25
Пример типа серверно-клиентской програмки - пинговалка через 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();
        }

    }
}



Автор: Platon 6.3.2008, 16:01
Где-то тут недавно писал SocketReader и UDP пингер, может поможет?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)