用SOCKET发送文件导致界面不响应

duan17 2005-06-23 09:52:36
Thread t = new Thread(new ThreadStart(TransferFile));
t.IsBackground = true;
t.Start();
-----------------
private void TransferFile()
{
FileStream fs = new FileStream (this.m_files2,FileMode.Open,FileAccess.Read,FileShare.Read);

IPAddress ip = IPAddress.Parse(ReceIP); //对方IP
IPEndPoint endPoint = new IPEndPoint(ip,1002);

Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
socket.Connect(endPoint);

int iCount = (int)fs.Length;
byte[] buf = new byte[iCount];
int iSended = 0; //已经发送的字节数
int iSending = 0;
int iBlock =1024;
byte[] msg = new byte[2];
int i = 0;
bool error = false;
fs.Read(buf,0,iCount);

while(iSended < iCount)
{
if (iSended + iBlock <= iCount)
iSending = iBlock ;
else
iSending = iCount - iSended;

socket.Send(buf,iSended,iSending,SocketFlags.None);

socket.Receive(msg);

while(Encoding.ASCII.GetString(msg) != "ok")
{
i++;
Thread.Sleep(100);
socket.Receive(msg);
if (i==20)
{
MessageBox.Show("传送文件超时","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);
error = true;
break;
}
}

i=0;
iSended += iSending;
}

fs.Close();
socket.Shutdown(SocketShutdown.Both);
socket.Close();
if (error == true)
this.Close();
else
MessageBox.Show("传送文件完成","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}

文件发送成功了,发送方的界面就不响应了,接收方的界面是好的,本窗体是用ShowDialog打开的
...全文
149 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
12345_ 2005-07-30
  • 打赏
  • 举报
回复
mark
herony420 2005-06-24
  • 打赏
  • 举报
回复
发送的过程中UI没有响应还是发送完成之后没有响应?感觉你说的比较模糊
duan17 2005-06-24
  • 打赏
  • 举报
回复
up
herony420 2005-06-24
  • 打赏
  • 举报
回复
有点错误,方法名错误了

private void TransferFileTemp()
{
deleTransFile deleaccept = new deleTransFile(TransferFile);
deleaccept.BeginInvoke(null,null);
}
herony420 2005-06-24
  • 打赏
  • 举报
回复
启动线程调用一个委托,这个委托是实际方法的一个回调,然后使用委托的beginInvoke方法
delegate void deleTransFile();

Thread t = new Thread(new ThreadStart(TransferFileTemp));
t.IsBackground = true;
t.Start();

private void SListen()
{
deleTransFile deleaccept = new deleTransFile(TransferFile);
deleaccept.BeginInvoke(null,null);
}

herony420 2005-06-24
  • 打赏
  • 举报
回复
你的线程如果能使用异步的委托应该就没有问题了
duan17 2005-06-24
  • 打赏
  • 举报
回复
发送是成功的,接收方的窗体是正常的,中间也没有出现异常,无论是单线程发送还是多线程发送界面都没有响应,发送完成后界面也没有响应,只能托运标题栏
duan17 2005-06-24
  • 打赏
  • 举报
回复
发送的过程中没有响应,发送完了以后也没有响应,窗体全变白了,但是还可以被拖动
duan17 2005-06-23
  • 打赏
  • 举报
回复
//接收方
fileListener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

//监听1002端口,用来接收文件
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse(frmMain.myIp),1002);
fileListener.Bind(localEndPoint);
fileListener.Listen(10);

int iBlock = 1024;

Socket hander1 = fileListener.Accept(); //接收客户端的连接
string strFile = m_saveFile;//接收的文件名

int iLen = Int32.Parse(this.ReceFileLen); //文件长度
progressBar1.Maximum = iLen; //进度条
int iReceiveded = 0 ;
int iReceiveing = 0 ;
byte [] buf = new byte[iLen] ;
FileStream fs = new FileStream(strFile,FileMode.Create,FileAccess.Write);
try
{
while(iReceiveded < iLen)
{
if (iReceiveded + iBlock <= iLen)
iReceiveing = iBlock ;
else
iReceiveing = iLen - iReceiveded;

hander1.Receive(buf,iReceiveded,iReceiveing,SocketFlags.None);
progressBar1.Value = iReceiveded; //刷新进度条
hander1.Send(Encoding.ASCII.GetBytes("ok")); //向发送方发送消息发明已经收到

iReceiveded += iReceiveing ;
}

fs.Write(buf,0,iLen);
}
catch(Exception ex)
{
MessageBox.Show("接收文件失败: "+ex.Message) ;
}
finally
{
fs.Close();
hander1.Shutdown(SocketShutdown.Both);
hander1.Close();
}


this.Close();
jackymi 2005-06-23
  • 打赏
  • 举报
回复
接受方的代码粘出来
duan17 2005-06-23
  • 打赏
  • 举报
回复
但是我用的是多线程啊,怎么会阻塞UI线程呢
stonegoldaustin 2005-06-23
  • 打赏
  • 举报
回复
建议你用异步发送和接收,同步的经常容易造成堵塞,也就是你说的不相应。

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