socket传文件
private string path = "F:\\SmartMovie.EXE";??? //要發送的文件
????????????????????? private Socket s;?????????????????????????????
???????? private void listen()
??????? {
??????????? string ip = "127.0.0.1";?? //遠程IP 這里定義為自己的機器
??????????? IPAddress[] ih = Dns.GetHostAddresses(ip);?????? //獲得IP列表
??????????? IPAddress newip = ih[0];????? //獲取IP地址
??????????? int port = 6789;????????????? //定義端口
??????????? IPEndPoint Conncet = new IPEndPoint(newip, port);???? //構造結點
??????????? s = new Socket(AddressFamily.InterNetwork, SocketType.Stream,? ProtocolType.Tcp);?? //初始化socket?
???? try
??????? {
??????????? s.Connect(Conncet);????? //連接遠程服務器
??????????? if (s.Connected)???????? //如果連接成功 s.Connected 則為true 否則為 false
??????????? {
??????????????? Console.WriteLine("連接成功");
??????????????? Thread t = new Thread(new ThreadStart(set)); //創建進程
??????????????? t.Start();???????????????????????????? //開始進程
??????????????? Console.WriteLine("發送完畢")??????
??????????? }
?????????????? }
??????????????? catch(NullReferenceException e)
??????????? {
????????????? Console.WriteLine("{0}",e);
??????????? }
??????????? private void set()?????????????????????? //創建set函數
??????? {
??????????? Console.WriteLine("開始發送數據");
??????????? byte[] b = new byte[10000000];??????????? //創建文件緩沖區,這里可以認為文件的最大值
??????????? FileStream file = File.Open(path, FileMode.Open,FileAccess.Read);?? //創建文件流
??????????? int start = 0;
??????????? int end = (int)file.Length;?????????????? //獲取文件長度文件傳送如果有需要超過int的范圍估計就要改寫FileStream類了
try
????????? {
??????????? while (end != 0)
??????????? {
??????????????? int count = file.Read(b, start, end);????? //把數據寫進流
??????????????? start += count;
??????????????? end -= count;
??????????? }
??????????? while (start != 0)
??????????? {
??????????????? int n = s.Send(b, end, start, SocketFlags.None);? //用Socket的Send方法發送流
??????????????? end += n;
??????????????? start -= n;
??????????? }
??????????? file.Close();???? //關閉文件流
??????????? s.Close();??????? //關閉Socket
????????? }?
????? catch (NullReferenceException e)
??????????? {
??????????????? Console.WriteLine("{0}", e);
??????????? }????????????
??????? }???
這樣文件發送的模型就實現了
??? 接下去實現文件的接收,首先要確定對方發送文件的長度,其實上面的那段還要加入發送文件長度的功能,實現很簡單,就是發送int變量end ,然后要求接收代碼返回一個Boolean確定是否發送,這里為了更簡明的說清楚原理并沒有實現
???????????? private void get()
??????? {
??????????? string path = "G:\\da.exe";? //接收的文件
??????????? FileStream file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); //寫入文件流
??????????? TcpListener listen = new TcpListener(6789);? //監聽端口
??????????? Socket s1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);? //定義Socket并初始化
??????????? try
??????????? {
???????????? listen.Start();??????? //開始監聽
??????????? s1 = listen.AcceptSocket();??????????? //獲取Socket連接
??????????? byte[] data = new byte[10000000];????? //定義緩沖區
??????????? int longer = data.Length;??????????????
??????????? int start = 0;????????????????
??????????? int mid = 0;
??????????? if (s1.Connected)???????????? //確定連接
??????????? {
??????????????? Console.WriteLine("連接成功");
??????????????? int count = s1.Receive(data, start, longer, SocketFlags.None);? //把接收到的byte存入緩沖區
??????????????? mid += count;
??????????????? longer -= mid;
??????????????? while (count != 0)
??????????????? {
??????????????????? count = s1.Receive(data, mid, longer, SocketFlags.None);
??????????????????? mid += count;
??????????????????? longer -= mid;
??????????????? }
??????????????? file.Write(data, 0, 1214134); //寫入文件,1214134為文件大小,可以用socket發送獲得,代碼前面已經說明。
??????????????? s1.Close();
??????????????? file.Close();
??????????? }
??????????? }
??????????????? catch(NullReferenceException e)
??????????? {
??????????????????? Console.WriteLine("{0}",e);
??????????? }
????????? }
?
http://www.cnblogs.com/wsy6634/archive/2008/10/13/1310294.html
轉載于:https://www.cnblogs.com/chinhr/archive/2009/05/06/1450719.html
總結
- 上一篇: SQL 胡言乱语
- 下一篇: pl/sql 报ORA-12154: T