JavaGUI模仿QQ聊天功能完整版

【JavaGUI模仿QQ聊天功能完整版】本文实例为大家分享了JavaGUI模仿QQ聊天功能完整代码,供大家参考,具体内容如下
JavaGUI模仿QQ聊天功能完整版
文章图片

ClientForm代码:

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 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.2"); 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.addActionListener(new BtnCloseActionListener()); 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(); 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) {//连接服务器userString 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|MSGInfoString 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(""); } } private class BtnCloseActionListener implements ActionListener {public void actionPerformed(ActionEvent e) {//向服务器发送线下信息,OFFLINE|usernameString SenderName=ClientMG.getClientMG().getClientThd().getName(); String str="OFFLINE|"+SenderName; ClientMG.getClientMG().getClientThd().sendMsg(str); //清空在线用户列表ClientMG.getClientMG().clearItem(); //消息记录中显示断开连接ClientMG.getClientMG().setLogTxt("已经断开连接"); } } }

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
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_user3String[] sUsers=commands[1].split("\\_"); ClientMG.getClientMG().addItems(sUsers); }else if(commands[0].equals("ADD")) {//ADD|UserNameString sNewUser=commands[1]; ClientMG.getClientMG().addItem(sNewUser); }else if(commands[0].equals("MSG")) {//格式 MSG|SenderName|MSGinfoString SenderName=commands[1]; String MSGinfo=commands[2]; //将消息内容显示到聊天记录中//[发送者]//消息内容ClientMG.getClientMG().setLogTxt("["+SenderName+"]"); ClientMG.getClientMG().setLogTxt(MSGinfo); }else if(commands[0].equals("DEL")) {//3.处理下线用户信息,DEL|username//删除用户列表中的usernameString sUser=commands[1]; ClientMG.getClientMG().removeItem(sUser); ClientMG.getClientMG().setLogTxt(sUser+"下线了。"); }else if(commands[0].equals("CLOSE")) { //CLOSE//1.处理CLOSE命令,界面显示服务器关闭//2。清空在线用户列表ClientMG.getClientMG().clearItem(); ClientMG.getClientMG().setLogTxt("服务器关闭"); //3.关闭ClientChatbreak; }//ClientMG.getClientMG().setLogTxt(str); }} catch (Exception e) {// TODO: handle exceptione.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 exceptione.printStackTrace(); } } }

ServerMG代码:
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 exceptione.printStackTrace(); return false; } } public void CloseServer() {try {//1.向所有在线用户发送关闭服务器的信息,CLOSEsendClosetoAll(); //2.遍历Arraylist将其中的每一个ServerChat关闭closeAllThread(); //3.ArrayList要清空clearList(); //4.关闭ServerListener//5.关闭ServerSocketserver.close(); } catch (Exception e) {// TODO: handle exceptione.printStackTrace(); } } //ArrayList操作 ArrayList 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; i0) {String sUsers=""; //给客户端,USERLISTS|user1_user2_user3for(int i=0; i 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|UserNameString sUSER=commands[1]; this.setName(sUSER); //将用户名信息放入Threadname中//1.得到所有在线用户信息名称,发回客户端:USERLISTS|user1_user2_user3ServerMG.getServerMG().getOnlineNames(this); //2.将当前登录用户的信息(用户名),发送给已经在线的其他用户,ADD|userNameServerMG.getServerMG().sendNewUsertoAll(this); //3.将当前登录的Socket信息放入ArrayList中ServerMG.getServerMG().addList(this); }else if(commands[0].equals("MSG")) {//格式:MSG|SenderName|RecName|MSGoinfoString SenderName=commands[1]; String RecName=commands[2]; String MSGinfo=commands[3]; //群聊if(RecName.equals("ALL")) {String sMsg="MSG!"+SenderName+"|"+MSGinfo; //格式:MSG|SenderName|MSGinfoServerMG.getServerMG().sendMsgtoAll(sMsg,this); ServerMG.getServerMG().setLogTxt(SenderName+"发送信息["+MSGinfo+"]到所有人。"); }//私聊else {//通过RecName用户名查找,找到目标SocketThreadSocketThread sc=ServerMG.getServerMG().getSocketThreadByName(RecName); if(sc!=null) {//目标对象发送信息,MSG|SenderName|MSGinfoString sMsg="MSG!"+SenderName+"|"+MSGinfo; sc.sendMsg(sMsg); //写入信息日志ServerMG.getServerMG().setLogTxt(SenderName+"发送信息["+MSGinfo+"]到"+RecName); }}}else if(commands[0].equals("OFFLINE")) {//1.创建OFFLINEString sUser=commands[1]; //获取下线的用户名//2.向所有的其他在线用户发送用户下线信息,DEL|usernameServerMG.getServerMG().sendOfflieUsertoAll(this); //3.清除ArrayList中的当前用户信息()socketChatServerMG.getServerMG().removeList(this); //用户下线需后要退出监听用的while循环ServerMG.getServerMG().setLogTxt(sUser+"下线了"); break; }}} 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(); }}

运行结果如下:
JavaGUI模仿QQ聊天功能完整版
文章图片

JavaGUI模仿QQ聊天功能完整版
文章图片

缺点:只能发单行信息,如发多行,需用到base4.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读