qq多人聊天室

提示:(1)Socket 多线程 登陆 多人聊天
(2)先运行ChatServer
(3) 然后运行Client,输入用户名 、密码
(4)可以进行多人聊天
(5)是基于IP+端口+多线程
登陆界面:LoginApplet
package com.ftf.applet;
import java.awt.Color;
import java.awt.Container;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.PathIterator;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
/**
* 登录界面(Friend to Friend)
* @author Administrator
*
*/
public class LoginApplet extends JFrame{
//用户名
private JTextField username;
//密码
private JPasswordField password;
//小容器
private JLabel jl1;
private JLabel jl2;
private JLabel jl3;
private JLabel jl4;
//按钮
private JButton jb;
//复选框
private JCheckBox jc1;
private JCheckBox jc2;
//列表框
private JComboBox jcb;
public JButton getJb() {
return jb;
}
public void setJb(JButton jb) {
this.jb = jb;
}
public JTextField getUsername() {
return username;
}
public void setUsername(JTextField username) {
this.username = username;
}
public JPasswordField getPassword() {
return password;
}
public void setPassword(JPasswordField password) {
this.password = password;
}
public LoginApplet() {
// 设置窗口标题
this.setTitle("FTF");
// 窗体组件初始化
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//初始化方法
init();
// 设置布局方式为绝对定位
this.setLayout(null);
this.setBounds(0, 0, 355, 265);
// 设置窗体的标题图标
Image image = new ImageIcon("d:/chat/user.png").getImage();
this.setIconImage(image);
// 窗体大小不能改变
this.setResizable(false);
// 居中显示
this.setLocationRelativeTo(null);
// 窗体可见
this.setVisible(true);
}
/**
* 初始化方法
*/
public void init(){
//创建一个容器
final Container con = this.getContentPane();
//设置背景图片
Image image1 = new ImageIcon("d:/chat/back.jpg").getImage();
jl1 = new JLabel();
jl1.setIcon(new ImageIcon(image1));
jl1.setBounds(0, 0, 355, 355);
//FTF头像登录
Image image2 = new ImageIcon("d:/chat/Twitter.png").getImage();
jl2 = new JLabel();
jl2.setIcon(new ImageIcon(image2));
jl2.setBounds(0,55,100,100);
//用户名和密码
username = new JTextField();
username.setBounds(110, 55, 150, 25);
password = new JPasswordField();
password.setBounds(110, 95, 150, 25);
jl3 = new JLabel("账号");
jl4 = new JLabel("密码");
jl3.setBounds(265, 55, 150, 25);
jl4.setBounds(265, 95, 150, 25);
//记住密码、是否隐身
jc1 = new JCheckBox("记住密码");
jc2 = new JCheckBox("是否隐身");
jc1.setBounds(110, 125,80,15);
jc2.setBounds(200, 125,80,15);
//登录标志
jb = new JButton("登 录");
jb.setBackground(Color.CYAN);
jb.setBounds(130, 170, 110, 35);
con.add(jb);
con.add(jc1);
con.add(jc2);
con.add(jl3);
con.add(jl4);
con.add(jl2);
con.add(username);
con.add(password);
con.add(jl1);
}
}
服务器:ChatServer
package com.ftf.applet;
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.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.logging.SimpleFormatter;
/**
* 1_0服务器
* @author Administrator
*
*/
public class ChatServer1_0{
//存放客户端socket
private HashSet<Socket> clients = new HashSet<Socket>();
public ChatServer1_0(){
try {
//建立服务器socket
ServerSocket server = new ServerSocket(8857);
System.out.println("服务器开启,等待用户连接…………");
while(true){//不断监听客户端
//接受客户端socket
Socket client = server.accept();
if(client!=null){
System.out.println("用户" + client.getRemoteSocketAddress()
+ "连接上来啦");
}
//保存客户端socket
clients.add(client);
//开启一个线程接受该客户信息
new ServerThread(client, clients).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
new ChatServer1_0();
}
}
//服务器线程类
class ServerThread extends Thread{
private Socket client ;
private HashSet<Socket> clients ;
//format
private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public ServerThread(Socket client, HashSet<Socket> clients) {
this.client = client;
this.clients = clients;
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
while(true){
//自动阻塞
sendMessage(reader.readLine());
}
}catch (IOException e) {
// TODO: handle exception
System.out.println(client.getInetAddress().getHostAddress()
+ "断开连接啦");
}
}
//给每个客户发送一条信息
private void sendMessage(String str) {
// TODO Auto-generated method stub
//不对本身发信息
Iterator<Socket> it = clients.iterator();
while(it.hasNext()){
Socket everySocket = (Socket)it.next();
if(everySocket.hashCode()==this.client.hashCode()) continue;
try{
PrintWriter out = new PrintWriter(everySocket.getOutputStream());
out.println(str);
out.flush();
}catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
聊天室:Client
package com.ftf.applet;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Image;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.Border;
import sun.nio.cs.US_ASCII;
/**
* 客户端Client
* @author Administrator
*
*/
public class ChatClient1_0 extends JFrame {
//登录名
private static String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
private JTextArea jt1;
private JTextArea jt2;
private JButton jb1;
private JButton jb2;
private JLabel jl1;
private JLabel jl2;
private SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
private static Socket server;
static{
try {
server = new Socket("192.168.10.161",8857);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
System.err.println("服务器断开,请先启动服务器!");
System.exit(0);
} catch (IOException e) {
// TODO Auto-generated catch block
System.err.println("服务器断开,请先启动服务器!");
System.exit(0);
}
}
public ChatClient1_0(String user){
// 设置窗口标题
this.setTitle("("+user+")");
// 窗体组件初始化
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//初始化方法
init();
// 设置布局方式为绝对定位
this.setLayout(null);
this.setBounds(0, 0, 505, 505);
// 设置窗体的标题图标
Image image = new ImageIcon("d:/chat/user.png").getImage();
this.setIconImage(image);
// 窗体大小不能改变
this.setResizable(false);
// 居中显示
this.setLocationRelativeTo(null);
// 窗体可见
this.setVisible(true);
//获取焦点,在frame显示之后使用
jt2.requestFocus();
}
private void init() {
// TODO Auto-generated method stub
Container con = this.getContentPane();
JPanel j1 = new JPanel();
JPanel j2 = new JPanel();
JPanel j3 = new JPanel();
JPanel j4 = new JPanel();
JPanel j5 = new JPanel();
j1.setBounds(0, 0, 340, 330);
j1.setBorder(BorderFactory.createLineBorder(Color.CYAN, 2));
j2.setBounds(0,330, 340, 330);
j2.setBorder(BorderFactory.createLineBorder(Color.CYAN, 2));
j3.setBounds(340,0, 340, 330);
j3.setBorder(BorderFactory.createLineBorder(Color.CYAN, 2));
j4.setBounds(340,330, 340, 330);
j4.setBorder(BorderFactory.createLineBorder(Color.CYAN, 2));
//输入框
jt1 = new JTextArea();
jt1.setLineWrap(true);
jt1.setEditable(false);
jt1.setBackground(Color.CYAN);
JScrollPane jsp1= new JScrollPane(jt1);
jsp1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
jsp1.setBounds(0,0,338,327);
jt1.setFocusable(true);
//发送框
jt2 = new JTextArea();
jt2.setBounds(0,332,338,110);
JScrollPane jsp2= new JScrollPane(jt2);
jsp2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
jsp2.setBounds(0,332,338,110);
con.add(jsp1);
con.add(jsp2);
//发送、关闭按钮
jb1 = new JButton("关闭");
jb2 = new JButton("发送");
jb1.setBackground(Color.CYAN);
jb2.setBackground(Color.CYAN);
jb1.setBounds(133,443,95,30);
jb2.setBounds(243,443,95,30);
//双击清屏事件
jt1.addMouseListener(new MouseAdapter() {
int count =0;
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
count = e.getClickCount();
if(count==2){
jt1.setText("");
}
}
});
con.add(jb1);
con.add(jb2);
con.add(j1);
con.add(j2);
con.add(j3);
con.add(j4);
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
jt2.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_ENTER&&e.isControlDown()){
jb2.doClick();
}
}
});
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String content=jt2.getText();
if(content.trim()!=null&&!content.trim().equals("")){
String name=username+" "+"("+format.format(new Date())+")";
if(jt1.getText().trim().equals("")){
jt1.append(name+":"+content+"\n");
}else{
jt1.append("\n"+name+":"+content+"\n");
}
jt2.setText("");
//将内容发送到服务器
sendMessage(name+":"+content+"\n");
}
}
private void sendMessage(String str) {
// TODO Auto-generated method stub
try{
PrintWriter out = new PrintWriter(server.getOutputStream());
out.append(str);
out.println();
out.flush();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
//获取信息
getMessage();
}
private void getMessage() {
// TODO Auto-generated method stub
new ClientThread().start();
}
//客户端线程
class ClientThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
String answer = "";
int count = 0;
while((answer=reader.readLine())!=null){
jt1.append(answer);
}
} catch(Exception e) {
// TODO Auto-generated catch block
System.err.println("服务器断开,请先启动服务器");
System.exit(0);
}
}
}
}
public static void main(String[] args) {
final LoginApplet login = new LoginApplet();
login.getJb().addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(!login.getUsername().getText().trim().equals("")
&&!login.getPassword().getText().trim().equals("")){
login.setVisible(false);
ChatClient1_0 client = new ChatClient1_0(login.getUsername().getText());
client.setUsername(login.getUsername().getText());
}
}
});
}
}

浙公网安备 33010602011771号