java ChatServer с графическим интерфейсом - PullRequest
3 голосов
/ 24 августа 2011

Я пытаюсь реализовать чат-сервер с использованием компонентов графического интерфейса.Я реализовал 3 части (сервер, клиент и компоненты GUI).

Ниже приведены несколько проблем, с которыми я столкнулся -

  • Я не могу обернуть код кодом GUI.
  • При общении с клиентами он работает только тогда, когда всевведите только одну строку и нажмите ввод.

Код:

Первый компонент GUI:

public class ChatServer extends javax.swing.JFrame {
    String str;

    public ChatServer() {
        initComponents();      
        screen.setEditable(false);
    }

private void sendActionPerformed(java.awt.event.ActionEvent evt) {                                     
    str = enter.getText();
    enter.setText("");
    screen.append(str+"\n");

}

public static void main(String args[]) {
        new ChatServer().setVisible(true);
}

    private javax.swing.JTextPane enter;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea screen;
    private javax.swing.JButton send;

}

и выглядит так:

enter image description here

Это мой код сервера:

public class Server {
    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(23);
        System.out.println(InetAddress.getLocalHost()+" hazir");
        while(true){
            Socket s = ss.accept();
            System.out.println(s.getInetAddress().getHostName() + " baglandi");
            new ServerPart(s).start();
        }
    }

}

public class ServerPart extends Thread {
    private Socket s;
    public ServerPart(Socket s){
        this.s=s;
    }

    @Override
    public void run() {

        try {

            PrintStream ps = new PrintStream(s.getOutputStream());

            ps.println("Hello" + s.getInetAddress().getHostName());

            String gelen;

            while(true){ 

            Scanner sc = new Scanner(s.getInputStream());   

            gelen = sc.nextLine();

            if(gelen.trim().equalsIgnoreCase("bye"))
                break;


            System.out.println("Client: " + gelen);

            BufferedReader input = new BufferedReader( 
                    new InputStreamReader(System.in) );

            ps.println("Server: " + input.readLine());

            }

            s.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }
}

Код клиента:

public class Client extends Thread {
    private Socket s;
    public Client(Socket s){
        this.s=s;
    }

    @Override
    public void run() {
        try {

            PrintStream ps = new PrintStream(s.getOutputStream());

            Scanner sc = new Scanner(s.getInputStream());

            ps.println("Hello" + s.getInetAddress().getHostName());

            String gelen;

            while(true){

                BufferedReader input = new BufferedReader( 
                        new InputStreamReader(System.in) );

            gelen = sc.nextLine();

            if(gelen.trim().equalsIgnoreCase("bye"))
                break;

            System.out.println("Client: " + gelen);
            ps.println("Server: " + input.readLine());


            }

            s.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

    /**
     * @param args
     * @throws IOException 
     * @throws UnknownHostException 
     */
    public static void main(String[] args) throws UnknownHostException, IOException {

        Socket s = new Socket("192.168.1.173", 23);

        new Client(s);

    }

}

Буду признателен, если вы можете помочья товарищи.

1 Ответ

1 голос
/ 11 сентября 2011

Вы используете PrintStream класс с методом ps.readline();. Если вы разрабатываете приложение чата, то этот подход не будет работать, так как метод readline завершает поток при обнаружении новой строки или конца файла или при возврате каретки, т.е. вводе. Поэтому я предпочитаю использовать .. datainputstream и dataoutputstream -

Socket sc = new Socket("address",port);
DataOutputStream daos;
DataInputStream dis;
dis = new DataInputStream(sc.getInputStream());
daos= new DataOutputStream(sc.getOutputStream());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...