Java实现聊天机器人完善版

作者:KillerCodes 时间:2022-10-07 09:31:11 

本文实例为大家分享了Java实现聊天机器人完善版的具体代码,供大家参考,具体内容如下

Java实现聊天机器人完善版

Client代码:


package GUISocket.chat.Client;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.EventQueue;

import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTextField;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.EmptyBorder;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class ClientForm extends JFrame {

private JPanel contentPane;
DefaultListModel<String> itemUsers;
private JTextField textIP;
private JTextField textPort;
public JTextField textUser;
public JTextArea textLog;
public JList listUser;
public JTextArea textSend ;
public static void main(String[] args) {
 EventQueue.invokeLater(new Runnable() {
  public void run() {
   try {
    ClientForm frame = new ClientForm();
    frame.setVisible(true);
    ClientMG.getClientMG().setClientForm(frame);
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 });
}
public ClientForm() {
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 setBounds(100, 100, 589, 607);
 contentPane = new JPanel();
 contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
 setContentPane(contentPane);
 contentPane.setLayout(null);

JLabel label = new JLabel("配置信息");
 label.setBounds(10, 10, 54, 15);
 contentPane.add(label);

JLabel lblIp = new JLabel("IP");
 lblIp.setBounds(10, 35, 27, 15);
 contentPane.add(lblIp);

textIP = new JTextField();
 textIP.setText("192.168.1.6");
 textIP.setBounds(33, 35, 92, 21);
 contentPane.add(textIP);
 textIP.setColumns(10);

JLabel label_1 = new JLabel("端口");
 label_1.setBounds(137, 35, 38, 15);
 contentPane.add(label_1);

textPort = new JTextField();
 textPort.setText("8900");
 textPort.setBounds(168, 32, 66, 21);
 contentPane.add(textPort);
 textPort.setColumns(10);

JLabel label_2 = new JLabel("用户名");
 label_2.setBounds(255, 38, 54, 15);
 contentPane.add(label_2);

textUser = new JTextField();
 textUser.setBounds(302, 35, 66, 21);
 contentPane.add(textUser);
 textUser.setColumns(10);

JButton LOGIN = new JButton("登录");
 LOGIN.setBounds(395, 34, 66, 23);
 contentPane.add(LOGIN);

JButton btnClose = new JButton("关闭");
 btnClose.setBounds(480, 31, 71, 23);
 contentPane.add(btnClose);

JPanel panel = new JPanel();
 panel.setBounds(0, 10, 573, 61);
 contentPane.add(panel);
 panel.setLayout(null);

JPanel panel_1 = new JPanel();
 panel_1.setBounds(0, 81, 573, 369);
 contentPane.add(panel_1);
 panel_1.setLayout(null);

JLabel label_3 = new JLabel("聊天记录");
 label_3.setBounds(10, 10, 54, 15);
 panel_1.add(label_3);

JScrollPane scrollPane = new JScrollPane();
 scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
 scrollPane.setBounds(20, 35, 323, 324);
 panel_1.add(scrollPane);

textLog = new JTextArea();
 textLog.setWrapStyleWord(true);
 textLog.setLineWrap(true);
 scrollPane.setViewportView(textLog);

JLabel label_4 = new JLabel("在线用户");
 label_4.setBounds(351, 10, 54, 15);
 panel_1.add(label_4);

JScrollPane scrollPane_1 = new JScrollPane();
 scrollPane_1.setBounds(353, 35, 210, 324);
 panel_1.add(scrollPane_1);

this.itemUsers=new DefaultListModel<String>();
 this.listUser=new JList(itemUsers);
 scrollPane_1.setViewportView(this.listUser);

JPanel panel_2 = new JPanel();
 panel_2.setBounds(10, 449, 553, 119);
 contentPane.add(panel_2);
 panel_2.setLayout(null);

JLabel label_5 = new JLabel("操作");
 label_5.setBounds(10, 10, 54, 15);
 panel_2.add(label_5);

JScrollPane scrollPane_2 = new JScrollPane();
 scrollPane_2.setBounds(10, 22, 533, 64);
 panel_2.add(scrollPane_2);

textSend = new JTextArea();
 textSend.setWrapStyleWord(true);
 textSend.setLineWrap(true);
 scrollPane_2.setViewportView(textSend);

JButton button_1 = new JButton("群发");
 button_1.addActionListener(new Button_1ActionListener());
 button_1.setBounds(307, 86, 93, 23);
 panel_2.add(button_1);

JButton sendMG = new JButton("发送");
 sendMG.addActionListener(new SendMGActionListener());
 sendMG.setBounds(432, 86, 93, 23);
 panel_2.add(sendMG);

LOGIN.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
   //连接服务器user
   String IP=textIP.getText().trim();
   int port=Integer.parseInt(textPort.getText().trim());
   String user=textUser.getText().trim();

if(ClientMG.getClientMG().Connect(IP,port,user)) {
    ClientMG.getClientMG().setLogTxt("已经连接到服务器");

}
   else {
    ClientMG.getClientMG().setLogTxt("连接服务器失败");
   }
  }
 });
}
private class SendMGActionListener implements ActionListener {
 public void actionPerformed(ActionEvent e) {

//发送信息
  //1.获取选择的用户名称
  //2.发送给服务器端含有接收用户信息的交互协议串
  String SenderName=ClientMG.getClientMG().getClientThd().getName();
  String RecName=listUser.getSelectedValue().toString();
  String MSGinfo=textSend.getText().trim();

String sMsg="MSG|"+SenderName+"|"+RecName+"|"+MSGinfo;
  ClientMG.getClientMG().getClientThd().sendMsg(sMsg);
  //将消息内容显示到聊天记录中
  //[发送者]
  //消息内容
  //清空发送消息框
  ClientMG.getClientMG().setLogTxt("[我]:");
  ClientMG.getClientMG().setLogTxt(MSGinfo);

textSend.setText("");
 }
}
private class Button_1ActionListener implements ActionListener {
 public void actionPerformed(ActionEvent e) {
  //群发信息
  //1.获取选择的用户名称
  //2.发送给服务器端含有接收用户信息的交互协议串
  //发送到服务器,MSG|SenderName|RecName|MSGInfo
  String SenderName=ClientMG.getClientMG().getClientThd().getName();
  String RecName="ALL";
  String MSGinfo=textSend.getText().trim();

String sMsg="MSG|"+SenderName+"|"+RecName+"|"+MSGinfo;
  ClientMG.getClientMG().getClientThd().sendMsg(sMsg);
  //将消息内容显示到聊天记录中
  //[发送者]
  //消息内容
  //清空发送消息框
  ClientMG.getClientMG().setLogTxt("[我]:");
  ClientMG.getClientMG().setLogTxt(MSGinfo);

textSend.setText("");
 }
}

}

