前天通过http协议把上传文件功能做好了,我们老大说要简单点,无需装iis的用socket方式做。
我之前没用socket方式做过。找了些资料看得头晕晕的了。
所以过来求助一下。
实现功能:
局域网内实现定时扫描指定文件夹(分多级目录)下所有文件上传至服务器。
服务器端接受文件保存至指定文件夹下。
求大虾们赐教,在下感激不尽
我之前没用socket方式做过。找了些资料看得头晕晕的了。
所以过来求助一下。
实现功能:
局域网内实现定时扫描指定文件夹(分多级目录)下所有文件上传至服务器。
服务器端接受文件保存至指定文件夹下。
求大虾们赐教,在下感激不尽
try
{
sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sendSocket.Connect(IP); string fileName = Path.GetFileName(filePath); byte[] buffCompanyID = new byte[4];
buffCompanyID = BitConverter.GetBytes(fCompanyID); byte[] buffImageLength = new byte[4];
buffImageLength = BitConverter.GetBytes(fileName.Length);
byte[] buffImageName = new byte[fileName.Length];
buffImageName = Encoding.Default.GetBytes(fileName); Stream s = File.Open(filePath, FileMode.Open);
int leng = 0;
if (s.Length < int.MaxValue)
leng = (int)s.Length;
byte[] by = new byte[leng];
s.Read(by, 0, leng);
s.Close(); MemoryStream ms = new MemoryStream();
ms.Write(buffCompanyID, 0, 4);
ms.Write(buffImageLength, 0, 4);
ms.Write(buffImageName, 0, fileName.Length);
ms.Write(by, 0, leng);
byte[] anotherBytes = ms.GetBuffer(); sendSocket.Send(anotherBytes, 8 + fileName.Length + leng, SocketFlags.None);
}
catch (System.Exception ex)
{
throw ex;
}
finally
{
if (sendSocket != null)
{
sendSocket.Shutdown(SocketShutdown.Both);
sendSocket.Close();
}
}
return true;
}
。我这个是将文件流和文件名字。文件名字长度。和客户id.合并成的一个大流。一次性传到服务器上去的。你看下吧。。希望对你有用。
http://www.netxk.cn/?p=145
发送文件时将这个类序列化后发送,这样接收后就比较容易解释信息,省的还得定义几个字节是文件信息,还方便以后扩展.
如果是大文件的话就多读几次,记得在类里做个标记
{
this.btnStartServer.Enabled = false;
//开启接收线程
Thread TempThread = new Thread(new ThreadStart(this.StartReceive));
TempThread.Start();
} private void StartReceive()
{
//创建一个网络端点
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("1005")); //创建一个套接字
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定套接字到端口
server.Bind(ipep); //开始侦听(并堵塞该线程)
server.Listen(10); while (true)
{
try
{
Socket client = server.Accept();
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; //获得[文件名]
string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)); //获得[包的大小]
string bagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
//MessageBox.Show("包大小" + bagSize); //获得[包的总数量]
int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)));
//MessageBox.Show("包的总数量" + bagCount); //获得[最后一个包的大小]
string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
//MessageBox.Show("最后一个包的大小" + bagLast); //创建一个新文件
string fileFullName =txtFileSaveDir.Text + "\\"+ SendFileName;
FileStream MyFileStream = new FileStream(fileFullName, FileMode.Create, FileAccess.Write); //已发送包的个数
int SendedCount = 0;
while (true)
{ byte[] data = TransferFiles.ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
SendedCount++;
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
//将文件信息保存至数据库
this.fileAdd(SendFileName,fileFullName);
}
}
//关闭文件流
MyFileStream.Close(); //关闭套接字
client.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} }
问题就在我该如何结束这个线程呢
{ byte[] data = TransferFiles.ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
SendedCount++;
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
//将文件信息保存至数据库
this.fileAdd(SendFileName,fileFullName);
}
}