spark默认的单聊截图模式是利用文件来来进行传递,调用SparkTransferManager.getInstance().sendFile(img.getTmpFile(), getParticipantJID());
调用 final OutgoingFileTransfer transfer = transferManager
.createOutgoingFileTransfer(fullJID);
通过 transfer.sendFile(file, "Sending file");来进行发送。
spark的群聊(临时会议基础上进行改造)却不能使用这种模式来进行文件传递,缺少了文件传递的JID。由此,想出一种简单的方式来通过xmpp来进行传递。
思路很简单:截图后的图片保存到本地,插入到聊天显示框,将图片image转为byte数组,再转为hex存储到String中(自定义标签,如<img>来将转码后的内容保存,方便接受时候截取),利用Message传递时setBody(“转码后的字符串”)。
在群聊接收消息的GroupChatRoom的handleMessagePacket方法进行修改,创建BufferedImag并利用ImageIo将图片写入到指定文件中,具体代码如下:
public void sendMessage() {
String text = getChatInputEditor().getText();
StringBuffer sb = new StringBuffer();
String imageByte=null;
final StringTokenizer tokenizer = new StringTokenizer(text, " \n \t", true);
while (tokenizer.hasMoreTokens()) {
String textFound = tokenizer.nextToken();
if(textFound.startsWith("Tmp://")) {
String tmpPath = textFound.substring(textFound.indexOf("Tmp://") + 6, textFound.indexOf("#"));
Log.debug("screen shot file " + tmpPath + "created.");
//CHECK IF SEND BY ME, JUST INSERT EXISTED ICON IF TRUE
File rootPath = new File(Spark.getSparkUserHome(), "/tempImages");//本地创建截图
File f = new File(rootPath.getAbsolutePath(), tmpPath);
if(f.exists()){
try {
imageByte=image2String(f);//得到转码后的字符串
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// String s = new String (imageByte);
sb.append("<img>");
sb.append(imageByte);
sb.append("</img>");
}
// RevImage image = new RevImage();
// insertComponent(image);
}
}
sendMessage(text+sb.toString());
}
转码的具体实现:
public static String image2String(File f) throws Exception {
FileInputStream fis = new FileInputStream( f );
byte[] bytes = new byte[fis.available()];
fis.read(bytes);
fis.close();
// 生成字符串
String imgStr = byte2hex( bytes );
return imgStr;
}
private static String byte2hex(byte[] b) {
StringBuffer sb = new StringBuffer();
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1){
sb.append("0" + stmp);
}else{
sb.append(stmp);
}
}
return sb.toString();
}
收到消息后的处理:
if(message.getBody().contains("Tmp://")&&message.getBody().contains("<img>")&&message.getBody().contains("</img>")){
final StringTokenizer tokenizer = new StringTokenizer(message.getBody(), " \n \t", true);
byte[] imgbyte=null;
ImageIcon icon=null;
File f=null;
while (tokenizer.hasMoreTokens()) {
String textFound = tokenizer.nextToken();
if(textFound.startsWith("Tmp://")) {
String tmpPath = textFound.substring(textFound.indexOf("Tmp://") + 6, textFound.indexOf("#"));
Log.debug("screen shot file " + tmpPath + "created.");
//CHECK IF SEND BY ME, JUST INSERT EXISTED ICON IF TRUE
File rootPath = new File(Spark.getSparkUserHome(), "/tempImages");
f = new File(rootPath.getAbsolutePath(), tmpPath);
if(!f.exists()){
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if(textFound.contains("<img>")&&textFound.contains("</img>")){
imgbyte = hex2byte(textFound);
byte[] bytes =imgbyte;
if (bytes != null && bytes.length > 0) {
icon = new ImageIcon(bytes);
}
Image image =icon.getImage();
BufferedImage bufImg = new BufferedImage(image.getWidth(null), image.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics g = bufImg .createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
try {
ImageIO.write(bufImg, "PNG", new FileOutputStream(f));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
getTranscriptWindow().insertMessage(from, message,
getColor(from),
getMessageBackground(from, message.getBody()));
解码代码:
private byte[] hex2byte(String textFound) {
int start = textFound.indexOf("<img>")+5;
int end = textFound.indexOf("</img>");
String str = textFound.substring(start, end);
if (str == null)
return null;
str = str.trim();
int len = str.length();
if (len == 0 || len % 2 == 1)
return null;
byte[] b = new byte[len / 2];
try {
for (int i = 0; i < str.length(); i += 2) {
b[i / 2] = (byte) Integer.decode("0X" + str.substring(i, i + 2)).intValue();
}
return b;
} catch (Exception e) {
return null;
}
}
这样,通过byte数组来生成图片,实现群聊截图功能。
- 大小: 62.2 KB
分享到:
相关推荐
Openfire、Spark和Smack是三个与XMPP(Extensible Messaging and Presence Protocol)相关的开源项目,它们在构建即时通讯(IM)系统中扮演着重要角色。XMPP是一种基于XML的网络协议,主要用于实时通讯,包括消息...
Openfire和Spark可能利用了如Jingle这样的XMPP扩展来处理音视频流的传输,而`redfire-plugin.jar`和`redfire.war`可能包含了这些实现的具体代码和库。同时,为了保证良好的视频通话体验,还需要考虑网络带宽、服务器...
Android XMPP例子(Openfire+asmack+spark)是一个典型的基于Android平台的即时通讯(Instant Messaging,IM)应用实现,利用了XMPP协议、Openfire服务器、asmack库以及Spark客户端工具。XMPP(Extensible Messaging ...
其次,openfire是基于Java的开源IM服务器,它实现了XMPP(Extensible Messaging and Presence Protocol)协议,这是一种被广泛采用的即时通讯协议。Openfire不仅提供了基础的聊天功能,还支持群聊、推送通知、文件...
Spark是一个基于Java的开源客户端,用于构建实时通信系统,而Openfire是一款基于XMPP协议的服务器端软件,负责处理用户之间的消息传递和管理。这里我们将深入探讨这两个组件以及它们在二次开发中的应用。 1. Spark...
Openfire是一款基于XMPP(Extensible Messaging and Presence Protocol)协议的服务器,它允许用户进行实时通信,而Spark则是一款轻量级的XMPP客户端,设计用于企业和团队的内部沟通。 **Openfire** 是一个用Java...
通过研究Openfire Spark 2.7.0的源码,开发者不仅可以学习到即时通讯应用的实现,还可以深入理解XMPP协议、Java GUI编程、网络编程以及软件的可扩展性和安全性设计。这对于任何想要从事即时通讯领域或者对Java Swing...
【标题】"openfire与spark即时通讯系统:解压即用" 即时通讯(Instant Messaging,简称IM)在当今数字化...通过Openfire和Spark的组合,用户可以轻松实现内部沟通、协作,同时享受到XMPP协议带来的稳定性和安全性。
6. **群组聊天**:如果需要,实现群组聊天功能,创建和管理群组,以及发送和接收群聊消息。 7. **安全性和性能优化**:使用SSL/TLS加密通信,提高安全性。另外,优化连接管理和数据传输,降低功耗和网络延迟。 8. ...
【标题】"精典源码之AdXmpp(Openfire+asmack+spark)" 提供的是一个关于XMPP协议实现的开源项目,其中涉及到的主要组件包括Openfire服务器、asmack库以及Spark客户端。这个压缩包文件是对于学习和研究XMPP通信协议...
用户则可以通过支持XMPP协议的客户端(如Spark、Pidgin等)连接到Openfire服务器,使用群聊功能。 总的来说,"openfire群聊插件"结合XMLPP库,为Openfire服务器带来了强大的群聊能力,使用户能够在企业环境中实现...
AdXmpp是一个专门为Android平台设计的XMPP(Extensible Messaging and Presence Protocol)客户端库,它结合了Openfire服务器、asmack库以及Spark桌面客户端的相关技术。这个源码压缩包提供了AdXmpp的完整实现,对于...
首先,AdXmpp是一个针对Android平台设计的即时通信解决方案,它整合了Openfire、Asmack和Spark这三款开源工具,以实现高效、稳定且安全的XMPP(Extensible Messaging and Presence Protocol)协议通信。 1. **...
《Android即时通信技术详解——基于AdXmpp、Openfire、asmack与spark的实现》 在移动应用领域,即时通信(Instant Messaging,简称IM)已经成为不可或缺的功能,它为用户提供实时的信息交流体验。本教程将围绕...
Spark是与Openfire配套的桌面客户端,它也是基于XMPP协议的。Spark API允许开发者扩展其功能,比如创建插件、定制界面或者实现特定的业务逻辑。通过源码导入MyEclipse,开发者可以深入理解Spark的工作原理,并对其...
【基于openfire的web在线聊天源码】是一个实现网页端即时通讯系统的开源项目,它利用了Openfire服务器作为后台支持,提供了丰富的功能,包括联系人分组、群聊、在线状态修改、群成员邀请、设置群管理员以及踢人等,...
4. **Spark客户端**:Spark是Openfire官方推荐的桌面客户端,它也是基于XMPP协议。在测试中,我们可能需要配置Spark客户端连接到Openfire服务器,验证用户登录、发送和接收消息的功能是否正常。Spark支持丰富的功能...
- **Openfire**: 基于XMPP协议实现的即时通信服务器,推荐使用3.6.4版本,该版本是当时最新的版本,提供了稳定的性能和良好的兼容性。 - **Spark**: 即时通信客户端,建议使用2.5.8版本,这是当时最新的发布版,支持...