ClientMG代码:


package GUISocket.chat.Client;

import java.net.Socket;

public class ClientMG {
private static final ClientMG clientmg=new ClientMG();
private ClientMG() {}
public static ClientMG getClientMG() {
 return clientmg;
}

private ClientForm clientWin;
public void setClientForm(ClientForm c) {
 clientWin=c;
}

public void setLogTxt(String str) {
 clientWin.textLog.append(str+"\r\n");  
}

public void addItem(String user) {

clientWin.itemUsers.addElement(user);
}

public void addItems(String[] users) {
 for(int i=0;i<users.length;i++) {
  clientWin.itemUsers.addElement(users[i]);
 }

}

SocketThread sthd;
public boolean Connect(String IP,int port,String user) {
 Socket socket=null;
 try {
  socket=new Socket(IP,port);
  sthd=new SocketThread(socket, user);
  sthd.start();
  return true;
 } catch (Exception e) {
  // TODO: handle exception
  e.printStackTrace();
  return false;
 }
}

public SocketThread getClientThd() {
 return sthd;
}
}

SocketThread代码:


package GUISocket.chat.Client;

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

public class SocketThread extends Thread{
BufferedReader br=null;
PrintWriter pw=null;
Socket socket=null;

public SocketThread(Socket socket,String user){
 super(user);//登录时用的用户名
 this.socket=socket;
}

public void run() {
 try {
  br=new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
  pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8")));
  String sLOGIN="LOGIN|"+this.getName();
  sendMsg(sLOGIN);

String str="";
  while((str=br.readLine())!=null) {
   String[] commands=str.split("\\|");
   if(commands[0].equals("USERLISTS")) {//USERLISTS|user1_user2_user3
    String[] sUsers=commands[1].split("\\_");
    ClientMG.getClientMG().addItems(sUsers);
   }
   else if(commands[0].equals("ADD")) {//ADD|UserName
    String sNewUser=commands[1];
    ClientMG.getClientMG().addItem(sNewUser);
   }
   else if(commands[0].equals("MSG")) {//格式 MSG|SenderName|MSGinfo
    String SenderName=commands[1];
    String MSGinfo=commands[2];
    //将消息内容显示到聊天记录中
    //[发送者]
    //消息内容
    ClientMG.getClientMG().setLogTxt("["+SenderName+"]");
    ClientMG.getClientMG().setLogTxt(MSGinfo);
   }
   //ClientMG.getClientMG().setLogTxt(str);

}
 } catch (Exception e) {
  // TODO: handle exception
  e.printStackTrace();
 }finally {
  try {
   if(pw!=null)
    pw.close();
   if(br!=null)
    br.close();
   if(socket!=null)
    socket.close();
  } catch (Exception e2) {
   // TODO: handle exception
  }
 }
}
public void sendMsg(String str) {
 pw.println(str);
 pw.flush();
}
}

