ChatServer:
import java.net.*; import java.util.*; import java.io.*; public class ChatServer { DataInputStream is = null; ServerSocket ss = null; List<Client> Clients = new ArrayList<Client>(); DataOutputStream os = null; public static void main(String[] args) { new ChatServer().start(); } //开启Server,准备接受连接 public void start() { boolean started = false; try { ss = new ServerSocket(8888); started = true; int i = 0; while (started) { Socket s = ss.accept(); Client c = new Client(s); Clients.add(c); new Thread(c).start(); System.out.println("第" + ++i + "个Client connected!"); } } catch (BindException e) { System.out.println("Server is busy!"); System.out.println("请关掉程序重新启动服务器!"); System.exit(0); } catch (IOException e) { e.printStackTrace(); } } class Client implements Runnable { private boolean connect = false; private Socket s; Client(Socket s) { this.s = s; connect = true; try { is = new DataInputStream(s.getInputStream()); os = new DataOutputStream(s.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } } //发送接受到的消息到Client public void send(String str) { try { os.writeUTF(str); } catch (IOException e) { e.printStackTrace(); } } public void run() { int i = 0; try { while (connect) { String str = is.readUTF(); System.out.println(str); for (int j = 0; j < Clients.size(); j++) { Client c = Clients.get(j);//把消息发到每一个连接到服务器的Client c.send(str); // System.out.println("Nomale!"); } } } catch (Exception e) { // e.printStackTrace(); System.out.println("有" + ++i + "个Client is closed!"); } finally { try { if (ss != null) ss.close(); if (is != null) is.close(); if (os != null) os.close(); } catch (EOFException e) { System.out.println("第" + ++i + "个Client is closed!"); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } } }
ChatClientimport java.awt.*; import java.io.*; import java.awt.event.*; import java.net.*; public class ChatClient { public static void main(String[] args) { new MyChatFrame("MyChatTest"); } } //这里是new一个窗口出来,设置其参数 class MyChatFrame extends Frame { TextField Text1 = new TextField("我是输入框"); TextArea Area1 = new TextArea(""); Button But1 = new Button("发送"); Socket soc = null; DataOutputStream os = null; DataInputStream is = null; boolean bconnect = false; Thread tRecv = new Thread(new Receve()); MyChatFrame(String s) { int width, height; width = Toolkit.getDefaultToolkit().getScreenSize().width; height = Toolkit.getDefaultToolkit().getScreenSize().height; setSize(500, 500); this.setLocation((width - 500) / 2, (height - 500) / 2); setBackground(Color.white); setResizable(false); add(Text1, BorderLayout.SOUTH); add(Area1, BorderLayout.NORTH); add(But1, BorderLayout.EAST); Text1.addActionListener(new TextFieldListener()); // But1.addActionListener(new ButtonListener()); pack(); setVisible(true); //设置监听,当点击红色×时能够退出 this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { disconnect(); System.exit(0); } }); connect(); tRecv.start(); } //监听TextField,如果有动作就写东西到Server private class TextFieldListener implements ActionListener { public void actionPerformed(ActionEvent e) { String s = Text1.getText(); // Area1.setText(s); Text1.setText(""); try { os.writeUTF(s); os.flush(); // os.close(); } catch (IOException e1) { e1.printStackTrace(); } } } //以下是Button监听器 /* * private class ButtonListener implements ActionListener { public void * actionPerformed(ActionEvent e) { String s = Text1.getText(); * Area1.setText(s); Text1.setText(""); try { * * DataOutputStream os = new DataOutputStream( soc.getOutputStream()); * os.writeUTF(s); os.flush(); os.close(); * * } catch (IOException e1) { e1.printStackTrace(); } } * * } */ //连接Server public void connect() { try { soc = new Socket("127.0.0.1", 8888); os = new DataOutputStream(soc.getOutputStream()); is = new DataInputStream(soc.getInputStream()); System.out.println("Client OK"); bconnect = true; } catch (IOException e) { e.printStackTrace(); } } //起线程,接受服务器发来的消息,应该是这里有问题 private class Receve implements Runnable { public void run() { try { while (bconnect) { String str = is.readUTF(); // System.out.println(str); Area1.setText(Area1.getText() + str + '\n'); } } catch (SocketException e) { System.out.println("退出了,bye!"); } catch (IOException e) { e.printStackTrace(); } } } //断开链接 public void disconnect() { try { os.close(); soc.close(); is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }