我现在做的SOCKET网络通信,序列化没问题,传送文字也没问题,我传送图片就出现这个问题了(传送文件我还没有测试),为什么啊!超级郁闷,谁来帮帮我!
31 个解决方案
#1
谁能给我看一下啊?提一下大概什么原因啊?
#2
例行回贴!
#3
倾家荡产了啊,有木有知道的啊,我就纳闷了 普通字符序列化以后可以传送,文件流序列化以后咋么就传送不了了!
#4
Receive数据到一个字节数组,很可能数组长度不够,数据没有接受完整。
#5
那要如何判断它,数据是否完整哩?
#6
数组长度肯定够了,图片的字符流是2W多
我在客户端定义的字符长度为100W+
我在客户端定义的字符长度为100W+
#7
图片变字节数组后是较大的数据,接受端一次Receive往往只能接收一部分数据,需要循环多次接收。
一般发送端在字节流起始位置写入数据长度,后面是实际数据。
下面是一个接受端如何取数据的代码,你要注意是否数据确定接受完整,是否反序列化时ms.Position = 0;
一般发送端在字节流起始位置写入数据长度,后面是实际数据。
下面是一个接受端如何取数据的代码,你要注意是否数据确定接受完整,是否反序列化时ms.Position = 0;
Socket clientSock = SkAccept.Accept();//阻塞方式以接收传入的连接
byte[] clientData = new byte[1024 * 1000];
MemoryStream ms = new MemoryStream();
int receivedBytesLen = clientSock.Receive(clientData);
//数据长度获得
long effetDataLen = BitConverter.ToInt64(clientData, 0);
ms.Write(clientData, 8, receivedBytesLen - 8);
long recLen = receivedBytesLen;//
while (recLen < (8 + effetDataLen))
{
receivedBytesLen = clientSock.Receive(clientData);
ms.Write(clientData, 0, receivedBytesLen);
recLen += receivedBytesLen;
}
ms.Position = 0;
BinaryFormatter bf = new BinaryFormatter();
SockData sockData = (SockData)bf.Deserialize(ms);
ms.Close();
#8
大的图片往往有数兆,定义4M的数组保险点
#9
我试试去,总之先谢谢了!
#10
up.....................
#11
哎....可能我技术有限吧,又出现新的问题了:
输入流是无效的二进制格式。开始内容(以字节为单位)是: FF-01-00-00-00-00-00-00-00-0C-02-00-...............
输入流是无效的二进制格式。开始内容(以字节为单位)是: FF-01-00-00-00-00-00-00-00-0C-02-00-...............
#12
Socket clientSock = SkAccept.Accept();//阻塞方式以接收传入的连接
byte[] clientData = new byte[1024 * 1000];
MemoryStream ms = new MemoryStream();
int receivedBytesLen = clientSock.Receive(clientData);
//数据长度获得
long effetDataLen = BitConverter.ToInt64(clientData, 0);
ms.Write(clientData, 8, receivedBytesLen - 8);
long recLen = receivedBytesLen;//
while (recLen < (8 + effetDataLen))
{
receivedBytesLen = clientSock.Receive(clientData);
ms.Write(clientData, 0, receivedBytesLen);
recLen += receivedBytesLen;
}
ms.Position = 0;
BinaryFormatter bf = new BinaryFormatter();
SockData sockData = (SockData)bf.Deserialize(ms);
ms.Close();
byte[] clientData = new byte[1024 * 1000];
MemoryStream ms = new MemoryStream();
int receivedBytesLen = clientSock.Receive(clientData);
//数据长度获得
long effetDataLen = BitConverter.ToInt64(clientData, 0);
ms.Write(clientData, 8, receivedBytesLen - 8);
long recLen = receivedBytesLen;//
while (recLen < (8 + effetDataLen))
{
receivedBytesLen = clientSock.Receive(clientData);
ms.Write(clientData, 0, receivedBytesLen);
recLen += receivedBytesLen;
}
ms.Position = 0;
BinaryFormatter bf = new BinaryFormatter();
SockData sockData = (SockData)bf.Deserialize(ms);
ms.Close();
#13
那要是4.0001M是不是就垮了?
传送4K的文件也必须4M缓冲么?
#14
楼上与7楼的有啥区别么?
#15
据说你是位大神,能不能帮我想想办法?
#16
你至少应该先去自己高清哪一句出错,然后调试,然后问出具体的问题。
#17
反序列化的时候出的问题啊!
#18
我定义的一个消息类,将这个消息类序列化传送给客户端.
在客户端进行反序列化,传送普通文字是没有错误的,传送图片流稀奇古怪的问题全出来了
在客户端进行反序列化,传送普通文字是没有错误的,传送图片流稀奇古怪的问题全出来了
#19
我错了,缓冲不一定要定的大,反正是要写入内存流ms对象中的。
#20
现在不知道为什么,写不进去撒!
#21
另: TcpClient client;
bool rV = true;
try
{
IPAddress ip=new IPAddress(new byte[]{192,168,3,108});
client = new TcpClient();
client.Connect(ip, 8500); // 与服务器连接
NetworkStream streamToServer = client.GetStream();
MemoryStream ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, m);
byte[] buffer = ms.ToArray();
streamToServer.Write(buffer, 0, buffer.Length); //发往服务器
client.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
formatter.Serialize(ms, m);中的m是我传送过来的消息对象
bool rV = true;
try
{
IPAddress ip=new IPAddress(new byte[]{192,168,3,108});
client = new TcpClient();
client.Connect(ip, 8500); // 与服务器连接
NetworkStream streamToServer = client.GetStream();
MemoryStream ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, m);
byte[] buffer = ms.ToArray();
streamToServer.Write(buffer, 0, buffer.Length); //发往服务器
client.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
formatter.Serialize(ms, m);中的m是我传送过来的消息对象
#22
你在发送端没有指定数据长度,接受端怎么知道数据完整性。
#23
这个问题我还没注意过,请问如何指定?
客户端我用:
streamToServer.DataAvailable来判断数据是否接受完毕!
客户端我用:
streamToServer.DataAvailable来判断数据是否接受完毕!
#24
也就是NetworkStream.DataAvailable
#25
那个属性不行的,在数据量较大时,接受端可能读完了缓冲区数据,发送的数据还没有发过来,此时DataAvailable是0,但实际你仍然需要继续Receive数据。
发送端必须在头部加入长度。接受端首先读出长度值,然后循环Receive,直到数据长度达到那个值
发送端必须在头部加入长度。接受端首先读出长度值,然后循环Receive,直到数据长度达到那个值
#26
我用的是NetworkStream 可能跟您写的不太一样,是没有Receive这个方法的!
我也考虑到了数据量大的时候读完了缓冲区数据,发送的数据还没法完的情况.
不知道可不可以给我一个好一点的解决方案??
244627758我的QQ能否加我详谈?拜谢!
我也考虑到了数据量大的时候读完了缓冲区数据,发送的数据还没法完的情况.
不知道可不可以给我一个好一点的解决方案??
244627758我的QQ能否加我详谈?拜谢!
#27
大侠,还在吗?指点指点我吧,急啊....
#28
#29
怎么这么多人回复,还没解决呢?
我也是报出这个错误。
前天写好了,Client 请求 server 发一张表数据,一切正常(把dataset 序列化和反序列化)。
今天再测试,偶尔报出 “二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。"
确定是反序列化的时候 出的问题,数据接收正常。
查阅msdn,找到一篇微软机器人翻译的文章,看了半天,还是不能解决问题。
我也是报出这个错误。
前天写好了,Client 请求 server 发一张表数据,一切正常(把dataset 序列化和反序列化)。
今天再测试,偶尔报出 “二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。"
确定是反序列化的时候 出的问题,数据接收正常。
查阅msdn,找到一篇微软机器人翻译的文章,看了半天,还是不能解决问题。
#30
问题是解决了的,字符流没有接受完毕!别人私下给我的指点,呵呵!
#31
看我的帖子,同样的操作功能,我的错误类型别你的要多几个啊。有图说明的。
谢谢。
http://topic.csdn.net/u/20100805/12/e6ab30cf-1b27-4ec1-9a39-83e8ae6cb6dc.html
#1
谁能给我看一下啊?提一下大概什么原因啊?
#2
例行回贴!
#3
倾家荡产了啊,有木有知道的啊,我就纳闷了 普通字符序列化以后可以传送,文件流序列化以后咋么就传送不了了!
#4
Receive数据到一个字节数组,很可能数组长度不够,数据没有接受完整。
#5
那要如何判断它,数据是否完整哩?
#6
数组长度肯定够了,图片的字符流是2W多
我在客户端定义的字符长度为100W+
我在客户端定义的字符长度为100W+
#7
图片变字节数组后是较大的数据,接受端一次Receive往往只能接收一部分数据,需要循环多次接收。
一般发送端在字节流起始位置写入数据长度,后面是实际数据。
下面是一个接受端如何取数据的代码,你要注意是否数据确定接受完整,是否反序列化时ms.Position = 0;
一般发送端在字节流起始位置写入数据长度,后面是实际数据。
下面是一个接受端如何取数据的代码,你要注意是否数据确定接受完整,是否反序列化时ms.Position = 0;
Socket clientSock = SkAccept.Accept();//阻塞方式以接收传入的连接
byte[] clientData = new byte[1024 * 1000];
MemoryStream ms = new MemoryStream();
int receivedBytesLen = clientSock.Receive(clientData);
//数据长度获得
long effetDataLen = BitConverter.ToInt64(clientData, 0);
ms.Write(clientData, 8, receivedBytesLen - 8);
long recLen = receivedBytesLen;//
while (recLen < (8 + effetDataLen))
{
receivedBytesLen = clientSock.Receive(clientData);
ms.Write(clientData, 0, receivedBytesLen);
recLen += receivedBytesLen;
}
ms.Position = 0;
BinaryFormatter bf = new BinaryFormatter();
SockData sockData = (SockData)bf.Deserialize(ms);
ms.Close();
#8
大的图片往往有数兆,定义4M的数组保险点
#9
我试试去,总之先谢谢了!
#10
up.....................
#11
哎....可能我技术有限吧,又出现新的问题了:
输入流是无效的二进制格式。开始内容(以字节为单位)是: FF-01-00-00-00-00-00-00-00-0C-02-00-...............
输入流是无效的二进制格式。开始内容(以字节为单位)是: FF-01-00-00-00-00-00-00-00-0C-02-00-...............
#12
Socket clientSock = SkAccept.Accept();//阻塞方式以接收传入的连接
byte[] clientData = new byte[1024 * 1000];
MemoryStream ms = new MemoryStream();
int receivedBytesLen = clientSock.Receive(clientData);
//数据长度获得
long effetDataLen = BitConverter.ToInt64(clientData, 0);
ms.Write(clientData, 8, receivedBytesLen - 8);
long recLen = receivedBytesLen;//
while (recLen < (8 + effetDataLen))
{
receivedBytesLen = clientSock.Receive(clientData);
ms.Write(clientData, 0, receivedBytesLen);
recLen += receivedBytesLen;
}
ms.Position = 0;
BinaryFormatter bf = new BinaryFormatter();
SockData sockData = (SockData)bf.Deserialize(ms);
ms.Close();
byte[] clientData = new byte[1024 * 1000];
MemoryStream ms = new MemoryStream();
int receivedBytesLen = clientSock.Receive(clientData);
//数据长度获得
long effetDataLen = BitConverter.ToInt64(clientData, 0);
ms.Write(clientData, 8, receivedBytesLen - 8);
long recLen = receivedBytesLen;//
while (recLen < (8 + effetDataLen))
{
receivedBytesLen = clientSock.Receive(clientData);
ms.Write(clientData, 0, receivedBytesLen);
recLen += receivedBytesLen;
}
ms.Position = 0;
BinaryFormatter bf = new BinaryFormatter();
SockData sockData = (SockData)bf.Deserialize(ms);
ms.Close();
#13
那要是4.0001M是不是就垮了?
传送4K的文件也必须4M缓冲么?
#14
楼上与7楼的有啥区别么?
#15
据说你是位大神,能不能帮我想想办法?
#16
你至少应该先去自己高清哪一句出错,然后调试,然后问出具体的问题。
#17
反序列化的时候出的问题啊!
#18
我定义的一个消息类,将这个消息类序列化传送给客户端.
在客户端进行反序列化,传送普通文字是没有错误的,传送图片流稀奇古怪的问题全出来了
在客户端进行反序列化,传送普通文字是没有错误的,传送图片流稀奇古怪的问题全出来了
#19
我错了,缓冲不一定要定的大,反正是要写入内存流ms对象中的。
#20
现在不知道为什么,写不进去撒!
#21
另: TcpClient client;
bool rV = true;
try
{
IPAddress ip=new IPAddress(new byte[]{192,168,3,108});
client = new TcpClient();
client.Connect(ip, 8500); // 与服务器连接
NetworkStream streamToServer = client.GetStream();
MemoryStream ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, m);
byte[] buffer = ms.ToArray();
streamToServer.Write(buffer, 0, buffer.Length); //发往服务器
client.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
formatter.Serialize(ms, m);中的m是我传送过来的消息对象
bool rV = true;
try
{
IPAddress ip=new IPAddress(new byte[]{192,168,3,108});
client = new TcpClient();
client.Connect(ip, 8500); // 与服务器连接
NetworkStream streamToServer = client.GetStream();
MemoryStream ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, m);
byte[] buffer = ms.ToArray();
streamToServer.Write(buffer, 0, buffer.Length); //发往服务器
client.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
formatter.Serialize(ms, m);中的m是我传送过来的消息对象
#22
你在发送端没有指定数据长度,接受端怎么知道数据完整性。
#23
这个问题我还没注意过,请问如何指定?
客户端我用:
streamToServer.DataAvailable来判断数据是否接受完毕!
客户端我用:
streamToServer.DataAvailable来判断数据是否接受完毕!
#24
也就是NetworkStream.DataAvailable
#25
那个属性不行的,在数据量较大时,接受端可能读完了缓冲区数据,发送的数据还没有发过来,此时DataAvailable是0,但实际你仍然需要继续Receive数据。
发送端必须在头部加入长度。接受端首先读出长度值,然后循环Receive,直到数据长度达到那个值
发送端必须在头部加入长度。接受端首先读出长度值,然后循环Receive,直到数据长度达到那个值
#26
我用的是NetworkStream 可能跟您写的不太一样,是没有Receive这个方法的!
我也考虑到了数据量大的时候读完了缓冲区数据,发送的数据还没法完的情况.
不知道可不可以给我一个好一点的解决方案??
244627758我的QQ能否加我详谈?拜谢!
我也考虑到了数据量大的时候读完了缓冲区数据,发送的数据还没法完的情况.
不知道可不可以给我一个好一点的解决方案??
244627758我的QQ能否加我详谈?拜谢!
#27
大侠,还在吗?指点指点我吧,急啊....
#28
#29
怎么这么多人回复,还没解决呢?
我也是报出这个错误。
前天写好了,Client 请求 server 发一张表数据,一切正常(把dataset 序列化和反序列化)。
今天再测试,偶尔报出 “二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。"
确定是反序列化的时候 出的问题,数据接收正常。
查阅msdn,找到一篇微软机器人翻译的文章,看了半天,还是不能解决问题。
我也是报出这个错误。
前天写好了,Client 请求 server 发一张表数据,一切正常(把dataset 序列化和反序列化)。
今天再测试,偶尔报出 “二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。"
确定是反序列化的时候 出的问题,数据接收正常。
查阅msdn,找到一篇微软机器人翻译的文章,看了半天,还是不能解决问题。
#30
问题是解决了的,字符流没有接受完毕!别人私下给我的指点,呵呵!
#31
看我的帖子,同样的操作功能,我的错误类型别你的要多几个啊。有图说明的。
谢谢。
http://topic.csdn.net/u/20100805/12/e6ab30cf-1b27-4ec1-9a39-83e8ae6cb6dc.html