ServerForm代码:


package GUISocket.chat.Server;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.EventQueue;

import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.EmptyBorder;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class ServerForm extends JFrame {
/**
 *
 */

private JPanel contentPane;
public JTextArea textLog;
private JTextField textPort;
public static void main(String[] args) {
 EventQueue.invokeLater(new Runnable() {
  public void run() {
   try {
    ServerForm frame = new ServerForm();
    frame.setVisible(true);
    ServerMG.getServerMG().setServerForm(frame);
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 });
}

public ServerForm() {
 setTitle("多人聊天服务器");
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 setBounds(100, 100, 510, 566);
 contentPane = new JPanel();
 contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
 setContentPane(contentPane);
 contentPane.setLayout(null);

JLabel lblNewLabel = new JLabel("配置信息");
 lblNewLabel.setBounds(20, 10, 54, 15);
 contentPane.add(lblNewLabel);

JLabel label = new JLabel("端口:");
 label.setBounds(30, 34, 39, 15);
 contentPane.add(label);

textPort = new JTextField();
 textPort.setText("8900");
 textPort.setBounds(65, 31, 66, 21);
 contentPane.add(textPort);
 textPort.setColumns(10);

JButton btnStart = new JButton("开启服务");
 btnStart.addActionListener(new BtnStartActionListener());
 btnStart.setBounds(180, 30, 93, 23);
 contentPane.add(btnStart);

JButton btnClose = new JButton("关闭服务");
 btnClose.addActionListener(new BtnCloseActionListener());
 btnClose.setBounds(325, 30, 93, 23);
 contentPane.add(btnClose);

JPanel panel = new JPanel();
 panel.setBounds(10, 10, 474, 54);
 contentPane.add(panel);
 panel.setLayout(null);

JLabel label_1 = new JLabel("消息记录");
 label_1.setBounds(10, 94, 54, 15);
 contentPane.add(label_1);

JPanel panel_1 = new JPanel();
 panel_1.setBounds(0, 81, 474, 436);
 contentPane.add(panel_1);
 panel_1.setLayout(null);

JScrollPane scrollPane = new JScrollPane();
 scrollPane.setBounds(10, 41, 464, 368);
 panel_1.add(scrollPane);
 scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

textLog = new JTextArea();
 textLog.setLineWrap(true);
 textLog.setWrapStyleWord(true);
 scrollPane.setViewportView(textLog);

}
private class BtnCloseActionListener implements ActionListener {
 public void actionPerformed(ActionEvent e) {

}
}
private class BtnStartActionListener implements ActionListener {
 public void actionPerformed(ActionEvent e) {
  //开启服务

int port=Integer.parseInt(textPort.getText().trim());

if(ServerMG.getServerMG().CreateServer(port)) {

ServerMG.getServerMG().setLogTxt("服务器开启...");
  }
  else {
   ServerMG.getServerMG().setLogTxt("服务器开启失败...");
  }
 }
}
}

ServerListener代码:


package GUISocket.chat.Server;

import java.net.ServerSocket;
import java.net.Socket;

public class ServerListener extends Thread{
Socket socket=null;
ServerSocket server=null;
public ServerListener(ServerSocket server) {
 this.server=server;
}
public void run() {
 try {
  while(true) {
   socket=server.accept();
   ServerMG.getServerMG().setLogTxt("客户端: "+socket);  
   new SocketThread(socket).start();
  }

} catch (Exception e) {
  // TODO: handle exception
  e.printStackTrace();
 }
}

}

SeverMG代码:


package GUISocket.chat.Server;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

import javax.swing.JTextArea;

public class ServerMG {
private static final ServerMG servermg=new ServerMG();
private ServerMG() {}
public static ServerMG getServerMG() {
 return servermg;

}

//主界面的操作
private ServerForm serverWin;

//将窗体对象注册到管理类当中
public void setServerForm(ServerForm s) {
 serverWin=s;
}
//设置主界面
public void setLogTxt(String str) {
 serverWin.textLog.append(str+"\r\n");
}

private ServerSocket server;
public boolean CreateServer(int port) {
 try {  
  server=new ServerSocket(port);
  new ServerListener(server).start();
  return true;
 } catch (Exception e) {
  // TODO: handle exception
  e.printStackTrace();
  return false;
 }
}

//ArrayList操作
ArrayList<SocketThread> a1OnlineList=new ArrayList<>();//存放所有和
public synchronized void addList(SocketThread sc) {
 //限制重名
 a1OnlineList.add(sc);
}

public void clearList() {
 a1OnlineList.clear();
}

public synchronized void removeList(SocketThread sc) {
 for(int i=0;i<a1OnlineList.size();i++) {
  SocketThread s=a1OnlineList.get(i);
  if(s.equals(sc)) {
   a1OnlineList.remove(sc);
   break;
  }
 }
}

//信息的管理
public void getOnlineNames(SocketThread sc) {
 //非第1次登录时,得到所有的在线用户
 if(a1OnlineList.size()>0) {
  String sUsers="";//给客户端,USERLISTS|user1_user2_user3
  for(int i=0;i<a1OnlineList.size();i++) {
   SocketThread s=a1OnlineList.get(i);
   sUsers+=s.getName()+"_";
  }
  sc.sendMsg("USERLISTS|"+sUsers);
 }

}
public void sendNewUsertoAll(SocketThread sc) {
 for(int i=0;i<a1OnlineList.size();i++) {
  SocketThread s=a1OnlineList.get(i);
  s.sendMsg("ADD|"+sc.getName());
 }
}
//通过Mame用户名查找目标
public SocketThread getSocketThreadByName(String sName) {
 for(int i=0;i<a1OnlineList.size();i++) {
  SocketThread s=a1OnlineList.get(i);
  if(s.getName().equals(sName)) {
   return s;
  }
 }
 return null;
}

//发送给所有人,但是要排除自身
public void sendMsgtoAll(String sMsg,SocketThread sc) {
 for(int i=0;i<a1OnlineList.size();i++) {
  SocketThread s=a1OnlineList.get(i);
  if(!s.equals(sc)) {
   s.sendMsg(sMsg);
  }
 }
}

}

SocketThread代码:


package GUISocket.chat.Server;

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

public class SocketThread extends Thread{
BufferedReader br=null;
PrintWriter pw=null;
Socket socket=null;
public SocketThread(Socket socket) {
 this.socket = socket;
}

public void run() {
 try {
  br=new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
  pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8")));
  String str="";
  while((str=br.readLine())!=null) {//循环响应客户的发送信息//接受客户端发过来的信息
   String [] commands=str.split("\\|");

if(commands[0].equals("LOGIN")) {//解析登录请求,格式,LOGIN|UserName
    String sUSER=commands[1];
    this.setName(sUSER);//将用户名信息放入Threadname中
    //1.得到所有在线用户信息名称,发回客户端:USERLISTS|user1_user2_user3
    ServerMG.getServerMG().getOnlineNames(this);
    //2.将当前登录用户的信息(用户名),发送给已经在线的其他用户,ADD|userName

ServerMG.getServerMG().sendNewUsertoAll(this);
    //3.将当前登录的Socket信息放入ArrayList中
    ServerMG.getServerMG().addList(this);

}
   else if(commands[0].equals("MSG")) {//格式:MSG|SenderName|RecName|MSGoinfo
    String SenderName=commands[1];
    String RecName=commands[2];
    String MSGinfo=commands[3];
    //群聊
    if(RecName.equals("ALL")) {
     String sMsg="MSG!"+SenderName+"|"+MSGinfo;//格式:MSG|SenderName|MSGinfo
     ServerMG.getServerMG().sendMsgtoAll(sMsg,this);
     ServerMG.getServerMG().setLogTxt(SenderName+"发送信息["+MSGinfo+"]到所有人。");
    }
    //私聊
     else {
      //通过RecName用户名查找,找到目标SocketThread
      SocketThread sc=ServerMG.getServerMG().getSocketThreadByName(RecName);
      if(sc!=null) {
       //目标对象发送信息,MSG|SenderName|MSGinfo
       String sMsg="MSG!"+SenderName+"|"+MSGinfo;
       sc.sendMsg(sMsg);

//写入信息日志
       ServerMG.getServerMG().setLogTxt(SenderName+"发送信息["+MSGinfo+"]到"+RecName);
     }

}
   }

}
 } catch (Exception e) {
  e.printStackTrace();
 }finally {
  try {
   if(pw!=null)
    pw.close();
   if(br!=null)
    br.close();
   if(socket!=null)
    socket.close();
  } catch (Exception e2) {
   // TODO: handle exception
  }
 }
}
public void closeChat() {
 try {
  if(pw!=null)
   pw.close();
  if(br!=null)
   br.close();
  if(socket!=null)
   socket.close();
 } catch (Exception e) {
  e.printStackTrace();
 }
}
public void sendMsg(String str) {
 pw.println(str);
 pw.flush();
}
}

实现结果如下:

Java实现聊天机器人完善版

Java实现聊天机器人完善版

来源:https://blog.csdn.net/aaassslll147/article/details/106213988

标签:java,聊天,机器人
0
投稿

猜你喜欢

  • 基于SpringBoot核心原理(自动配置、事件驱动、Condition)

    2023-08-23 01:46:31
  • springboot读取文件,打成jar包后访问不到的解决

    2023-07-14 13:56:35
  • 详解Swagger接口文档和常用注解的使用

    2023-11-24 15:35:21
  • 解析spring事务管理@Transactional为什么要添加rollbackFor=Exception.class

    2021-09-03 17:07:41
  • 如何利用Jackson序列化忽略指定类型的属性详解

    2023-11-16 09:01:27
  • java 定时器线程池(ScheduledThreadPoolExecutor)的实现

    2023-03-31 20:52:10
  • Mybatis与Jpa的区别和性能对比总结

    2022-09-17 16:08:45
  • java实现多线程的两种方式继承Thread类和实现Runnable接口的方法

    2022-07-24 04:27:18
  • 使用AOP的@Around后无返回值的解决

    2023-11-24 13:04:09
  • Java之Rsync并发迁移数据并校验详解

    2023-07-17 23:01:22
  • Redis集群原理详细分析

    2021-08-06 07:34:00
  • JAVA字符串占位符使用方法实例

    2021-09-20 17:30:27
  • Java Map接口及其实现类原理解析

    2022-06-04 22:54:29
  • Java中finally和return的关系实例解析

    2023-05-31 04:21:31
  • Spring AOP源码深入分析

    2023-08-15 13:01:16
  • springboot+chatgpt+chatUI Pro开发智能聊天工具的实践

    2023-10-30 05:38:03
  • IntelliJ IDEA2019实现Web项目创建示例

    2023-06-05 00:29:33
  • SpringBoot返回Json对象报错(返回对象为空{})

    2022-06-30 03:31:19
  • Spring Security认证机制源码层探究

    2022-07-27 19:05:26
  • idea无法切换分支报错问题及解决

    2023-12-14 22:39:26
  • asp之家 软件编程 m.aspxhome.com