import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;
public class ChatServer extends JFrame{
private ObjectInputStream s_in;
private ObjectOutputStream s_out;
private JTextField s_enter;
private JTextArea s_dialog;
private int clientnum=0;
public ChatServer(){
super("服务器端聊天窗口");
Container c=getContentPane(); 
c.setLayout(new BorderLayout());
s_enter=new JTextField();
c.add(s_enter, BorderLayout.NORTH);
s_enter.setEditable(false);
s_dialog=new JTextArea();
c.add(new JScrollPane(s_dialog),BorderLayout.CENTER);
s_enter.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
String s=e.getActionCommand();
s_out.writeObject(s); 
s_out.flush();
s_dialogShow("服务器:"+s);
s_enter.setText("");
}
catch(Exception ew){
JOptionPane.showMessageDialog(null, ew.getStackTrace(), "通讯错误",JOptionPane.ERROR_MESSAGE);
}
}
});
}
public void s_dialogShow(String s){
s_dialog.setText(s+"\n");
s_dialog.setCaretPosition(s_dialog.getText().length());
s_enter.requestFocusInWindow();
}
public void s_run(){
try{
ServerSocket s=new ServerSocket(5000);
while(true){
String message;
JOptionPane.showMessageDialog(null, "通讯连接strat Server1");
Socket s1=s.accept();
clientnum++;
s_dialogShow("来自客户端"+clientnum+"的连接建立!");
s_in=new ObjectInputStream(s1.getInputStream());
s_out=new ObjectOutputStream(s1.getOutputStream());//????????????????????????????
JOptionPane.showMessageDialog(null, "通讯连接strat Server2");
//s_dialogShow("来自客户端"+clientnum+"的连接建立!");
s_out.writeObject("与服务器连接建立!");
s_enter.setEditable(true);
s_out.flush();

do{
message=(String)s_in.readObject();
s_dialogShow("客户端"+clientnum+":"+message);
}while(!isEnd(message));              
//此处为客户端请求退出连接,应让通知客户端断开     
s_out.writeObject("quit");
s_out.flush();
s_out.close();
s_in.close();
s.close();
}
}
catch(Exception e){
JOptionPane.showMessageDialog(null, "通讯出现错误server!", "连接错误",JOptionPane.ERROR_MESSAGE);
}
}
public boolean isEnd(String m){
String s[]={"结束","quit","end","q"};
for(int i=0;i<s.length;i++)
if(m.equals(s[i])) return true;
    return false;
}
public static void main(String args[]){
ChatServer ServerApp=new ChatServer();
ServerApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ServerApp.setSize(600, 400);
ServerApp.setVisible(true);
ServerApp.s_run();
}
}import java.awt.*;
import java.awt.event.*;
import javax.swing.*;import java.io.*;
import java.net.Socket;
import java.net.ServerSocket;
public class ChatClient extends JFrame{
private JTextField c_enter;
private JTextArea c_dialog;
private ObjectInputStream c_in;
private ObjectOutputStream c_out;
public ChatClient(){
super("客户端聊天窗口");
Container c=getContentPane();
c.setLayout(new BorderLayout());
c_enter=new JTextField();
    c_enter.setEditable(false);
c.add(c_enter, BorderLayout.NORTH);
c_dialog=new JTextArea();
c.add(new JScrollPane(c_dialog), BorderLayout.CENTER);
c_enter.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
String s=e.getActionCommand();
c_out.writeObject(s);
c_out.flush();
c_dialogShow("自己:"+s);
c_enter.setText("");
}
catch(Exception ew){
JOptionPane.showMessageDialog(null, ew.getStackTrace(), "通讯错误",JOptionPane.ERROR_MESSAGE);
}
}
});
}
public void c_run(){

try{

Socket s=new Socket("",5000);
String message;
JOptionPane.showMessageDialog(null, "通讯连接strat Client");
c_in=new ObjectInputStream(s.getInputStream());
c_out=new ObjectOutputStream(s.getOutputStream());
c_enter.setEditable(true);
do{
  message=(String)c_in.readObject();
  c_dialogShow("服务器:"+message);
}while(!isEnd(message));
c_out.writeObject("q");
c_out.flush();
c_in.close();
c_out.close();
s.close();
System.exit(0);
}
catch(Exception e){
JOptionPane.showMessageDialog(null, "通讯连接错误client", "通讯错误",JOptionPane.ERROR_MESSAGE);
}
}
public void c_dialogShow(String s){
c_dialog.setText(s+"\n");
c_dialog.setCaretPosition(c_dialog.getText().length());
c_enter.requestFocusInWindow();
}
public boolean isEnd(String m){
String s[]={"结束","quit","end","q"};
for(int i=0;i<s.length;i++)
if(m.equals(s[i])) return true;
    return false;
}
public static void main(String[] args){
ChatClient clientApp=new ChatClient();
clientApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
clientApp.setSize(new Dimension(600,400));
clientApp.setVisible(true);
//if(args.length==0)
clientApp.c_run( );
//else clientApp.c_run(args[0], 6000);
}
}
先运行的ChatServer  在运行的ChatClient     
结果程序停在ChatServer的 
s_in=new ObjectInputStream(s1.getInputStream());
s_out=new ObjectOutputStream(s1.getOutputStream());
这了,为什么????

