2014-10-26 2 views
0

Я попытался сделать небольшую чат-программу, но она действительно не хочет работать. Мой сервер и клиент в основном одинаковы: они создают новый сокет и новый чат (GUI). Может кто-нибудь помочь мне найти ошибку, которую я сделал?Java ServerSocket/Socket Chat Program

код сервера:

import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 

import java.net.Socket; 
import java.net.ServerSocket; 

public class Server { 
    private  Chat   ch  = null; 
    private  ServerSocket server = null; 
    private  Socket   s  = null; 
    private  BufferedReader in  = null; 
    private  BufferedWriter out  = null; 

    public Server() { 
     try { 
      server = new ServerSocket(1792); 
      s = server.accept(); 
      in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
      out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 
      ch = new Chat("Server", out); 
     } catch (IOException ioe) { 

     } 

     new Thread(new Runnable() { 
      public void run() { 
       while (true) { 
        try { 
         String line = in.readLine(); 
         ch.showString(line); 
        } catch (IOException e) { 
         System.exit(0);  // exit program when connection is lost 
         return; 
        } 
       } 
      } 
     }).start(); 
    } 
} 

Client Код:

import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 

import java.net.Socket; 

public class Client { 
    private  Chat   ch  = null; 
    private  Socket   s  = null; 
    private  BufferedReader in  = null; 
    private  BufferedWriter out  = null; 

    public Client() { 
     try { 
      s = new Socket("localHost", 1792); 
      in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
      out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 
      ch = new Chat("Client", out); 
     } catch (IOException ioe) { 

     } 

     new Thread(new Runnable() { 
      public void run() { 
       while (true) { 
        try { 
         String line = in.readLine(); 
         ch.showString(line); 
        } catch (IOException e) { 
         System.exit(0);  // exit program when connection is lost 
         return; 
        } 
       } 
      } 
     }).start(); 
    } 
} 

Чат (GUI) Код:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Insets; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.JLabel; 

import java.io.BufferedWriter; 
import java.io.IOException; 

public class Chat implements ActionListener { 
    protected JFrame   fr; 
    private  JPanel   p; 
    private  JTextField  tf; 
    private  JButton   b; 
    private  int    lines = 20; 
    private  JLabel[]  l  = new JLabel[lines]; 
    private  String   title = ""; 
    private  BufferedWriter out; 

    public Chat(String name, BufferedWriter bw) { 
     title = name; 
     out = bw; 

     fr = new JFrame(title); 
     fr.setLayout(new BorderLayout()); 
     fr.setDefaultCloseOperation(fr.EXIT_ON_CLOSE); 
     fr.setSize(400, 475); 
     fr.setLocationRelativeTo(null); 
     fr.setResizable(false); 
     fr.setVisible(true); 

     Insets in = fr.getInsets(); 
     int width = fr.getWidth() - in.left - in.right; 
     int height = fr.getHeight() - in.top - in.bottom; 

     p = new JPanel(); 
     p.setLayout(null); 
     p.setBackground(Color.WHITE); 
     fr.add(p, BorderLayout.CENTER); 

     tf = new JTextField(); 
     tf.setHorizontalAlignment(tf.LEFT); 
     tf.addActionListener(this); 
     tf.setBounds(0, 400, 300, height-400); 
     p.add(tf); 

     b = new JButton("Send"); 
     b.setBounds(300, 400, width-300, height-400); 
     b.addActionListener(this); 
     p.add(b); 

     p.validate(); 
     fr.validate(); 

     p.repaint(); 
     fr.repaint(); 

     for(int i=0;i<lines;i++) { 
      l[i] = new JLabel(""); 
      l[i].setHorizontalAlignment(l[i].LEFT); 
      l[i].setBounds(0, 400*i/lines, 500, 400/lines); 
      p.add(l[i]); 
     } 
    } 

    public void showString(String text) { 
     if (text.equals("")) return; 
     for(int i=0;i<lines-1;i++) { 
      l[i].setText(l[i+1].getText()); 
     } 
     l[lines-1].setText(text); 
    } 

    public void actionPerformed(ActionEvent ae) { 
     String text = tf.getText(); 
     try { 
      showString(text); 
      out.write(text); 
      out.flush(); 
      tf.setText(""); 
     } catch (IOException ioe) { 

     } 
    } 
} 
+0

Можете ли вы указать, что не работает? – CuriousMind

+0

Программа останавливается на методе in.readLine(), и я понятия не имею, почему. – Checker

+0

Сначала вы должны понять код и затем вставить его здесь с правильным объяснением того, что работает, а что нет. – SMA

ответ

1

Функция ReadLine() ожидает конца строки. В своем чат-классе вы никогда не даете ему конец строки при записи в выходной поток. И поэтому сервер и клиент ожидают in.readLine() для символа конца строки, чтобы завершить чтение одной строки. Вам нужно передать символ конца строки после каждой строки, которую вы пишете в выходной поток. Только промывки его не хватит.

Поэтому просто отредактируйте эту часть в своем Chat класс.

Старый код

 out.write(text); 
     out.flush(); 

Новый код

 out.write(text); 
     out.write('\n'); 
     out.flush(); 

Rest весь код работает абсолютно нормально. Удачи!