将文件d:\1234.txt里面的内容读取到buffer中,用Socket将buffer发送到服务器端,我客户端和服务器端在一台机器上时则没问题,当把客户端放到同一局域网内其他机器上时接收到的byte数组前半截正确,后半截就全编程0了。这是为什么?丢失数据是因为网络的问题吗?怎样解决?
还有发送数据时一般每次发送多大的byte数组?当我只发送一个1k的文件时又能正确接收。
客户端 发送的代码:
public void GetFileData()
{
FileStream fs = new FileStream(@"d:\1234.txt", FileMode.Open, FileAccess.Read);
long size = fs.Length;
byte[] buffer = new byte[size];
fs.Position = 0;
fs.Read(buffer, 0, Convert.ToInt32(size));
fs.Close();
this.Send(buffer);
}
public void Send(byte[] bs)
{
try
{
int port = 2000;
string host = "192.168.1.2";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
c.Connect(ipe);//连接到服务器
c.Send(bs, bs.Length, 0);//发送测试信息
c.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
}
服务器端 接收的代码:
public void Receive()
{
try
{
int port = Int32.Parse(ConfigurationManager.AppSettings["PointTop"].ToString());
string host = ConfigurationManager.AppSettings["IPTop"].ToString();
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
s.Bind(ipe);//绑定端口
s.Listen(0);//开始监听
IORelated io = new IORelated();
int size = ThreadCreate.size;
if (true)
{
Socket temp = s.Accept();//为新建连接创建新的Socket。
byte[] recvBytes = new byte[100000000];
int bytesNum;//接收到的字节数
bytesNum = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
temp.Close();
}
s.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
throw;
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
throw;
}
}
11 个解决方案
#1
对了,还有,如果我在接收的这一行
bytesNum = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
代码上面加个断点,然后调试执行的话又能完整的接收到数据了,测试了很多遍都是这个样子,这是为什么?
bytesNum = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
代码上面加个断点,然后调试执行的话又能完整的接收到数据了,测试了很多遍都是这个样子,这是为什么?
#2
一个小时了都,怎么一个回复也没有。。。
#3
超时 丢包。。
发送少的可以发出去吗?
发送少的可以发出去吗?
#4
少的可以?一般这样的问题都是怎么解决的?
#5
2011年3月24日9:08:53
#6
2011年3月24日10:25:07
#7
缓冲区你给了限制么
#8
你的接收代码有问题啊。
发送数据的时候根据网络状态有可能会发生拆包的情况,你发送的数据可能会实际上分成小段发送2次以上,你的代码只接收了一次,当然后半段都是0.
调试的时候因为已经延时,后半段已经进入缓冲区,当然就都收到了。
你在客户端先发一个int代表长度,然后再循环接收定长数据就ok了。
发送数据的时候根据网络状态有可能会发生拆包的情况,你发送的数据可能会实际上分成小段发送2次以上,你的代码只接收了一次,当然后半段都是0.
调试的时候因为已经延时,后半段已经进入缓冲区,当然就都收到了。
你在客户端先发一个int代表长度,然后再循环接收定长数据就ok了。
#9
没有做什么限制,客户端和服务器在一台机器上的时候好使。
#10
谢谢谢谢,试了试果真是这个原因。
#11
问题解决,结贴给分。
#1
对了,还有,如果我在接收的这一行
bytesNum = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
代码上面加个断点,然后调试执行的话又能完整的接收到数据了,测试了很多遍都是这个样子,这是为什么?
bytesNum = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
代码上面加个断点,然后调试执行的话又能完整的接收到数据了,测试了很多遍都是这个样子,这是为什么?
#2
一个小时了都,怎么一个回复也没有。。。
#3
超时 丢包。。
发送少的可以发出去吗?
发送少的可以发出去吗?
#4
少的可以?一般这样的问题都是怎么解决的?
#5
2011年3月24日9:08:53
#6
2011年3月24日10:25:07
#7
缓冲区你给了限制么
#8
你的接收代码有问题啊。
发送数据的时候根据网络状态有可能会发生拆包的情况,你发送的数据可能会实际上分成小段发送2次以上,你的代码只接收了一次,当然后半段都是0.
调试的时候因为已经延时,后半段已经进入缓冲区,当然就都收到了。
你在客户端先发一个int代表长度,然后再循环接收定长数据就ok了。
发送数据的时候根据网络状态有可能会发生拆包的情况,你发送的数据可能会实际上分成小段发送2次以上,你的代码只接收了一次,当然后半段都是0.
调试的时候因为已经延时,后半段已经进入缓冲区,当然就都收到了。
你在客户端先发一个int代表长度,然后再循环接收定长数据就ok了。
#9
没有做什么限制,客户端和服务器在一台机器上的时候好使。
#10
谢谢谢谢,试了试果真是这个原因。
#11
问题解决,结贴给分。