解决方案 »

  1.   

    服务端这部分扔线程里                do {//不然连接第二个客户端就处理不了的
                        message = (String) s_in.readObject();
                        s_dialogShow("客户端" + clientnum + ":" + message);
                    } while (!isEnd(message));
    //此处为客户端请求退出连接,应让通知客户端断开
                    s_out.writeObject("quit");
                    s_out.flush();
                    s_out.close();
                    s_in.close();
                    s.close();
      

  2.   

    服务端
    import java.awt.*;
    import java.awt.event.*;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.swing.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.io.*;public class ChatServer extends JFrame {    private ObjectInputStream s_in;
        private ObjectOutputStream s_out;
        private JTextField s_enter;
        private JTextArea s_dialog;
        private int clientnum = 0;    public ChatServer() {
            super("服务器端聊天窗口");
            Container c = getContentPane();
            c.setLayout(new BorderLayout());
            s_enter = new JTextField();
            c.add(s_enter, BorderLayout.NORTH);
            s_enter.setEditable(false);
            s_dialog = new JTextArea();
            c.add(new JScrollPane(s_dialog), BorderLayout.CENTER);
            s_enter.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent e) {
                    try {
                        String s = e.getActionCommand();
                        s_out.writeObject(s);
                        s_out.flush();
                        s_dialogShow("服务器:" + s);
                        s_enter.setText("");
                    } catch (Exception ew) {
                        JOptionPane.showMessageDialog(null, ew.getStackTrace(), "通讯错误", JOptionPane.ERROR_MESSAGE);
                    }
                }
            });
        }    public void s_dialogShow(String s) {
            s_dialog.setText(s + "\n");
            s_dialog.setCaretPosition(s_dialog.getText().length());
            s_enter.requestFocusInWindow();
        }    public void s_run() {
            try {
                ServerSocket s = new ServerSocket(5000);
                while (true) {
                    JOptionPane.showMessageDialog(null, "通讯连接strat Server1");
                    final Socket s1 = s.accept();
                    clientnum++;
                    new Thread(new Runnable() {//////////////////////////////////                    public void run() {
                            try {
                                sss(s1);
                            } catch (IOException ex) {
                                Logger.getLogger(ChatServer.class.getName()).log(Level.SEVERE, null, ex);
                            } catch (ClassNotFoundException ex) {
                                Logger.getLogger(ChatServer.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }).start();
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "通讯出现错误server!", "连接错误", JOptionPane.ERROR_MESSAGE);
            }
        }    //////////////////////////////////////
        private void sss(Socket s1) throws IOException, ClassNotFoundException {        String message;
            s_dialogShow(s_dialog.getText() + "来自客户端" + clientnum + "的连接建立!");
            s_in = new ObjectInputStream(s1.getInputStream());
            s_out = new ObjectOutputStream(s1.getOutputStream());//????????????????????????????
            JOptionPane.showMessageDialog(null, "通讯连接strat Server2");
    //s_dialogShow("来自客户端"+clientnum+"的连接建立!");
            s_out.writeObject("与服务器连接建立!");
            s_enter.setEditable(true);
            s_out.flush();        do {
                message = (String) s_in.readObject();
                s_dialogShow("客户端" + clientnum + ":" + message);
            } while (!isEnd(message));
    //此处为客户端请求退出连接,应让通知客户端断开
            s_out.writeObject("quit");
            s_out.flush();
            s_out.close();
            s_in.close();
        }    public boolean isEnd(String m) {
            String s[] = {"结束", "quit", "end", "q"};
            for (int i = 0; i < s.length; i++) {
                if (m.equals(s[i])) {
                    return true;
                }
            }
            return false;
        }    public static void main(String args[]) {
            final ChatServer ServerApp = new ChatServer();
            ServerApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            ServerApp.setSize(600, 400);
            ServerApp.setVisible(true);
            ServerApp.s_run();
            new Thread(new Runnable() {//////////////////            public void run() {
                    ServerApp.s_run();
                }
            }).start();
        }
    }