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.Net.Sockets; using System.Data.SQLite; using System.Configuration; using System.IO; using System.IO.Compression; using System.Threading; using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.BZip2; namespace Sockets { public partial class ServerForm : Form { Socket s = null; IPEndPoint iep = null; byte[] buf = new byte[5000]; Socket worker = null; private SQLiteCommand comma; private SQLiteConnection sqc; public ServerForm() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } #region 打开sqlite数据库 ////// 打开数据库 /// private void opensqlite() //打开sqlite数据库 { sqc = new System.Data.SQLite.SQLiteConnection("Data Source=C:\\Documents and Settings\\fei5280\\桌面\\Sockets\\XMLs\\barcodetp.db;Pooling=false;FailIfMissing=false"); sqc.Open(); comma = sqc.CreateCommand(); } #endregion #region 查询插入数据 ////// 数据操作 /// private void getdata() { int iCount = 0; StringBuilder str = new StringBuilder(); comma.CommandText = "delete from barlabel"; comma.ExecuteNonQuery(); string sqlstr = "SELECT TOP 10000 a.barcode,b.lot_no,a.packing_no,a.grade,a.nwt FROM barcodes.dbo.barin a INNER JOIN hc.dbo.specinfo b ON a.prod_id=b.prod_id"; DataTable dt = new Sysmis.Data.eTable("bars").Execute(sqlstr); for (int i = 0; i < dt.Rows.Count; i++) { str.Append("INSERT INTO barlabel values('" + dt.Rows[i]["barcode"].ToString() + "','" + dt.Rows[i]["lot_no"].ToString() + "','" + dt.Rows[i]["packing_no"].ToString() + "','" + dt.Rows[i]["grade"].ToString() + "','" + dt.Rows[i]["nwt"].ToString() + "');"); //str.Append("INSERT INTO barstore values('" + dt.Rows[i]["barcode"].ToString() + "');"); iCount = iCount + 1; if (iCount > 500) { comma.CommandText = "BEGIN TRANSACTION;" + str.ToString() + "COMMIT;"; //}; comma.ExecuteNonQuery(); str.Remove(0, str.Length); iCount = 0; } } comma.CommandText = "BEGIN TRANSACTION;" + str.ToString() + "COMMIT;"; int j = comma.ExecuteNonQuery(); comma.Dispose(); sqc.Dispose(); sqc.Close(); } #endregion #region 打开SOCKET TCP通道 private void button1_Click(object sender, EventArgs e) { //创建一个通道 s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建一个侦听点 iep = new IPEndPoint(IPAddress.Any, 20000); //绑定到通道上 s.Bind(iep); //侦听 s.Listen(6); //通过异步来处理 s.BeginAccept(new AsyncCallback(Accept), s); this.button1.Visible = false; } #endregion #region 处理接收到的消息 void Accept(IAsyncResult ia) { s = ia.AsyncState as Socket; worker = s.EndAccept(ia); s.BeginAccept(new AsyncCallback(Accept), s); try { //检查是否有客户端发送来的操作消息 异步调用 worker.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), worker); } catch { throw; } } #endregion #region 接收发送消息 ////// 当客户端接收到特定的信息的时候自动发送文件barcodetp.db /// /// void Receive(IAsyncResult ia) { try { opensqlite(); getdata(); worker = ia.AsyncState as Socket; //原本的Socket对象使用用来接收信息,每收到一次,都会创建一个包含该条信息的Socket对象,你只能通过这个创建出来的Socket对象来收取信息,而那个最初的Socket对象只负责接收。 int count = worker.EndReceive(ia); //结束时挂起异步读取 worker.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), worker); //buf = ReceiveVarData(worker); string context = Encoding.GetEncoding("gb2312").GetString(buf, 0, count); this.textBox1.Text += Environment.NewLine; this.textBox1.Text += context; if (this.textBox1.Text != "") { FileStream sr = null; byte[] buffer = null; string path = "C:\\Documents and Settings\\fei5280\\桌面\\Sockets\\XMLs\\barcodetp.db"; if (File.Exists(path)) { FileInfo EzoneFile = new FileInfo(path); sr = EzoneFile.OpenRead(); //获得读取的FileStream buffer = new byte[sr.Length]; //sr.Length 获得文件的大小 1kb文件 = new byte[1024]; } else { MessageBox.Show("无法找到文件"); return; } //发送[包的大小]到客户端 SendVarData(worker, Encoding.GetEncoding("gb2312").GetBytes(sr.Length.ToString())); byte[] data = null; //包的数量 int aaa = (int)buffer.Length / 5000; //开始循环发送数据包 for (int i = 0; i < aaa; i++) { //从文件流读取数据并填充数据包 sr.Read(buf, 0, buf.Length); //发送数据包 SendVarData(worker, buf); //显示发送数据包的个数 } //未被发送完成的包的数量 int bbb = buffer.Length - aaa * 5000; //如果还有多余的数据包,则应该发送完毕! if (bbb != 0) { data = new byte[bbb]; sr.Read(data, 0, data.Length); SendVarData(worker, data); // this.progressBar1.Value = this.progressBar1.Maximum; } sr.Flush(); sr.Close(); // worker.Send(buffer); } } catch { } } #endregion #region 服务端发送数据的方法(最好不要调用) 客户端可能报错 private void button2_Click(object sender, EventArgs e) { string context = "XXXXX" + this.textBox2.Text.Trim(); if (context != "") { this.textBox1.Text += Environment.NewLine; this.textBox1.Text += context; this.textBox2.Text = ""; worker.Send(Encoding.GetEncoding("gb2312").GetBytes(context)); } } #endregion #region 循环发送数据 ////// 循环传输数据 /// /// /// ///传输数据的数量 public static int SendVarData(Socket s, byte[] data) { int total = 0; int size = data.Length; int dataleft = size; int sent; byte[] datasize = new byte[4]; datasize = BitConverter.GetBytes(size); sent = s.Send(datasize); while (total < size) { sent = s.Send(data, total, dataleft, SocketFlags.None); total += sent; dataleft -= sent; } return total; } #endregion #region 循环接收数据 public byte[] ReceiveVarData(Socket s) { int recv = 1; int total = 0; byte[] datasize = new byte[4]; recv = s.Receive(datasize, 0, 4, SocketFlags.None); int size = BitConverter.ToInt32(datasize, 0); int dataleft = size; byte[] data = new byte[size]; while (total < size) { recv = s.Receive(data, total, dataleft, SocketFlags.None); total += recv; dataleft -= recv; } return data; } #endregion #region 压缩 public static byte[] Compress(byte[] byteArray) { //byte[] byteArray = Encoding.UTF8.GetBytes(value); ------当传入为string时 byte[] tmpArray; using (MemoryStream ms = new MemoryStream()) { using (GZipStream sw = new GZipStream(ms, CompressionMode.Compress)) { sw.Write(byteArray, 0, byteArray.Length); sw.Flush(); } tmpArray = ms.ToArray(); } return tmpArray; } #endregion #region 解压缩 ////// 解压缩 /// /// ///public static byte[] Decompress(byte[] value1) { //byte[] zippedData = Convert.FromBase64String(value1); -----当传入为string时 MemoryStream ms = new MemoryStream(value1); GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Decompress); MemoryStream outBuffer = new MemoryStream(); byte[] block = new byte[1024]; while (true) { int bytesRead = compressedzipStream.Read(block, 0, block.Length); if (bytesRead <= 0) break; else outBuffer.Write(block, 0, bytesRead); } compressedzipStream.Close(); return outBuffer.ToArray(); } #endregion #region 窗口关闭 public void ServerForm_FormClosing(object sender, FormClosingEventArgs e) { this.Dispose(); } #endregion public static byte[] Zip(byte[] data) { MemoryStream inStream = new MemoryStream(data); MemoryStream outStream = new MemoryStream(); BZip2.Compress(inStream, outStream, data.Length); byte[] result = outStream.ToArray(); inStream.Close(); outStream.Close(); return result; } public static byte[] Unzip(byte[] data, int offset, int size) { MemoryStream inStream = new MemoryStream(data, offset, size); MemoryStream outStream = new MemoryStream(); BZip2.Decompress(inStream, outStream); byte[] result = outStream.ToArray(); inStream.Close(); outStream.Close(); return result; } } }
客户端(winCE通用)
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.Net.Sockets; using System.IO; using ICSharpCode.SharpZipLib.BZip2; using System.Threading; namespace Sockets { public partial class ClientForm : Form { Socket s = null; IPEndPoint iep = null; private int bagCount; private string path = "E:\\barcodelot1.db"; public ClientForm() { InitializeComponent(); // Control.CheckForIllegalCrossThreadCalls = false; } #region 连接服务器端 private void button1_Click(object sender, EventArgs e) { s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); iep = new IPEndPoint(IPAddress.Parse("192.168.10.24"), 20000); try { s.Connect(iep); this.label1.Text = "连接成功"; this.button1.Visible = false; } catch { throw; } } #endregion #region 发送消息 接收服务端传输过来的文件 ////// /// /// /// private void button2_Click(object sender, EventArgs e) { this.label3.Visible = true; this.label3.Text = "数据准备中......."; Application.DoEvents(); this.button2.Enabled = false; string context = iep.ToString() + ":" + this.textBox2.Text.Trim(); //this.textBox1.Text += Environment.NewLine; this.textBox1.Text += context; this.textBox2.Text = ""; //if (File.Exists(path)) //{ // File.Delete(path); //} //发送数据的到服务器端 s.Send(Encoding.GetEncoding("gb2312").GetBytes("s42160144295")); //新建服务器端传输的文件 FileStream MyFileStream = new FileStream(path, FileMode.Create, FileAccess.Write); // int SendedCount = 0; //接收到服务器端传输的文件大小 byte[] bu = ReceiveVarData(s); bagCount = int.Parse(Encoding.GetEncoding("gb2312").GetString(bu, 0, bu.Length)); this.progressBar1.Maximum = bagCount; while (true) { this.progressBar1.Visible = true; this.label2.Visible = true; this.label3.Visible = false; Application.DoEvents(); this.label2.Text = (Convert.ToDouble(MyFileStream.Length) / Convert.ToDouble(bagCount)).ToString("P"); ; this.progressBar1.Value = Convert.ToInt32(MyFileStream.Length); if (MyFileStream.Length >= bagCount) { this.label2.Text = "100 %"; this.progressBar1.Value = this.progressBar1.Maximum; break; } byte[] data = ReceiveVarData(s); // SendedCount++; //将接收到的数据包写入到文件流对象 MyFileStream.Write(data, 0, data.Length); //显示已发送包的个数 //MessageBox.Show("已发送包个数"+SendedCount.ToString()); } //关闭文件流 MyFileStream.Flush(); MyFileStream.Close(); MessageBox.Show("OK"); this.progressBar1.Value = 0; this.label2.Text = "0 %"; this.button2.Enabled = true; this.progressBar1.Visible =false; this.label2.Visible = false; } #endregion #region 循环接收数据 public byte[] ReceiveVarData(Socket s) { int recv = 1; int total = 0; byte[] datasize = new byte[4]; recv = s.Receive(datasize, 0, 4, SocketFlags.None); int size = BitConverter.ToInt32(datasize, 0); int dataleft = size; byte[] data = new byte[size]; while (total < size) { recv = s.Receive(data, total, dataleft, SocketFlags.None); total += recv; dataleft -= recv; } return data; } #endregion //#region 解压缩 暂未用到 //public byte[] Decompress(byte[] value1) //{ // //byte[] zippedData = Convert.FromBase64String(value1); // MemoryStream ms = new MemoryStream(value1); // GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Decompress); // MemoryStream outBuffer = new MemoryStream(); // byte[] block = new byte[1024]; // while (true) // { // int bytesRead = compressedzipStream.Read(block, 0, block.Length); // if (bytesRead <= 0) // { // break; // } // else // outBuffer.Write(block, 0, bytesRead); // } // compressedzipStream.Close(); // return outBuffer.ToArray(); //} //#endregion //#region 关闭窗口 //public void ClientForm_FormClosing(object sender, FormClosingEventArgs e) //{ // this.Dispose(); //} //#endregion public static byte[] Unzip(byte[] data) { MemoryStream inStream = new MemoryStream(data); MemoryStream outStream = new MemoryStream(); BZip2.Decompress(inStream, outStream); byte[] result = outStream.ToArray(); inStream.Close(); outStream.Close(); return result; } } }