① 濡備綍鍦↗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.);
}