您的位置:首页 > 理论基础 > 计算机网络

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();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: