java 仿QQ聊天代码

这是一个使用Java编写的QQ聊天程序示例,包含Client.java、ClientThread.java、Server.java和ServerThread.java四个主要文件。作者欢迎指出代码中的不合理之处并提供改进意见。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


    本源码实现了群聊和私聊

  截图如下:

代码文件清单如下:

Client.java、ClientThread.java、Server.java、ServerThread.java共四个java文件

因为本人的能力有限,如果你觉得那里有不合理的地方可以给我留言或者q我

下面是Client.java代码内容:

===================================================================================================

package cc;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Inet4Address;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;

public class Client extends JFrame implements ActionListener {
	private JPanel jp;
	private JButton connect, send, exit;
	private JTextArea ja;
	private Socket socket = null;

	public JTextArea getJa() {
		return ja;
	}

	public void setJa(JTextArea ja) {
		this.ja = ja;
	}

	private JTextField juser, jmess;
	private JScrollPane jsp;
	private JComboBox jcb;

	public JComboBox getJcb() {
		return jcb;
	}

	public void setJcb(JComboBox jcb) {
		this.jcb = jcb;
	}

	public Client() {
		try {
			UIManager
					.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		into();
		this.setBounds(100, 200, 390, 350);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}

	public void into() {
		jp = new JPanel();
		jp.setLayout(null);
		this.add(jp);
		juser = new JTextField();
		juser.setBounds(60, 15, 150, 20);
		jp.add(juser);
		connect = new JButton("Connect");
		connect.addActionListener(this);
		connect.setBounds(220, 15, 80, 20);
		jp.add(connect);
		ja = new JTextArea();
		ja.setLineWrap(true);
		ja.setSize(350, 220);
		jsp = new JScrollPane(ja, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		jsp.setBounds(20, 40, 340, 220);
		jp.add(jsp);
		// 添加用于发送信息的文本框
		jmess = new JTextField();
		jmess.setBounds(15, 275, 130, 20);
		jp.add(jmess);
		// 添加用户名称的下拉菜单
		jcb = new JComboBox();
		jcb.addItem("USERS");
		jcb.setBounds(152, 275, 80, 20);
		jp.add(jcb);
		// 添加发送按钮
		send = new JButton("发送");
		send.setBounds(235, 273, 60, 25);
		send.addActionListener(this);
		send.setEnabled(false);
		jp.add(send);
		// 添加推出按钮
		exit = new JButton("退出");
		exit.setBounds(300, 273, 60, 25);
		exit.addActionListener(this);
		exit.setEnabled(false);
		jp.add(exit);
	}

	public static void main(String[] args) {
		new Client().setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String name = e.getActionCommand();
		if (name.equals("Connect")) {
			if (juser.getText().equals("")) {
				JOptionPane jop = new JOptionPane();
				jop.showMessageDialog(this, "用户名不能为空!!");
				System.out.println("用户名为空!!");
			} else {
				try {
					// 获取ip和用户名格式 USERS:iP:user
					socket = new Socket("127.0.0.1", 8090);
					// scoket=new Socket(loclhost, 8090)
					String ip = Inet4Address.getLocalHost().getHostAddress();
					StringBuffer sr = new StringBuffer("USERS:");
					sr.append(ip).append(":").append(juser.getText().trim());
					OutputStream os = socket.getOutputStream();
					PrintWriter pw = new PrintWriter(os);
					pw.println(sr.toString());
					pw.flush();
					ClientThread ct = new ClientThread(this, socket);
					ct.start();
					send.setEnabled(true);
					exit.setEnabled(true);
					connect.setEnabled(false);
				} catch (UnknownHostException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		}
		if (name.equals("发送")) {
			System.out.println(socket.toString());
			// 群聊
			StringBuffer mess = new StringBuffer("MESS");
			System.out.println("以下是信息!");
			System.out.println(jcb.getSelectedItem().toString());
			if (jcb.getSelectedItem().toString().equals("USER")) {
				mess.append(":").append("USERS").append(":")
						.append(juser.getText().trim()).append(":")
						.append(jmess.getText().trim());
				try {
					PrintWriter pw = new PrintWriter(socket.getOutputStream());

					System.out.println(mess.toString());
					pw.println(mess.toString());
					pw.flush();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

				jmess.setText("");
			} else {
				mess.append(":").append(jcb.getSelectedItem().toString()).append(":")
						.append(juser.getText().trim()).append(":")
						.append(jmess.getText().trim());
				try {
					PrintWriter pw = new PrintWriter(socket.getOutputStream());

					System.out.println("我是私聊"+mess.toString());
					pw.println(mess.toString());
					pw.flush();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

				jmess.setText("");
			}
		}

	}

}


下面是ClientThread.java

=============================================================================================================================

package cc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class ClientThread extends Thread {
	private Client client;
	private Socket socket;
	private BufferedReader br;
	private PrintWriter pw;
	private boolean bo = true;

	public ClientThread(Client client, Socket socket) {
		this.client = client;
		this.socket = socket;
		try {
			br = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			pw = new PrintWriter(new OutputStreamWriter(socket
					.getOutputStream()));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void run() {
		while (bo) {
			try {
				String mess = br.readLine();
				String[] me = mess.split(":");
				System.out.println("把用户名传递过来"+mess);
				if (me[0].equals("USER")) {
					client.getJcb().removeAllItems();
					for (int i = 0; i < me.length; i++) {
						client.getJcb().addItem(me[i]);
					}
				}else if (me[0].equals("MESS")) {
					client.getJa().append(me[2]+":"+me[3]+"\n");
				} 
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}


下面是Server.java

===================================================================================================================================

package cc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class ClientThread extends Thread {
	private Client client;
	private Socket socket;
	private BufferedReader br;
	private PrintWriter pw;
	private boolean bo = true;

	public ClientThread(Client client, Socket socket) {
		this.client = client;
		this.socket = socket;
		try {
			br = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			pw = new PrintWriter(new OutputStreamWriter(socket
					.getOutputStream()));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void run() {
		while (bo) {
			try {
				String mess = br.readLine();
				String[] me = mess.split(":");
				System.out.println("把用户名传递过来"+mess);
				if (me[0].equals("USER")) {
					client.getJcb().removeAllItems();
					for (int i = 0; i < me.length; i++) {
						client.getJcb().addItem(me[i]);
					}
				}else if (me[0].equals("MESS")) {
					client.getJa().append(me[2]+":"+me[3]+"\n");
				} 
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}

 下面是ServerThread,java

=====================================================================================================================

package cc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerThread implements Runnable {
	private PrintWriter pw;
	private Socket socket;
	private String qqname;
	private BufferedReader br;

	public PrintWriter getPw() {
		return pw;
	}

	public void setPw(PrintWriter pw) {
		this.pw = pw;
	}

	public String getQqname() {
		return qqname;
	}

	public void setQqname(String qqname) {
		this.qqname = qqname;
	}

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	private String ip;

	public ServerThread(Socket socket) {
		this.socket = socket;
		try {
			br = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));
			pw = new PrintWriter(new OutputStreamWriter(
					socket.getOutputStream()));

			String mess = br.readLine();
			System.out.println("ServerThread"+mess);
			String[] me = mess.split(":");
			ip = me[1];
			qqname = me[2];
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		while (true) {
			try {
				System.out.println(Thread.currentThread());
				System.out.println("aaaa");
				String mess = br.readLine();
				System.out.println(mess);
				String[] s = mess.split(":");
				System.out.println("你好" + mess);
				String jishouNeme=s[1];
				System.out.println("发送名字"+s[2]+"         接受名字"+jishouNeme);
				if (s[0].equals("MESS") && s[1].equals("USERS")) {
					Server.AllUser(mess);
				}
				if(s[0].equals("MESS") && !s[1].equals("USERS")){
					System.out.println("我是私聊   server");
					Server.OnleUser(mess, getQqname(),jishouNeme);
					
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}

}



 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值