自学风雨路(代码学习,附上运行截图)《简易在线聊天系统》
2012-05-04 13:58
288 查看
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(); } } } } }
ChatClient
import 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(); } } }
相关文章推荐
- 自学风雨路(学习别人的代码)《俄罗斯方块》
- C++中基本数据类型字节数及取值范围,下面有实现查看代码和运行截图
- Swift学习笔记(一)搭配环境以及代码运行成功
- 软件工程--复利计算1.0,2.0---代码及运行结果截图
- ASP运行错误的函数代码学习
- STC51单片机自学经验分享 利用keil仿真测试代码的运行时间
- TensorFlow学习笔记7——Win7下Spyder运行python代码出现UnicodeEncodeError问题的解决
- 博客园 运行代码 功能 学习
- ISO学习中代码截图
- 高性能Javascript 记录代码运行时间学习笔记
- 大数据学习笔记:编写Mapreduce代码并运行
- “约瑟夫问题”实现代码加运行截图(ADT小组)
- smarty内置函数实例代码(二)与运行结果截图
- Java中实现系统托盘功能(代码全贴,附加运行截图)
- 2017/12/23Java基础学习——如何通过记事本编写代码,并通过dos界面运行Java源文件
- 算法学习第一天-搭建能运行算法第四版的代码
- [Quick-Cococs2DX] Quick-Cocos2D-X学习 (一) 下载Quick-Cocos2D-X 并成功运行示例代码 推荐
- 学习12:一份mapgen代码的运行方法
- TensorFlow 学习 - MNIST 之 SoftMax Regression 实现(完整代码,拷贝可运行)
- Java基础学习总结(72)——提升 java 代码的运行效率