Java-TCP/IP编程-03 消息群发功能
2016-09-02 00:50
351 查看
Client端
package com.qf.demo10;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListModel;
public class Client {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends JFrame implements ActionListener, Runnable {
String name, toName;// 接收消息的用户
String[] users;// JList显示的用户列表
Socket socket;
JPanel jpLogin, jpChat, jpInfo;
// login
JLabel jlName;
JTextField jtfName;
JButton jbLogin;
// chat
JScrollPane jsp, jspUsers;// 带滚动条的面板
JTextArea jtaMessage;
JTextField jtfInfo;
JButton jbSend;
JList userList;
ListModel model;
public MyFrame() {
try {
socket = new Socket("localhost", 6666);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 构造对象的时候 启动子线程
new Thread(this).start();
// login,登录面板
jpLogin = new JPanel();
jpLogin.setLayout(null);
jlName = new JLabel("请输入用户名");
jlName.setFont(new Font(Font.DIALOG, Font.BOLD, 20));
jlName.setForeground(Color.red);
jlName.setBounds(60, 50, 200, 30);
jtfName = new JTextField(20);
jtfName.setBounds(60, 100, 200, 30);
jbLogin = new JButton("登录");
jbLogin.setBounds(300, 100, 70, 30);
jbLogin.addActionListener(this);
jpLogin.add(jlName);
jpLogin.add(jtfName);
jpLogin.add(jbLogin);
// chat,聊天面板
jpChat = new JPanel();
jpChat.setLayout(new BorderLayout());// 设置为边框布局
jtaMessage = new JTextArea();
// 滚动条
jsp = new JScrollPane(jtaMessage);
jtfInfo = new JTextField(20);
jbSend = new JButton("发送");
jbSend.addActionListener(this);
jpInfo = new JPanel();
jpInfo.add(jtfInfo);
jpInfo.add(jbSend);
// 用户列表
userList = new JList();
// jspUsers = new JScrollPane(userList);
jpChat.add(userList, "West");
jpChat.add(jsp, BorderLayout.CENTER);
jpChat.add(jpInfo, "South");
// 窗口添加面板
this.add(jpLogin);
// 设置窗口属性
this.setTitle("聊天客户端");
this.setVisible(true);
this.setBounds(100, 100, 400, 300);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
}
// 按钮单击事件
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
if (e.getSource() == jbLogin) {
name = jtfName.getText();
if ("".equals(name)) {
JOptionPane.showMessageDialog(this, "用户名不能为空!");
} else {
jpLogin.setVisible(false);
this.add(jpChat);
this.setTitle(name + " 的客户端");
// 将用户名发送到服务器
bw.write("#" + name);
bw.newLine();
bw.flush();
}
} else if (e.getSource() == jbSend) {
// 获得输入的信息,发送到服务器端
// @zhangsan:nihao
if (toName != null) {
String info = jtfInfo.getText();
jtfInfo.setText("");
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String date = sdf.format(new Date());
bw.write("@" + toName + ":" + name + " " + date + " : "
+ info);
bw.newLine();
bw.flush();
} else {
JOptionPane.showMessageDialog(this, "请选择用户!");
}
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
// 接收服务器转发的消息,显示到文本域上
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
while (true) {
String info = br.readLine();
if (info.startsWith("user:")) {
users = info.substring(info.indexOf(':') + 1).split(" ");
// 设置用户列表,并添加事件监听
userList.setListData(users);
model = userList.getModel();
userList.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int index = userList.locationToIndex(e.getPoint());
toName = model.getElementAt(index).toString();
}
});
} else {
jtaMessage.append(info + "\n");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Server端
package com.qf.demo10;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(6666);
Map<String, Socket> map = new HashMap<String, Socket>();
while (true) {
Socket s = ss.accept();
new Thread(new ServerThread(s, map)).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class ServerThread implements Runnable {
private Socket socket;
private Map<String, Socket> map;
public ServerThread(Socket socket, Map<String, Socket> map) {
super();
this.socket = socket;
this.map = map;
}
@Override
public void run() {
// TODO Auto-generated method stub
// 接收客户端发来的消息
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
while (true) {
String sClient = br.readLine();
if (sClient.startsWith("#")) {// 用户注册
// #zhangsan
String name = sClient.substring(1);
map.put(name, socket);
// 遍历集合,把所有连接的客户端的用户名组织字符串,群发给所有客户端
StringBuffer sb = new StringBuffer("user:");
Iterator<String> it = map.keySet().iterator();
while (it.hasNext()) {
sb.append(it.next() + " ");
}
Collection<Socket> col = map.values();
for (Socket s : col) {
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(s.getOutputStream()));
bw.write(sb.toString());
bw.newLine();
bw.flush();
}
} else if (sClient.startsWith("@")) {// 聊天
// @zhangsan:nihao
int index = sClient.indexOf(':');
String name = sClient.substring(1, index);
String info = sClient.substring(index + 1);
// 从Map集合中根据用户名找到Socket,发送消息
Socket s = map.get(name);
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(s.getOutputStream()));
bw.write(info);
bw.newLine();
bw.flush();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.qf.demo10;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListModel;
public class Client {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends JFrame implements ActionListener, Runnable {
String name, toName;// 接收消息的用户
String[] users;// JList显示的用户列表
Socket socket;
JPanel jpLogin, jpChat, jpInfo;
// login
JLabel jlName;
JTextField jtfName;
JButton jbLogin;
// chat
JScrollPane jsp, jspUsers;// 带滚动条的面板
JTextArea jtaMessage;
JTextField jtfInfo;
JButton jbSend;
JList userList;
ListModel model;
public MyFrame() {
try {
socket = new Socket("localhost", 6666);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 构造对象的时候 启动子线程
new Thread(this).start();
// login,登录面板
jpLogin = new JPanel();
jpLogin.setLayout(null);
jlName = new JLabel("请输入用户名");
jlName.setFont(new Font(Font.DIALOG, Font.BOLD, 20));
jlName.setForeground(Color.red);
jlName.setBounds(60, 50, 200, 30);
jtfName = new JTextField(20);
jtfName.setBounds(60, 100, 200, 30);
jbLogin = new JButton("登录");
jbLogin.setBounds(300, 100, 70, 30);
jbLogin.addActionListener(this);
jpLogin.add(jlName);
jpLogin.add(jtfName);
jpLogin.add(jbLogin);
// chat,聊天面板
jpChat = new JPanel();
jpChat.setLayout(new BorderLayout());// 设置为边框布局
jtaMessage = new JTextArea();
// 滚动条
jsp = new JScrollPane(jtaMessage);
jtfInfo = new JTextField(20);
jbSend = new JButton("发送");
jbSend.addActionListener(this);
jpInfo = new JPanel();
jpInfo.add(jtfInfo);
jpInfo.add(jbSend);
// 用户列表
userList = new JList();
// jspUsers = new JScrollPane(userList);
jpChat.add(userList, "West");
jpChat.add(jsp, BorderLayout.CENTER);
jpChat.add(jpInfo, "South");
// 窗口添加面板
this.add(jpLogin);
// 设置窗口属性
this.setTitle("聊天客户端");
this.setVisible(true);
this.setBounds(100, 100, 400, 300);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
}
// 按钮单击事件
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
if (e.getSource() == jbLogin) {
name = jtfName.getText();
if ("".equals(name)) {
JOptionPane.showMessageDialog(this, "用户名不能为空!");
} else {
jpLogin.setVisible(false);
this.add(jpChat);
this.setTitle(name + " 的客户端");
// 将用户名发送到服务器
bw.write("#" + name);
bw.newLine();
bw.flush();
}
} else if (e.getSource() == jbSend) {
// 获得输入的信息,发送到服务器端
// @zhangsan:nihao
if (toName != null) {
String info = jtfInfo.getText();
jtfInfo.setText("");
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String date = sdf.format(new Date());
bw.write("@" + toName + ":" + name + " " + date + " : "
+ info);
bw.newLine();
bw.flush();
} else {
JOptionPane.showMessageDialog(this, "请选择用户!");
}
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
// 接收服务器转发的消息,显示到文本域上
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
while (true) {
String info = br.readLine();
if (info.startsWith("user:")) {
users = info.substring(info.indexOf(':') + 1).split(" ");
// 设置用户列表,并添加事件监听
userList.setListData(users);
model = userList.getModel();
userList.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int index = userList.locationToIndex(e.getPoint());
toName = model.getElementAt(index).toString();
}
});
} else {
jtaMessage.append(info + "\n");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Server端
package com.qf.demo10;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(6666);
Map<String, Socket> map = new HashMap<String, Socket>();
while (true) {
Socket s = ss.accept();
new Thread(new ServerThread(s, map)).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class ServerThread implements Runnable {
private Socket socket;
private Map<String, Socket> map;
public ServerThread(Socket socket, Map<String, Socket> map) {
super();
this.socket = socket;
this.map = map;
}
@Override
public void run() {
// TODO Auto-generated method stub
// 接收客户端发来的消息
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
while (true) {
String sClient = br.readLine();
if (sClient.startsWith("#")) {// 用户注册
// #zhangsan
String name = sClient.substring(1);
map.put(name, socket);
// 遍历集合,把所有连接的客户端的用户名组织字符串,群发给所有客户端
StringBuffer sb = new StringBuffer("user:");
Iterator<String> it = map.keySet().iterator();
while (it.hasNext()) {
sb.append(it.next() + " ");
}
Collection<Socket> col = map.values();
for (Socket s : col) {
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(s.getOutputStream()));
bw.write(sb.toString());
bw.newLine();
bw.flush();
}
} else if (sClient.startsWith("@")) {// 聊天
// @zhangsan:nihao
int index = sClient.indexOf(':');
String name = sClient.substring(1, index);
String info = sClient.substring(index + 1);
// 从Map集合中根据用户名找到Socket,发送消息
Socket s = map.get(name);
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(s.getOutputStream()));
bw.write(info);
bw.newLine();
bw.flush();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
相关文章推荐
- java TCP编程简单实现一个消息群发功能
- Java-TCP/IP编程-04 带窗口的群聊天功能
- Java-TCP/IP 编程-01 主线程:从控制台录入消息,发送到服务器 子线程:接收服务器转发来的消息
- java网络编程自学(三)-TCP/IP+NIO
- 【Java TCP/IP Socket】应用程序协议中消息的成帧与解析(含代码)
- java TCP/IP实现简单的多人聊天功能
- java网络编程之TCP/IP ——SocketServer与Socket
- 【Java TCP/IP Socket】Socket编程知识点总结
- DAY21--java中的网络编程TCP/IP常用知识点总结
- [原]《Java TCP/IP Socket 编程 》读书笔记之十二:各章节要点
- Java学习之网路编程--TCP/IP
- 【Java TCP/IP Socket】应用程序协议中消息的成帧与解析(含代码)
- 赵雅智_java网络编程(4)TCP/IP、Http和Socket的区别
- JAVA TCP/IP 同步传递消息 初步 学习
- Java TCP/IP Socket 编程 笔记(三)—UDP的例子
- java分布式开发TCP/IP NIO无阻塞 Socket((基于消息方式实现系统间的通信) )(转)
- [原]《Java TCP/IP Socket 编程 》读书笔记之十一:深入剖析socket——TCP套接字的生命周期
- java网络编程基础夯实03-为什么不能直接通过IP访问网站
- 19. JAVA 网络编程 Part 1 (IP与InetAddress类、URL与URLConnection类、URLEncoder与URLDecoder类、TCP&UDP)---- 学习笔记
- 【Java TCP/IP Socket】Socket编程大合集