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


Автор: invis87 14.1.2010, 15:42
Всем здрасьте !
Читая про сети решил написать свой чат (консольный). Возник вопрос как разрешить отсутствие информации о длине сообщения. Вот как я его решил (привожу весь код, так как его сооовсем мало):
Код

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

class Recieve implements Runnable{
    Thread t;
    private int port;
    Recieve(int port){
        this.port = port;
        t = new Thread(this);
        t.start();
    }
    public void run() {
         try{
            DatagramSocket ds = new DatagramSocket(port);
             PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out, "Cp866"), true);
            while(true){
                DatagramPacket pak = new DatagramPacket(new byte[16],16);
                ds.receive(pak);            <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                int size = Integer.parseInt(new String(pak.getData()).trim());
                DatagramPacket pack = new DatagramPacket(new byte[size],size);
                ds.receive(pack);           <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                pw.println(new String(pack.getData()));
            }
        }catch(Exception e){
            System.err.println(e);
        }
    }
}

public class Sender {
    private String host;
    private int port;
    Sender(String host, int port){
        this.host = host;
        this.port = port;
    }
    private void sendMessage(String mes){
        try{
            byte[] data = mes.getBytes();
            InetAddress addr = InetAddress.getByName(host);
            DatagramPacket pack = new DatagramPacket(data, data.length, addr, port);
            DatagramSocket ds = new DatagramSocket();
            ds.send(pack);
            ds.close();
        }catch(IOException e){
            System.err.println(e);
        }
    }
    public static void main(String[] args){
        String message;
        try{
            new Recieve(Integer.parseInt(args[1]));
        }catch(IndexOutOfBoundsException IOOBE){}
        try{
            Sender sndr = new Sender (args[0], Integer.parseInt(args[1]));
            BufferedReader br = new BufferedReader(
                new InputStreamReader(System.in,"Cp866"));
            while(true){
                message=br.readLine();
                sndr.sendMessage(Integer.toString(message.length())); <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                if (message.equals("quit") || message.equals("Quit") || message.equals("QUIT")) {br.close(); System.exit(0);}
                sndr.sendMessage(message);}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        }catch(IndexOutOfBoundsException IOOBE){
            System.err.println("First argument should be \"host\" and the second \"port\"");
        }catch(Exception e){
            System.err.println(e);
        }
    }
}

Может есть люди кому не лень ознакомиться и сообщить о явных ошибках ?? Ну или советы как что-нибудь можно сделать грамотнее. Заранее спасибо !

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