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[file.Length];//把图片转成 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[0].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 { }
}

#endregion

private 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");
}
}
}


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

只供自己记忆或参考使用

黑色头发:http://heisetoufa.iteye.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值