heisetoufa 发表于 2013-2-4 21:58:24

c# winform Socket多文件传输并把传输文件保存到Oracle数据库Blob字段里

服务器接收端代码:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Net;using System.Threading;using System.Net.Sockets;using System.IO;using System.Data.OracleClient;using System.Data.OleDb;namespace OverSpeedMIS{public partial class FormSystemOnLineObject : Form{public FormSystemOnLineObject(){InitializeComponent();//不显示出dataGridView1的最后一行空白dataGridView1.AllowUserToAddRows = false;}/// <summary>    /// 作者:黑色头发   /// C# WinForm Socket传递多个文件并保存到oracle数据库的Blob字段   /// blog:http://heisetoufa.iteye.com   /// 静网:http://www.heisetoufa.cn   /// </summary>#region 定义变量TcpListener lisner;Thread TempThread;int xhMax = 0;//序号DBConnection dbc = new DBConnection();OleDbConnection con;OracleConnection connn;OracleDataReader odrRepeat;#endregion#region 进入窗体即启动服务private void FormSystemOnLineObject_Load(object sender, EventArgs e){//判断文件存不存在if (!Directory.Exists(@txtFileSaveDir.Text))//若文件夹不存在则新建文件夹{Directory.CreateDirectory(@txtFileSaveDir.Text); //新建文件夹}//开启接收线程TempThread = new Thread(new ThreadStart(this.StartReceive));TempThread.IsBackground = true;//设置为后台线程TempThread.Start();}private void StartReceive(){//创建一个网络端点IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("2005"));//创建网络监听lisner = new TcpListener(ipep);lisner.Start();while (true){////确认连接                if (!lisner.Pending()){Thread.Sleep(1000);continue;}//MessageBox.Show("1");Socket client = lisner.AcceptSocket();//获得客户端节点对象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));//获得[包的总数量]int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)));//获得[最后一个包的大小]string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));//创建一个新文件string fileFullName = txtFileSaveDir.Text + "\\" + SendFileName;FileStream MyFileStream = new FileStream(fileFullName, FileMode.Create, FileAccess.Write, FileShare.Read);//已发送包的个数int SendedCount = 0;while (true){byte[] data = TransferFiles.ReceiveVarData(client);if (data.Length == 0){break;}else{SendedCount++;//将接收到的数据包写入到文件流对象MyFileStream.Write(data, 0, data.Length);}}//关闭文件流MyFileStream.Close();//关闭套接字client.Close();IPHostEntry ipHostEntry = Dns.GetHostEntry(IPAddress.Parse(clientep.Address.ToString()));string clientHostName = ipHostEntry.HostName;//················································//保存接收的文件到数据库里if (checkBox2.Checked == true){string cnnstr = "provider=OraOLEDB.Oracle;data source=zlkj_kk;User Id=kk;Password=kk;";con = new OleDbConnection(cnnstr);try{con.Open();}catch{ }OleDbCommand cmd = new OleDbCommand(cnnstr, con);cmd.CommandType = CommandType.Text;cmd.CommandText = cnnstr;//string imgPath = @"d:\aa\a.jpg";//图片文件所在路径+文件名string imgPath = @fileFullName;//图片文件所在路径+文件名FileStream file = new FileStream(imgPath, FileMode.Open, FileAccess.Read);Byte[] imgByte = new Byte;//把图片转成 Byte型 二进制流file.Read(imgByte, 0, imgByte.Length);//把二进制流读入缓冲区file.Close();//========================================================================================//插入之前检查有有无重复数据 connn = dbc.getConnection();//获得conn连接try{connn.Open();OracleCommand cmdd = connn.CreateCommand();cmdd.CommandText = "SELECT max(cast( xh as int)) as xh FROM kk.kkcltj ";//插入之前检查有有无重复数据 odrRepeat = cmdd.ExecuteReader();//创建一个OracleDateReader对象    if (odrRepeat.Read())//读取数据,如果odr.Read()返回为true的话,就说明到登陆成功了{xhMax = Convert.ToInt32(odrRepeat["xh"].ToString());}}catch (Exception ee){MessageBox.Show(ee.Message.ToString());}//========================================================================================string strr = fileFullName.Substring(fileFullName.LastIndexOf("\\") + 1).ToString();//不带路径的文件名//MessageBox.Show("                  "+strr);DateTime dTime;string kkdd = "";//卡口地点string xsfx = "";//行驶方向string xscd = "";//行驶车道int xzsd = 0;//限制速度int sjsd = 0;//实际速度string csbz = "";//超速标志string hpzl = "";//号牌种类string hphmm = "";//号牌号码if (fileFullName.Length > 42){int yearFile = Convert.ToInt32(strr.Substring(0, 4));//截取年int monthFile = Convert.ToInt32(strr.Substring(4, 2));//截取月int dateFile = Convert.ToInt32(strr.Substring(6, 2));//截取日int hourFile = Convert.ToInt32(strr.Substring(8, 2));//截取时int minuteFile = Convert.ToInt32(strr.Substring(10, 2));//截取分int secondFile = Convert.ToInt32(strr.Substring(12, 2));//截取秒//int millisecondFile = Convert.ToInt32(strr.Substring(14, 3));//dTime = new DateTime(yearFile, monthFile, dateFile, hourFile, minuteFile, secondFile);//MessageBox.Show(dt.ToString("yyyy-MM-dd HH-mm-ss fff"));kkdd = strr.Substring(14, 4);//卡口地点xsfx = strr.Substring(18, 1); ;//行驶方向xscd = strr.Substring(19, 1);//行驶车道xzsd = Convert.ToInt32(strr.Substring(20, 3));//限制速度sjsd = Convert.ToInt32(strr.Substring(23, 3));//实际速度csbz = strr.Substring(26, 1);//超速标志hpzl = strr.Substring(27, 2);//号牌种类hphmm = strr.Substring(29, 7);//号牌号码//照片大小//—————————————————————————————————————————————//把信息插入数据库xhMax++;//MessageBox.Show(xhMax.ToString());cmd.CommandText = "insert into kk.kkcltj(xh,zpsj,kkdd,xsfx,xscd,xzsd,sjsd,csbz,hphm,hpzl,zpdx,zp) values('" + xhMax.ToString() + "',to_date('" + dTime.ToString() + "','YYYY-MM-DD HH24:MI:SS'),'" + kkdd + "','" + xsfx + "' ,'" + xscd + "', " + xzsd + ", " + sjsd + ", '" + csbz + "','" + hphmm + "','" + hpzl + "','" + imgByte.Length.ToString() + "',:zp ) ";//正常sql语句插入数据库//MessageBox.Show(cmd.CommandText.ToString());cmd.Parameters.Add("zp", System.Data.OleDb.OleDbType.Binary, imgByte.Length);cmd.Parameters.Value = imgByte;try{cmd.ExecuteNonQuery();//MessageBox.Show("插入成功");}catch (System.Exception e1){MessageBox.Show(e1.Message);}//—————————————————————————————————————————————}else{}}else if (checkBox1.Checked == true){//AddRow(clientHostName, "说明占位", clientep.Address, SendedCount, SendFileName, bagCount, "连接类型占位", "关联对象占位");}else if (checkBox1.Checked == false && checkBox2.Checked == false){MessageBox.Show("选择保存到硬盘还是数据库");break;}//················································con.Close();connn.Close();odrRepeat.Close();//填加到dgv里//文件大小,IP,已发送包的个数,文件名,包的总量,最后一个包的大小//AddRow(clientHostName, "说明占位", clientep.Address, SendedCount, SendFileName, bagCount, bagLast);AddRow(clientHostName, "说明占位", clientep.Address, SendedCount, SendFileName, bagCount, "连接类型占位", "关联对象占位");}}private delegate void DelAddRow(object o1, object o2, object o3, object o4, object o5, object o6, object o7, object o8);private void AddRow(object o1, object o2, object o3, object o4, object o5, object o6, object o7, object o8){if (InvokeRequired){DelAddRow dar = new DelAddRow(AddRow);this.Invoke(dar, o1, o2, o3, o4, o5, o6, o7, o8);return;}this.dataGridView1.Rows.Add(o1, o2, o3, o4, o5, o6, o7, o8);}#endregion#region   拦截Windows消息,关闭窗体时执行protected override void WndProc(ref   Message m){const int WM_SYSCOMMAND = 0x0112;const int SC_CLOSE = 0xF060;if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE){//捕捉关闭窗体消息   //   User   clicked   close   button   //this.WindowState = FormWindowState.Minimized;//把右上角红叉关闭按钮变最小化TempThread.Abort();lisner.Stop();ServiceStop();}base.WndProc(ref   m);}#endregion#region 停止服务//停止服务private void ServiceStop(){try{}catch { }try{}catch { }}#endregionprivate void button1_Click(object sender, EventArgs e){if (fbdFileSave.ShowDialog() == DialogResult.OK){txtFileSaveDir.Text = fbdFileSave.SelectedPath;}}private void toolStripStatusLabel1_Click(object sender, EventArgs e){}private void toolStripStatusLabel2_Click(object sender, EventArgs e){System.Diagnostics.Process.Start("http://heisetoufa.iteye.com");}}}

客户发送端代码省略,详见http://heisetoufa.iteye.com/blog/257070或下载源码

只供自己记忆或参考使用

黑色头发:http://heisetoufa.iteye.com
页: [1]
查看完整版本: c# winform Socket多文件传输并把传输文件保存到Oracle数据库Blob字段里