JavaGUI模仿QQ聊天功能完整版

 更新时间:2021年7月5日 10:00  点击:1297

本文实例为大家分享了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<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.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<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("");
  }
 }
 private class BtnCloseActionListener implements ActionListener {
  public void actionPerformed(ActionEvent e) {
   //向服务器发送线下信息,OFFLINE|username
   String 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<users.length;i++) {
   clientWin.itemUsers.addElement(users[i]);
  }
 
 }
 //所有用户列表清空
 public void clearItem() {
  clientWin.itemUsers.clear();
 }
 //删除一个用户
 public void removeItem(String str) {
  clientWin.itemUsers.removeElement(str);
 }
 
 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);
    }
    else if(commands[0].equals("DEL")) {
     //3.处理下线用户信息,DEL|username
     //删除用户列表中的username
     String 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.关闭ClientChat
     break;
    }
    
    //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();
  }
 }
 
}

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 exception
   e.printStackTrace();
   return false;
  }
 }
 
 public void CloseServer() {
  try {
   
   //1.向所有在线用户发送关闭服务器的信息,CLOSE
   sendClosetoAll();
   //2.遍历Arraylist将其中的每一个ServerChat关闭
   closeAllThread();
   //3.ArrayList要清空
   clearList();
   //4.关闭ServerListener
   //5.关闭ServerSocket
   server.close();
  } catch (Exception e) {
   // TODO: handle exception
   e.printStackTrace();
  }
 }
 
 //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);
   }
  }
 }
 
 public void sendOfflieUsertoAll(SocketThread sc) {
  //向所有的其他在线用户发送用户下线信息,DE|username
  for(int i=0;i<a1OnlineList.size();i++) {
   SocketThread s=a1OnlineList.get(i);
   if(!s.equals(sc)) {
    s.sendMsg("DEL|"+sc.getName());
   }
  }
 }
 
 public void sendClosetoAll() {
  for(int i=0;i<a1OnlineList.size();i++) {
   SocketThread s=a1OnlineList.get(i);
   s.sendMsg("CLOSE");
  }
 }
 
 public void closeAllThread() {
  for(int i=0;i<a1OnlineList.size();i++) {
   SocketThread s=a1OnlineList.get(i);
   s.closeChat();
  }
 }
 
 
}

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);
      }
      
     }
    }
    
    else if(commands[0].equals("OFFLINE")) {
     //1.创建OFFLINE
     String sUser=commands[1];//获取下线的用户名
     //2.向所有的其他在线用户发送用户下线信息,DEL|username
     ServerMG.getServerMG().sendOfflieUsertoAll(this);
     //3.清除ArrayList中的当前用户信息()socketChat
     ServerMG.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();
 }
}

运行结果如下:

缺点:只能发单行信息,如发多行,需用到base4.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • 美图秀秀制作隔离区聊天背景教程

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说下制作隔离区聊天背景的教程,各位想知道具体方法的,那么下面就快来跟着小编一起看一看吧。 给各位美图秀...2016-09-14
  • jQuery开发仿QQ版音乐播放器

    这篇文章主要介绍了jQuery开发仿QQ版的音乐播放器,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-10
  • C# Socket编程实现简单的局域网聊天器的示例代码

    这篇文章主要介绍了C# Socket编程实现简单的局域网聊天器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • vue.js实现h5机器人聊天(测试版)

    这篇文章主要介绍了vue.js实现h5机器人聊天测试版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-07-16
  • js实现微信聊天界面

    这篇文章主要为大家详细介绍了js实现微信聊天界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-09
  • Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例

    这篇文章主要介绍了Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例,帮助大家更好的理解和学习vue,感兴趣的朋友可以了解下...2020-11-18
  • SpringBoot中webSocket实现即时聊天

    这篇文章主要介绍了SpringBoot中webSocket实现即时聊天,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-30
  • Vue+Websocket简单实现聊天功能

    这篇文章主要为大家详细介绍了Vue+Websocket简单实现聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-31
  • PHP实现QQ登录实例代码

    分享一段利用PHP实现QQ登陆的代码,原理是用curl模拟发送post登录,cookie保存本地,实现真正的3GQQ登陆,对php实现qq登录相关知识感兴趣的朋友一起学习吧...2016-01-16
  • 手机上qq时提示错误id40怎么办?错误id40/id41/id42的解决方法

    我的手机是索爱W302的,网页是打得开的,但是手机QQ上不了,显示为错误ID40。请问该怎么办?下面小编就为大家介绍错误id40id41id42的解决方法,一起来看看吧...2016-07-04
  • Java实现聊天机器人

    这篇文章主要为大家详细介绍了Java简单实现聊天机器人,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-04
  • js实现微信聊天效果

    这篇文章主要为大家详细介绍了js实现微信聊天效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-09
  • 基于c#用Socket做一个局域网聊天工具

    目前基于Internet的即时聊天工具已经做的非常完美,本文介绍了基于c#用Socket做一个局域网聊天工具,有需要的朋友可以看一下。...2020-06-25
  • C#使用Socket实现局域网聊天

    这篇文章主要为大家详细介绍了C#使用Socket实现局域网聊天的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • 还记得QQ前老大哥ICQ吗,他已经20岁了

    今年 11 月 11 日是腾讯 18 岁生日,每位员工 300 股股票的激励方案让腾讯又一次站到了舞台聚光灯下。大家都知道腾讯帝国崛起于 QQ,但 QQ 其实并不是一款原创产品,而是参考的当年明星产品 ICQ。耐人寻味的是,20 年沧海桑田,抄袭者腾讯在深圳建起地标性建筑腾讯大厦,市值数万亿成为全球首屈一指的互联网公司,相比之下,曾经光芒万丈的 ICQ 逐渐被多数人所淡忘,今天也悄悄渡过了他 20 岁的生日。...2016-11-22
  • socket多人聊天程序C语言版(二)

    这篇文章主要为大家详细介绍了socket多人聊天程序C语言版第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一...2020-04-25
  • asp.net网站实现接入QQ登录示例代码

    相信大家在做开发的时候,常会遇到集成QQ登录的功能,本文主要说的是利用asp.net代码的实现方式,逻辑部分主要还是根据帮助文档来的。不懂的同学可以先看看文档。下面来一起学习学习。...2021-09-22
  • Python之qq自动发消息的示例代码

    这篇文章主要介绍了Python之qq自动发消息的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-18
  • C语言实现四窗口聊天

    这篇文章主要为大家详细介绍了C语言实现四窗口聊天,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-06-14
  • C++实现聊天小程序

    这篇文章主要为大家详细介绍了C++实现聊天小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-01