① 濡備綍鍦↗AVA緙栧啓鐨勮亰澶╃▼搴忎腑娣誨姞琛ㄦ儏榪欎竴鍔熻兘,騫朵嬌瀹冭兘浣跨敤,闇瑕佷唬鐮
榪欎箞璺熶綘璇村惂錛屼綘鍙浠ョ敤鐗規畩鐨勫瓧絎︽潵琛ㄧずqq琛ㄦ儏錛屽湪鏄劇ず鑱婂ぉ淇℃伅鐨勬嗕腑錛屾鏌ユ湁娌℃湁瀵瑰簲鐨勫瓧絎︼紝濡傛灉鏈夛紝鍒欐彃鍏ュ瑰簲鐨勮〃鎯呭浘鐗囷紝榪欎篃鏄疩Q涓婂彂閫佽〃鎯呯殑鏂瑰紡錛屼絾QQ搴旇ユ湁涓媯嫻嬫満鍒跺惂錛屽傛灉瀵規柟娌℃湁璇ュ浘鐗囷紝鍒欎細浼犻佽繃鍘匯
② java怎樣實現qq表情
其實來發送圖片也是發送的字自符串
就是圖片的文件名
不過一般做聊天信息的發送的時候會做一些
過濾的處理
比如進行用一些符號對信息進行包裝
例如 :
<msg>hello<pic>1.gif</pic></msg>
這個只是最簡單的處理了吧,應該還有其他簡單
且有效的方法的!
③ Java關於聊天表情的問題
jfp.insertIcon(icon);
插圖時,你的游標在那裡,就從那裡開始插圖。
可以用setCaretPosition(int ) 方法來控制游標的位置。
下邊是我測試的代碼。始終在最後面插入圖片。
textPane.setCaretPosition(textPane.getText().length());
④ java如何處理emoji表情,並存入資料庫
這個很簡單呀 你把資料庫或者對應表/欄位的編碼格式從utf8改成utf8mb4就可以存儲emoji表情了,utf8對應的位元組數不夠所以會報錯,mysql8默認的就是utf8mb4,可以了解下
⑤ java Myeclips環境中編輯聊天室怎樣實現表情的發送要求具體代碼。
你的具體代碼是什麼樣的呢,我這里只介紹如何發送
File file=new File(path);//這里的path是你要發送的圖片的路徑
b = (int) file.length();//獲得圖片大小
byte[] bt=new byte[b];//初始化一個圖片大小的byte數組
RandomAccessFile raf = new RandomAccessFile(path", "r");//初始化一個讀圖片的流。path剛上面介紹了
raf.read(bt);//將圖片讀入byte數組。當然你可以將圖片的後綴及其名字也寫如byte數組中,這將是你以後便於操作
raf.close();
假如你現在獲得了這樣一個byte數組,那麼發送表情就是發送這里的byte數組,相信socket的發送流你會吧,不會了可以問我!
當然發送了你就得接收,很簡單你就是將byte數組接收過來,然後如果你將後綴及其名字寫入了byte就先將他們讀出來,然後剩下的就是圖片的內容,你用同樣的流寫入某個地方就行了,
RandomAccessFile raf1 = new RandomAccessFile(path1, "rw");//這里的path1是我打算寫到的地方,
raf1.write(bt1);//將接收到的bt1即接收到的byte數組寫入指定的地方,當然你要是顯示在那個聊天窗口,得實現窗口顯示圖片的內容即可
raf1.close();
⑥ java如何實現微信表情及特殊字元存入資料庫
表情來,應自該說的是圖片表情,若不是圖片表情就很好處理,直接和文本一起存入資料庫。若是圖片表情,也就是圖片吧,可以使用二進制存資料庫,也可以使用base64寸資料庫,當然,最好別這樣做,圖片很大,對資料庫壓力也很大,存資料庫沒多大意義。
再說一句,圖片最好不要存資料庫,一般都是傳到伺服器文件系統,或者cdn,上傳成功後,返回圖片鏈接地址,然後把鏈接地址存到資料庫。
如果用base64上傳圖片,最好上傳後再伺服器端轉碼成圖片文件並存儲到伺服器,然後將base64數據替換成功那個圖片文件的鏈接,再存資料庫了。
特殊字元,一般是需要轉義之後才能存入資料庫。
至於如何轉義,網上很全面,教程也很多,樓主可以多去查查,我就不贅述了。
⑦ java替換表情符號 求正則表達式替換
查找正則表達式
\[(微笑|撇嘴|色|發呆)\]
替換為
<img src='.../imag/$1.png'/>
Pattern.compile("\\[(微笑|撇嘴|色|發呆)\\]").matcher(text).replaceAll("<img src='.../imag/$1.png'/>")
注意replaceAll中 不知道有沒有字元是 Java中需要轉義的字元,如果有加上轉義。
⑧ 怎樣有java socket實現發送接受表情類似QQ詳細點代碼
哈 我正好在做一個類似qq的系統,不過還沒完工,不過可以運行,現在只實現了登錄,顯示分組,列出好友,查看好友信息功冊,看看代碼吧
哎 類太多了,像什麼vo類及實現類我就不發了,再說這些類沒什麼技術含量
如果有必要的話 你留下郵箱,我將兩個工程和資料庫代碼發給你
伺服器類:
package chat;
import impl.UserImpl;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import vo.Userinfo;
import .UserDao;
/**
* 伺服器類,用於接受來自客戶端的請求,本系統規定來自客戶端每一次請求 所傳過來的參數不少於兩個,第一個用來標識此次請求將做什麼操作,後面
* 的參數為客戶端請求服務所需的必要參數
*
* @author 程勝
* @version 0.1
* @date 09-01-08
*
*/
public class ChatServer extends Thread {
// 定義最大連接數
private static final int MAXLINK = 50;
// 記錄當前連接數
public static int linkNum = 0;
// 定義服務連接對象
private static ServerSocket ss;
public static void main(String[] args) throws Exception {
// 實例化服務類
ss = new ServerSocket(8001);
// 啟用多線程:其實就是調用run方法,好像沒必要另啟線程,哎 寫好了 就不改了
new ChatServer().start();
System.out.println("伺服器已成功啟動…………");
}
/*
* 覆寫run方法
*/
public void run() {
Socket soc = null;
try {
// 循環監聽客戶端請求
while (true) {
while (true) {
// 如果連接數已滿,則等待
if (linkNum >= MAXLINK)
this.sleep(100);
else {
break;
}
}
// 監聽請求
soc = ss.accept();
// 將連接加一
linkNum++;
// 獲得socket對象後調用處理類
new Operate(soc);
}
} catch (Exception e) {
System.out.println(e);
} finally {
if (soc != null) {
try {
soc.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("伺服器出現莫名故障,伺服器退出!");
}
}
}
}
/**
* 操作類,用來處理來自客戶端的請求
*
* @author Administrator
*
*/
class Operate {
// 接定義用於實別客戶端發來的頭號請求將做何操作的變數
private String operate;
/**
* 以下幾行用於聲明網路操作的必要變數
*/
private Socket soc = null;
private InputStream ips = null;
private OutputStream ops = null;
private ObjectOutputStream soops = null;
private ObjectInputStream soips = null;
/**
* 構造函數,在其中為以上定義的變數的賦值
*
* @param soc
*/
Operate(Socket soc) {
this.soc = soc;
try {
ips = soc.getInputStream();
ops = soc.getOutputStream();
soips = new ObjectInputStream(ips);
// 接收從客戶端發來的頭號請求,它用於實別此次請求的內容
operate = soips.readObject().toString();
} catch (Exception e) {
System.out.println(e);
}
// 調用實際操作方法
whichOpe();
}
/**
* 判斷是哪個操作
*/
private void whichOpe() {
if ("login".equals(operate)) {
login();
} else {
if ("".equals(operate)) {
}
}
}
/**
* 連接資料庫,進行登錄驗證
*/
private void login() {
UserDao user = new UserImpl();
Userinfo user = null;
try {
// 讀取從客戶端傳過來的數據
user = (Userinfo) soips.readObject();
user = user.login(user);
soops = new ObjectOutputStream(ops);
// 將結果傳給客戶端
soops.writeObject(user);
soops.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
soops.close();
soips.close();
soc.close();
// 將連接數減一
ChatServer.linkNum--;
} catch (IOException e) {
System.out.println(e);
}
}
}
}
客戶端的兩個類:
package client;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.TextField;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import vo.Userinfo;
/**
* 登錄界面,繼承自jframe類
*
* @author 程勝
* @version 0.1
* @date 09-01-08
* @address 學校寢室:綜合樓424
*
*/
public class Login extends JFrame {
private final int TEXTSIZE = 10;// 定義文本長度的值
private JLabel lname = new JLabel("用戶名");
private JLabel lpassword = new JLabel("密碼");
private JLabel lhead = new JLabel("用戶登錄");
private JButton bok = new JButton("登錄");
private JButton bcancel = new JButton("退出");
private JPanel pcenter = new JPanel();
private JPanel pname = new JPanel();
private JPanel ppwd = new JPanel();
private JPanel psouth = new JPanel();
private JPanel pnorth = new JPanel();
private TextField pwd = new TextField(TEXTSIZE);
private JTextField name = new JTextField(TEXTSIZE);
private GridLayout glayout = new GridLayout();
public Login() {
// 設置界面大小及位置
this.setBounds(300, 200, 320, 250);
this.setTitle("用戶登錄");
this.setResizable(false);
// 設置窗口的關閉方式
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
// 布置窗口
this.frameLayout();
// 添加事件
this.addAction();
// 顯示窗口
this.show();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Login();
}
/**
* 布置容器
*/
private final void frameLayout() {
lhead.setFont(new Font("", Font.BOLD, 28));
glayout.setColumns(1);
glayout.setRows(2);
pcenter.setLayout(glayout);
pname.add(lname);
pname.add(name);
pwd.setEchoChar('*');
ppwd.add(lpassword);
ppwd.add(pwd);
pnorth.add(lhead);
psouth.add(bok);
psouth.add(bcancel);
pcenter.add(pname);
pcenter.add(ppwd);
this.add(pnorth, "North");
this.add(pcenter, "Center");
this.add(psouth, "South");
}
/**
* 添加事件
*/
private final void addAction() {
bok.addActionListener(new AddAction());
bcancel.addActionListener(new AddAction());
name.addActionListener(new AddAction());
pwd.addActionListener(new AddAction());
}
/**
* 此類為內置類,用於事件處理
*
* @author Administrator
*
*/
private class AddAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == bcancel) {
System.exit(0);
} else {
if ("".equals(name.getText()) || "".equals(pwd.getText())) {
JOptionPane.showMessageDialog(Login.this, "用戶名和密碼不能為空");
} else {
try {
// 判斷輸入的數據是否合法
Integer.parseInt(name.getText());
} catch (Exception ex) {
JOptionPane.showMessageDialog(Login.this, "請正確輸入號碼");
return;
}
new TcpLogin(name.getText(), pwd.getText()).check();
}
}
}
}
/**
* 登錄驗證類,內置類 將用戶名和密碼傳到伺服器做驗證
*
* @author 程勝
* @version 0.1
* @date 09-01-08
*/
class TcpLogin {
private int name;
private String pwd = "";
/**
* 構造函數,初始化用戶名和密碼的值
*
* @param name
* @param pwd
*/
TcpLogin(String name, String pwd) {
this.name = Integer.parseInt(name);
this.pwd = pwd;
}
/**
* 連接伺服器,驗證用戶信息方法
*/
void check() {
Window waitWin=new Window(Login.this);
// 獲得界面
Login login = Login.this;
Userinfo user = new Userinfo();
user.setUserId(name);
user.setPassword(pwd);
Socket soc = null;
InputStream ips = null;
OutputStream ops = null;
ObjectInputStream coips = null;
ObjectOutputStream coops = null;
try {
soc = new Socket("127.0.0.1", 8001);
ips = soc.getInputStream();
ops = soc.getOutputStream();
coops = new ObjectOutputStream(ops);
coops.writeObject("login");
coops.writeObject(user);
coops.flush();
ObjectInputStream oips = new ObjectInputStream(ips);
user = null;
user = (Userinfo) oips.readObject();
if (user != null){
new XiHa(user);
login.dispose();
}
else {
JOptionPane.showMessageDialog(login, "用戶名和密碼錯誤");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
ips.close();
ops.close();
soc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package client;
import java.awt.GridLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.Timer;
import javax.swing.tree.DefaultMutableTreeNode;
import vo.Groupinfo;
import vo.Relationinfo;
import vo.Userinfo;
/**
* 此類為本程序客戶端的主界面,剛想了好會兒決定取名叫』嘻哈『 意為』嘻嘻哈哈『
*
* @author 程勝
* @version 0.1
* @date 09-01-08
* @address 學校寢室:綜合樓424
*/
public class XiHa extends JFrame {
// 好友信息
static List<Userinfo> friends = new ArrayList<Userinfo>();
// 用戶信息
private Userinfo user = null;
private JPanel ptree = new JPanel();
private JPanel psouth = new JPanel();
private JButton bfind = new JButton("查找");
private JButton bsystem = new JButton("系統設置");
/**
* 構造函數,設置界面基本參數
*/
public XiHa(Userinfo user) {
this.user = user;
this.setTitle("嘻嘻哈哈");
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setBounds(800, 100, 200, 500);
this.setResizable(false);
// 布置界面
initFrame();
// this.pack();
this.setVisible(true);
}
/**
* 用於界面布置
*/
private void initFrame() {
ptree.add(new JScrollPane(new CreateTree(user).createNode()));
psouth.add(bsystem);
psouth.add(bfind);
this.add(ptree, "Center");
this.add(psouth, "South");
}
}
/**
* 本類用於創建以用戶信息為節點的樹
*
* @author 程勝
* @version 0.1
* @date 09-01-08
* @address 學校寢室:綜合樓424
*
*/
class CreateTree {
JTree tree=null;
private Userinfo user = null;
CreateTree(Userinfo user) {
this.user = user;
}
/**
* 用伺服器傳回的數據創建一棵樹
*
* @return
*/
JTree createNode() {
//根結點
DefaultMutableTreeNode all = new DefaultMutableTreeNode("所有好友");
Set<Groupinfo> groups = user.getGroupinfos();
Set<Relationinfo> relations = user.getRelationinfosForUserId();
Iterator<Groupinfo> ig = groups.iterator();
Iterator<Relationinfo> ir = null;
Groupinfo group = null;
Relationinfo relation = null;
DefaultMutableTreeNode friendNode = null;
Userinfo friend = null;
while (ig.hasNext()) {
group = ig.next();
friendNode = new DefaultMutableTreeNode(group.getGroupName());
ir = relations.iterator();
while (ir.hasNext()) {
relation = ir.next();
if (relation.getResideGroupId() == group.getGroupId()) {
friend = relation.getFriend();
friendNode.add(new DefaultMutableTreeNode(friend
.getPetname()
+ "(" + relation.getFriendId() + ")"));
XiHa.friends.add(friend);
}
}
all.add(friendNode);
// rootTree.add(friendNode);
}
tree=new JTree(all);
tree.addMouseListener(new TreeListener());
return tree;
}
/**
* 此類為創建樹的內置類,用於對結點的事件處理
*
* @author 程勝
* @version 0.1
* @date 09-01-09
* @address 學校寢室:綜合樓424
*/
class TreeListener extends MouseAdapter{
private JFrame friendInfo=null;
private String nodeInfo="";
//用於區分單擊雙擊
Timer mouseTimer =null;
/*
* 覆寫mouseAdapter中的mouseClicked方法,滑鼠點擊時觸發
*/
public void mouseClicked(MouseEvent e){
//返回選定的結點
DefaultMutableTreeNode treeNode =null;
treeNode =(DefaultMutableTreeNode)CreateTree.this.tree.getLastSelectedPathComponent();
if(treeNode==null)return;
//如果它不是葉子結點就返回
if(!treeNode.isLeaf())return;
nodeInfo=treeNode.toString();
if(e.getClickCount()==1){
mouseTimer = new javax.swing.Timer(350, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//布置信息界面
initFriendInfo();
mouseTimer.stop();
}
});
mouseTimer.restart();
}else{
if(e.getClickCount()==2&&mouseTimer.isRunning()){
mouseTimer.stop();
//實例化聊天界面
new WinChat();
}
}
}
/**
* 布置friendInfo的界面
*/
private void initFriendInfo() {
friendInfo=new JFrame();
friendInfo.setSize(300,120);
friendInfo.setDefaultCloseOperation(friendInfo.DISPOSE_ON_CLOSE);
friendInfo.setLocationRelativeTo(null);
friendInfoContent(this.treat());
friendInfo.setVisible(true);
}
/**
* 設置窗口中的具體內容
* @param friendId
* @return
*/
private void friendInfoContent(int friendId) {
friendInfo.dispose();
Userinfo friend=this.findFriend(friendId);
JPanel pmain=new JPanel();
pmain.setLayout(new GridLayout(3,1));
JPanel panel1=new JPanel();
panel1.add(new JLabel("嘻哈號:"+friend.getUserId()+" "+"昵稱:"+friend.getPetname()));
JPanel panel2=new JPanel();
panel2.add(new JLabel("姓名:"+(friend.getName()==null?"":friend.getName())+" "+"年齡:"+friend.getAge()+" "+"性別:"+friend.getSex()));
JPanel panel3=new JPanel();
panel3.add(new JLabel("個性簽名: "+(friend.getAutograph()==null?"":friend.getAutograph())));
pmain.add(panel1);pmain.add(panel2);pmain.add(panel3);
friendInfo.add(pmain);
}
/**
* 此方法用於獲得好友的id號 從節點上的文本中獲取
* @return 好友id
*/
private int treat(){
int len=nodeInfo.getBytes().length;
int friendId=Integer.parseInt(new String(nodeInfo.getBytes(),len-5,4));
return friendId;
}
/**
* 此方法用於按id查找好友信息
* @param friendId
* @return 好友信息
*/
private Userinfo findFriend(int friendId){
Userinfo friend=null;
Iterator friends=XiHa.friends.iterator();
while(friends.hasNext()){
Userinfo ifriend=(Userinfo)friends.next();
if(ifriend.getUserId()==friendId){
friend=ifriend;
break;
}
}
return friend;
}
}
}
/**
* 本類聊天窗口類,還不知道該怎麼寫,現在有點茫然,剛跟網友交流了一下
* 覺得前面寫的通信代碼很不規范,應該重新寫,哎 先把界面寫好再說
*
* 一會兒就要回去過年了,可能就沒那麼時間寫這個系統了
* @author 程勝
* @version 0.1
* @date 09-01-11
* @address 學校寢室:綜合樓424
*
*/
class WinChat extends JFrame{
private JPanel pmain=new JPanel();
private JPanel pcether=new JPanel();
private JPanel psouth=new JPanel();
//private JTextArea precod=new JTextArea(JTextArea.);
}