自己写了个TCP的传送类.
使用的是 Socket的异步传送接收方式在网络上传送大文件时.接收到的信息总有一些要不对.....
但在一台机子上开两个端口相互传送就没有问题....是不是用Socket类在传送过程中数据会出错..有什么方法来检验发送和接收到的数据的一致性.....
使用的是 Socket的异步传送接收方式在网络上传送大文件时.接收到的信息总有一些要不对.....
但在一台机子上开两个端口相互传送就没有问题....是不是用Socket类在传送过程中数据会出错..有什么方法来检验发送和接收到的数据的一致性.....
解决方案 »
- c#中如何调用API来实现音频和视频的调节向导
- DataGridView--Excel
- 请教有关dll加壳的问题!
- 问一个基础问题
- 从XML中把数据导入datagridview成表格,具体怎么做啊
- 怎么把两个DataTable里的数据揉合在一个DataTable里,并同时并把原来两个表里的数据在新表里做一个随机排序?
- winform中在Datagrid中怎样让符合条件的某个单元格的字体显示红色?或是不同的颜色啊
- 高分请求C#面向对象编程思想类的书籍
- 怎样处理字符串效率最高
- 关于.net 的IDE 环境一个奇怪问题
- 100分求byte[]数组转换ushort、short、uint、int类型[在线等]解决立马结贴
- 如何设置通用查询各表之间的动态关联????
{
TcpListener tcpl = new TcpListener(_iPort);
tcpl.Start();
//MessageBox.Show("正在等待客户端连接");//调试用
log.LogStartServer(true);
//建立文件流,读取文件列表
FileStream fs = new FileStream("List.txt", FileMode.Open,FileAccess.Read,FileShare.Read);
byte[] bSend = new byte[fs.Length];
fs.Read(bSend, 0, bSend.Length);
byte[] bEOF = System.Text.Encoding.ASCII.GetBytes("<EOF>");
while (true)
{
TcpClient tc = tcpl.AcceptTcpClient();//接受将阻塞,直到有人连接
NetworkStream ns = tc.GetStream();//得到网络传输流 ns.Write(bSend, 0, bSend.Length);//写入流
ns.Flush();
ns.Write(bEOF, 0, bEOF.Length);//写入结束标志
//接受返回的流
byte[] bRec = new byte[1024];
ns.Read(bRec, 0, bRec.Length);
String strRec = Encoding.Default.GetString(bRec);
MessageBox.Show(strRec); tc.Close();
//MessageBox.Show("以发送");//调试用
}
}
catch (SocketException socketError)
{
if (socketError.ErrorCode == 10048)
{
//MessageBox.Show("连接到此端口失败。有另一台服务器正在此端口上侦听。");//调试用
log.LogStartServer(false);
}
}
客户端这样写:
int block;
// 每次从流中读取缓存大小的数据,直到读取到结束标志<EOF>为止
while (true)
{
block = ns.Read(bRec, 0, bRec.Length); string ss=System.Text.Encoding.ASCII.GetString(bRec);
int x=ss.IndexOf("<EOF>");
if( -1!=x )//找到<EOF>
{
fs.Write(bRec, 0, x);
fs.Flush();
break;
}
else
{
fs.Write(bRec, 0, block);
fs.Flush();
}
} fs.Close();
MessageBox.Show("完成读取");
就是不明白TCP传输过程中怎么会出错...(两台不同的机子传大文件一般都要出错)要如何才能控制传输错误??
http://community.csdn.net/Expert/TopicView.asp?id=5032172
http://blog.csdn.net/yeerh/archive/2006/09/25/1280111.aspx
/// <summary>
/// 接收数据回调函数
/// </summary>
/// <param name="ar"></param>
private void ReceivceData(IAsyncResult ar)
{
try
{
//接收到的数据长度.
SocketError sErr;
int receLen = this.socket.EndReceive(ar, out sErr);
if (receLen > 0)
{
byte[] receBytes = (byte[])ar.AsyncState;
switch (receBytes[0])
{
case 0: //接收到文本
ReceivceText(receLen, receBytes);
break;
case 1: //接收到对象
ReceivceObje(receLen, receBytes);
break;
case 2: //接收到文件
ReceivceFile(receLen, receBytes);
break;
default: //接收错误
WriteLine("错误的数据包: 包头为" + receBytes[0].ToString());
WriteLine(sErr.ToString());
break; }
//继续接收数据
byte[] bytes = new byte[bufferLen];
this.socket.BeginReceive(bytes, 0, bytes.Length, SocketFlags.None,
new AsyncCallback(ReceivceData), bytes);
return;
}
}
catch (SocketException socketErr)
{
WriteLine(socketErr.Message);
}
catch (ObjectDisposedException socketClose)
{
WriteLine(socketClose.Message);
}
catch (Exception err)
{
WriteLine(err.Message);
}
//断开连接事件
if (DisConnect != null) DisConnect(socket, this);
this.recObjeLen = -1;
this.recFileLen = -1;
}
用异步发..应该和循环发差不多吧??
我是用异步每次发8092个字节..你用循环发..是不是在接收到每一包都要回应呢?
估计得加上验证.在接收端接收完一包时发出响应..
发送端接收到响应以再发第二包...
还没写完..写好了会更新到我的blog上..谢谢大家