java简易聊天室
2017-02-03 18:55
344 查看
server端
client端
package com.One; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; import java.io.IOException; import java.net.BindException; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.util.ArrayList; import java.util.List; public class ChatServer { boolean started = false; ServerSocket ss = null; List<Client> clients = new ArrayList<Client>(); public static void main(String[] args) throws IOException { new ChatServer().start(); } public void start() { try { ss = new ServerSocket(8240); } catch (BindException e) { System.out.println("端口使用中,请关掉相关资源并重新启动服务器"); } catch (IOException e) { e.printStackTrace(); } try { started = true; while (started) { boolean bConnected = false; Socket s = ss.accept(); Client c = new Client(s); new Thread(c).start(); clients.add(c); } } catch (IOException e) { System.out.println("Client closed"); } finally { try { ss.close(); } catch (IOException e1) { e1.printStackTrace(); } } } class Client implements Runnable { private Socket s; private DataInputStream dis = null; private DataOutputStream dos = null; private boolean bConnected = false; public Client(Socket s) { this.s = s; try { dos = new DataOutputStream(s.getOutputStream()); dis = new DataInputStream(s.getInputStream()); bConnected = true; } catch (IOException e) { e.printStackTrace(); } } public void send(String str){ //一开始这里有错误的,已经修正,不写try catch因为解决不了 try{ dos.writeUTF(str); }catch(IOException e){ clients.remove(this); System.out.println("对方退出了!我从List里面去掉了"); } } @Override public void run() { try { while (bConnected) { String str = dis.readUTF(); System.out.println(str); for (int i = 0; i < clients.size(); i++) { Client c = clients.get(i); c.send(str); } } }catch(SocketException e){ System.out.println("a client quit!"); }catch (EOFException e) { System.out.println("退出了,bye"); } catch (IOException e) { e.printStackTrace(); } finally { try { if (dis != null) dis.close(); if (dos != null) dos.close(); if (s != null) s.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
client端
package com.One; import java.awt.BorderLayout; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; import java.io.IOException; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; import javax.swing.JFrame; public class ChatClient extends JFrame { /** * */ private static final long serialVersionUID = 1255082554537179096L; TextField tfTxt = new TextField(); TextArea taContent = new TextArea(); Socket s = null; DataOutputStream dos; DataInputStream dis; private boolean f = false; Thread rRecv = new Thread(new RecvThread()); public static void main(String[] args) { new ChatClient().launchFrame(); } public void launchFrame() { setLocation(400, 300); this.setSize(300, 300); add(tfTxt, BorderLayout.SOUTH); add(taContent, BorderLayout.NORTH); pack(); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent arg0) { disconnect(); System.exit(0); } }); tfTxt.addActionListener(new TFListener()); setVisible(true); connect(); rRecv.start(); } public void disconnect() { try { dos.close(); dis.close(); s.close(); } catch (IOException e) { e.printStackTrace(); } /* * try { f = false; rRecv.join();// 等着线程执行完,由于前面f置false,就保证了不会错了 // * 如果join错了呢?听麻烦的 // join方法 有一个阻塞式方法,不容易停止的 //对付阻塞方法,等待它500ms,然后停止这个方法可以写一下 } catch * (InterruptedException e) { e.printStackTrace(); } finally { try { * dos.close(); dis.close(); s.close(); } catch (IOException e) { * e.printStackTrace(); } } */ } public void connect() { try { s = new Socket("127.0.0.1", 8240); dos = new DataOutputStream(s.getOutputStream()); dis = new DataInputStream(s.getInputStream()); System.out.println("Connected"); f = true; } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private class TFListener implements ActionListener { @Override public void actionPerformed(ActionEvent arg0) { String str = tfTxt.getText().trim(); // taContent.setText(str); tfTxt.setText(""); try { dos.writeUTF(str); dos.flush(); } catch (IOException e1) { e1.printStackTrace(); } } } private class RecvThread implements Runnable { @Override public void run() { try { while (f) { String s = dis.readUTF(); // readUTF会阻塞 taContent.setText(taContent.getText() + s); System.out.println(s); } } catch (SocketException e) { System.out.println("退出了,bye!"); } catch(EOFException e){ System.out.println("退出了,Bye"); }catch (IOException e) { e.printStackTrace(); } } } }
相关文章推荐
- Java 简易C/S结构多线程聊天室 (阻塞式)
- Java基于socket实现简易聊天室实例
- Java简易聊天室
- 基于订阅/发布模式的简易聊天室实现(java+redis)
- 多线程Java简易聊天室
- Java、WebSocket、HTML简易聊天室
- Java简易聊天室程序socket
- java scoket (UDP通信模型)简易聊天室
- java简易多用户聊天室
- 基于 Java 和 jQuery 的简易聊天室
- JAVA--简易聊天室程序
- 【转】JXL: Java Excel API简易教程
- 简易Java框架开源论坛系统0.5.0版本发布
- PHP百行代码快速构建简易聊天室
- 简单的java聊天室
- JAVA聊天室(绝对没有bug!)
- .Net Remoting 实现简易的"命令行控制台"聊天室
- PHP百行代码快速构建简易聊天室
- JAVA编写的简易记事本
- 用JAVA的applet程序做出简易魔兽密保卡