我用socket写了一个局域网的聊天软件,用了agsXMPP这个第三方的dll文件,用agsXMPP发送的消息内容只支持字符串格式。只支持文字聊天的我已经做好了,现在我想扩充一下功能,让它支持图片,和QQ表情,类似QQ聊天那样。介于agsXMPP发送的消息内容只支持字符串,我的设想是把聊天空中的文字和图片统一序列化为字节数组,client.ClassSerializers().SerializeBinary(GetSendTextMsg()).ToArray() 这段代码的功能就是读取客户端输入框中的文字和图片信息并将其序列化为字串。我想让将序列化为字串转换为字符串格式,作为agsXMPP发送的消息内容发送出去,用户收到后,再重新转换成字节数组。请问怎样将byte[]格式转换成string
这个问题我几天前就在网上问了,也获得了一些答复,比如Convert.ToBase64String方法和Convert.FromBase64String方法等方法,还有其它的一些方法,我都试过了。虽然都可以实现转换,不过好像都是有损的,不能使原来的byte[]转换成string后再转换成byte[],数据保持原样。哪位高手可以推荐一个方法,可以让数据保持原样啊?
这个问题我几天前就在网上问了,也获得了一些答复,比如Convert.ToBase64String方法和Convert.FromBase64String方法等方法,还有其它的一些方法,我都试过了。虽然都可以实现转换,不过好像都是有损的,不能使原来的byte[]转换成string后再转换成byte[],数据保持原样。哪位高手可以推荐一个方法,可以让数据保持原样啊?
解决方案 »
- Entity Framework Power Tools 生成映射结果的一个bug,大家看看能否解决
- c#关于tabPage的问题
- ASP中的母版页加载事件怎么会执行两次?
- 请求一个用T-SQL代码建库的基本代码框架,库中包含两个表,每个表包含两个字段,有一个主键和外键,完整且简单明了,谢谢!若将其放在文本文件中,C#如何执行这样的文本文件创建物理库?
- 在DataGridVIew的CellEndEdit事件里怎么判断事件是不是由用户按Esc键触发的?(需要其它事件协助判断也行)(续)(急)
- 请问timer和一个循环的线程区别在哪?
- 有没有办法实现这个小小的请求啊?
- 关于控件获取焦点的问题??为什么无法获取焦点??
- mbSheet.PrintOutEx打印成PDF
- (Winform) FORM窗口在全部显示出来前,会先显示一部分控件,延迟一会再全部显示出来, 有什么方法可以在FORM控件全部创建完后再显示?
- 关于setup factory这个工具
- 根据规则自动生成编码
有损的话,还是找找你的通讯代码的问题。
聊天么,即时性比较强,对反应要求比较高,一般都尽可能的少传不必要的内容。
{
XmlSerializer xs = new XmlSerializer(type);
StringReader sr = new StringReader(s);
object obj = xs.Deserialize(sr);
return obj;
}
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Xml;
using System.IO;
using System.Text;public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string strCon = "Data Source=(local);Database=db_15;Uid=sa;Pwd=";
SqlConnection sqlcon = new SqlConnection(strCon);
string sqlstr = "select * from tb_Employee";
SqlDataAdapter myda = new SqlDataAdapter(sqlstr, strCon);
DataSet myds = new DataSet();
sqlcon.Open();
myda.Fill(myds);
sqlcon.Close();
myds.WriteXml("test.xml");
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
Xml1.Document = doc;
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Visible = true;
FileStream oldXml = new FileStream(test.xml",FileMode.OpenOrCreate,FileAccess.Read,FileShare.Read);
EncodeXml("testNew.xml",oldXml);
XmlDocument doc1 = new XmlDocument();
doc1.Load("test.xml");
Xml1.Document = doc1;
XmlDocument doc2 = new XmlDocument();
doc2.Load("testNew.xml");
Xml2.Document = doc2;
Button1.Enabled = false;
}
public void EncodeXml(string newXml, FileStream oldXml)
{
byte[] buffer = new byte[1024]; ;
int readbyte = 0;
XmlTextWriter xw = new XmlTextWriter(newXml,Encoding.UTF8);
xw.WriteStartDocument();
xw.WriteStartElement("root");
BinaryReader br = new BinaryReader(oldXml);
do
{
readbyte = br.Read(buffer,0,1024);
xw.WriteBase64(buffer,0,readbyte);
}
while (1024 <= readbyte);
xw.WriteEndElement();
xw.WriteEndDocument();
xw.Flush();
xw.Close();
}
}解密:using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Xml;
using System.IO;
using System.Text;public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
Xml1.Document = doc;
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Visible = true;
FileStream newXml = new FileStream("testNew.xml",FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite);
decodeXml("test.xml",newXml);
XmlDocument doc = new XmlDocument();
doc.Load("testNew.xml");
Xml2.Document = doc;
}
public void decodeXml(string oldXml, FileStream newXml)
{
byte[] buffer = new byte[1024]; ;
int readbyte = 0;
BinaryWriter bw = new BinaryWriter(newXml);
XmlTextReader tr = new XmlTextReader(oldXml);
tr.MoveToContent();
do
{
readbyte = tr.ReadBase64(buffer, 0, 1024);
bw.Write(buffer, 0, readbyte);
}
while (1024 <= readbyte);
bw.Flush();
bw.Close();
}
}
如果楼主只是想实现,聊天时发送图片的话,不如用特定的数字,字符代替,
我现在也在做聊天工具,我的构想是,每个客户端里都有很多头像的图片,就想QQ那样
发送的时候,就发送个特定的字符串比如:“\ty”就代表个太阳的小头像,
楼主如果想让使用者自由的用自己的图片互相发送的话,这个我的确不会有几个网页你看看吧
http://topic.csdn.net/t/20030129/20/1400203.html
http://so.csdn.net/bbsSearchResult.aspx?q=socket+%e4%bc%a0%e5%9b%be%e7%89%87&p=0
有问题QQ联系吧362082536 一起学习
System.Text.Encoding.Default.GetBytes(/*string*/);// string->byte[]
不过现在要解决这个问题,得先知道,你为什么要用agsXMPP这个第3方的DLL?SCOKET类很好用啊,直接用就可以了,也没有什么问题,用第3方的DLL简直就是没事找事
把字节转化为字符串。
这样就行了