一对多聊天系统
2015-08-06 21:12
369 查看
领卓教育培训第二十四天
创建服务器接收客户端消息的线程类
创建Client类
创建接收服务器消息的线程类
一对多聊天系统
在上一篇博客中,我们写了一个基于TCP的客户端和服务器的一对一双向聊天系统,但只能开一个客户端与服务器通信,我们在之前的代码做一些改动,就实现了多个客户端与服务器通信的系统,且服务器能向所有客户端发送广播!代码示例
创建服务器[code]import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class Server extends JFrame implements ActionListener { PrintWriter pw; BufferedReader br; JTextArea jta; JTextField jtf; JButton jb; JPanel jp; JScrollPane jsp; ArrayList<Socket> sockets; ServerSocket ss; public static void main(String[] args) { new Server(); } public Server() { jta = new JTextArea(); jsp = new JScrollPane(jta); jtf = new JTextField(15); jb = new JButton("发送"); jb.addActionListener(this); jp = new JPanel(); jp.add(jtf); jp.add(jb); this.add(jsp, BorderLayout.CENTER); this.add(jp, BorderLayout.SOUTH); this.setSize(300, 200); this.setTitle("服务器"); this.setVisible(true); new Thread(new Runnable() { @Override public void run() { try { ss = new ServerSocket(10000); //存放客户端连接来的Socket sockets = new ArrayList<>(); while (true) { Socket socket = ss.accept(); sockets.add(socket); jta.append("客户端已成功连接服务器\n"); Thread t = new Thread(new GetClientToServerMessage(Server.this, socket)); t.start(); } } catch (IOException e) { e.printStackTrace(); } } }).start(); } @Override public void actionPerformed(ActionEvent e) {// 发送 try { String str = jtf.getText(); for (Socket socket : sockets) { pw = new PrintWriter(socket.getOutputStream(), true); pw.println(str); pw.flush(); } jta.append("服务器广播:" + str + "\n"); jtf.setText(""); } catch (IOException e1) { e1.printStackTrace(); } } public void read(Socket socket) { try { while (true) { br = new BufferedReader(new InputStreamReader(socket.getInputStream())); jta.append(br.readLine() + "\n"); } } catch (IOException e) { e.printStackTrace(); } } }
创建服务器接收客户端消息的线程类
[code]import java.net.Socket; public class GetClientToServerMessage implements Runnable { private Server server; private Socket socket; public GetClientToServerMessage(Server server,Socket socket) { this.server = server; this.socket = socket; } @Override public void run() { server.read(socket); } }
创建Client类
[code]import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class Client extends JFrame implements ActionListener { Socket s; PrintWriter pw; BufferedReader br; JTextArea jta; JTextField jtf; JButton jb; JPanel jp; JScrollPane jsp; JOptionPane jop; String username; public static void main(String[] args) { new Client(); } public Client() { jta = new JTextArea(); jsp = new JScrollPane(jta); jtf = new JTextField(15); jb = new JButton("发送"); jb.addActionListener(this); jp = new JPanel(); jp.add(jtf); jp.add(jb); this.add(jsp, BorderLayout.CENTER); this.add(jp, BorderLayout.SOUTH); this.setSize(300, 200); username = JOptionPane.showInputDialog("请输入用户名"); this.setTitle("客户端"+username); this.setVisible(true); try { s = new Socket("127.0.0.1", 10000); jta.append("您已成功连接服务器\n"); Thread t = new Thread(new GetServerToClientMessage(Client.this)); t.start(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent e) { try { pw = new PrintWriter(s.getOutputStream(), true); String str = jtf.getText(); jta.append(username+"说:" + str + "\n"); pw.println(username+"说:"+str); pw.flush(); jtf.setText(""); } catch (IOException e1) { e1.printStackTrace(); } } public void read(){ try { while (true) { br = new BufferedReader(new InputStreamReader(s.getInputStream())); jta.append("服务器回复说:" + br.readLine()+ "\n"); } } catch (IOException e) { e.printStackTrace(); } } }
创建接收服务器消息的线程类
[code]public class GetServerToClientMessage implements Runnable { private Client client; public GetServerToClientMessage(Client client) { this.client = client; } @Override public void run() { client.read(); } }
运行结果
相关文章推荐
- jQuery版ajax的实现
- spring scope
- 2015 HUAS Summer Trainning #4~D
- hdu 1254 推箱子
- 测试用例设计白皮书--判定表驱动分析方法
- POJ 2386 水坑 w连起来的为一个水坑
- GDOI模拟8.6总结
- TCP/IP 三次握手与四次挥手详解
- Struts2实现空表单信息的提示
- HDU 5360 Hiking(线段树)
- NSInvocation
- 自信的男生最有魅力
- Nodejs学习笔记01【EventEmitter】
- map Codeforces Round #Pi (Div. 2) C. Geometric Progression
- Android 基于蓝牙的方向控制器
- 测试用例设计白皮书--因果图方法
- 树-堆结构练习——合并果子之哈夫曼树 优先队列
- C语言学习资源
- Codeforces Round #Pi (Div. 2)——set——Berland National Library
- 构造 Codeforces Round #Pi (Div. 2) B. Berland National Library