java实现多人聊天系统
短信预约 -IT技能 免费直播动态提醒
本文实例为大家分享了java实现多人聊天系统的具体代码,供大家参考,具体内容如下
开发环境
Windows 7 操作系统
MyEclipse
聊天室程序结构设计
1.系统分为客户端、服务器端和连接服务器客户端三个模块。
2.客户端负责发送消息。
3.服务器端负责接收客户端发来的信息并执行相应操作处理,最后通过群发功能,使客户端将群聊的消息的显示出来。
4.连接服务器端负责连接服务器,从而进入客户端。
总体模块图
客户端代码
Client.java
package servlet;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.OutputStreamWriter;
public class Client {
Socket socket;
BufferedWriter bw;
BufferedReader br ;
public Client(String ip, int port){
try {
socket =new Socket(ip,port);
bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
}catch (UnknownHostException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
public void sendMessage(String message) {
try{
bw.write(message);
bw.newLine();
bw.flush();
}catch(IOException e){
e.printStackTrace();
}
}
public String reciveMessage() {
String message=null;
try {
message = br.readLine();
}catch(IOException e) {
e.printStackTrace();
}
return message;
}
public void close(){
try{
socket.close();
}catch(IOException e){
e.printStackTrace();
}
}}
ClientFrame.java
package servlet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class ClientFrame extends JFrame {
private JPanel contentPane;
private JLabel lblUserName;
private JTextField tfMessage;
private JButton btnSend;
private JTextArea textArea;
private String userName;
private Client client;
public ClientFrame(String ip,String userName){
this.userName = userName;
init();//添加窗体初始化内容
addListener();
client=new Client(ip,8080);
ReadMessageThread t=new ReadMessageThread();
t.start();
}
private class ReadMessageThread extends Thread{
public void run() {
while(true) {
String str=client.reciveMessage();
textArea.append(str+"\n");//添加文本内容
}
}
}
private void init(){
setTitle("客户端");
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100,100,450,300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5,5,5,5));
contentPane.setLayout(null);
setContentPane(contentPane);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(5,5,434,229);
contentPane.add(scrollPane);
textArea =new JTextArea();
scrollPane.setViewportView(textArea);
textArea .setEditable(false);
JPanel panel =new JPanel();
panel.setBounds(5,235,434,32);
contentPane.add(panel);
panel.setLayout(null);
lblUserName = new JLabel(userName);
lblUserName.setHorizontalAlignment(SwingConstants.TRAILING);
lblUserName.setBounds(2,4,55,22);
panel.add(lblUserName);
tfMessage =new JTextField();
tfMessage.setBounds(62,5,274,22);
tfMessage.setColumns(10);
panel.add(tfMessage);
btnSend =new JButton("发送");
btnSend.setBounds(336,4,93,23);
panel.add(btnSend);
tfMessage.validate();
}
private void addListener(){
btnSend.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
Date date=new Date();
SimpleDateFormat sf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
client.sendMessage(userName+""+sf.format(date)+":\n"+tfMessage.getText());
tfMessage.setText("");//清空
}
});
this.addWindowListener(new WindowAdapter(){//开启窗口监听
public void windowClosing(WindowEvent atg0) {
int op = JOptionPane.showConfirmDialog(ClientFrame.this,"确定要退出聊天室吗?","确定",JOptionPane.YES_NO_OPTION);
if(op == JOptionPane.YES_OPTION) {
client.sendMessage("%EXIT%:" + userName);
try {
Thread.sleep(200);
}catch(InterruptedException e) {
e.printStackTrace();
}
client.close();
System.exit(0);
}
}
});
}
}
LinkServerFrame.java
package servlet;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
@SuppressWarnings("serial")
public class LinkServerFrame extends JFrame {
private JPanel contentPane;//下方面板
private JLabel lblIP;
private JLabel lblUserName;
private JTextField tfIP;
private JTextField tfUserName;
private JButton btnLink;
public LinkServerFrame(){
setTitle("连接服务器");
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 390, 150);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5,5,5,5));
contentPane.setLayout(null);
setContentPane(contentPane);
lblIP =new JLabel("服务器IP地址:");
lblIP.setFont(new Font("微软雅黑",Font.PLAIN,14));
lblIP.setBounds(20,15,100,15);
contentPane.add(lblIP);
tfIP =new JTextField("127.0.0.1");
tfIP.setBounds(121,13,242,21);
contentPane.add(tfIP);
tfIP.setColumns(10);
lblUserName = new JLabel("用户名:");
lblUserName.setFont(new Font("微软雅黑",Font.PLAIN,14));
lblUserName.setBounds(60,40,60,15);
contentPane.add(lblUserName);
tfUserName =new JTextField();
tfUserName.setBounds(121,42,242,21);
contentPane.add(tfUserName);
tfUserName.setColumns(10);
btnLink =new JButton("连接服务器");
btnLink.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
do_btnlink_actionPerformed(e);
}
});
btnLink.setFont(new Font("微软雅黑",Font.PLAIN,14));
btnLink.setBounds(140,80,120,23);
contentPane.add(btnLink);//显示连接服务器窗口
}
public static void main(String[] args){
LinkServerFrame linkServerFrame = new LinkServerFrame();
linkServerFrame.setVisible(true);
}
protected void do_btnlink_actionPerformed(ActionEvent e) {
if(!tfIP.getText().equals("")&&!tfUserName.getText().equals("")) {//文本框的内容不能为空
dispose();//销毁当前窗口
ClientFrame clientFrame=new ClientFrame(tfIP.getText().trim(), tfUserName.getText().trim());
clientFrame.setVisible(true);//显示客户窗体
}
else {
JOptionPane.showMessageDialog(null,"文本框里的内容不能为空!","警告",JOptionPane.WARNING_MESSAGE);
}
}
}
服务器端代码
Server.java
package servlet;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Server {
private HashSet<Socket> allSocket;
private ServerSocket server;
public Server() {
try {
server = new ServerSocket(8080);
}catch(IOException e) {
e.printStackTrace();
}
allSocket=new HashSet<Socket>();
}
public void startServer() throws IOException{
while(true) {
Socket socket =server.accept();
System.out.println("用户已经进入聊天室");
allSocket.add(socket);
ServerThread t= new ServerThread(socket);
t.start();
}
}
private class ServerThread extends Thread{
Socket socket;
public ServerThread(Socket socket) {
this.socket=socket;
}
public void run() {
BufferedReader br=null;
try {
br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true) {
String str=br.readLine();
if(str.contains("%EXIT%")) {
String tmp=str.split(":")[1]+"用户退出聊天室";
sendMessageToALLClient(tmp);
allSocket.remove(socket);
socket.close();
return;
}
sendMessageToALLClient(str);
}
}catch(IOException e) {
e.printStackTrace();
}
}}
private void sendMessageToALLClient(String str) throws IOException {
for(Socket s: allSocket) {
try{
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bw.write(str);
bw.newLine();
bw.flush();
}catch(IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Server s = new Server();
try {
s.startServer();
}catch(IOException e){
e.printStackTrace();
}
}
}
操作步骤
1.先运行服务器端代码(server.java)建立连接,然后运行客户端(LinkServerFrame.java)输入用户名
2.登入成功之后会显示用户已经进入聊天室
3.进入多人聊天室
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341