C# socket编程第三篇
生活随笔
收集整理的這篇文章主要介紹了
C# socket编程第三篇
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?? ? ? 昨天寫了兩篇socket的,今天繼續,一步一步解決我們需要解決的問題。第一篇簡單的介紹了下Socket,讓大家對socket有個大致的概念,初步的印象。第二遍里給了socket通信的簡單demo,實現了socket客服端和服務端的簡單通信,相當于隧道的兩端已經打通了,現在要做的就是在這基礎上不斷的完善我們的程序,讓程序去實現我們想要實現的想法,去解決我們需要解決的問題.今天我們在昨天的基礎上,修改程序實現傳輸文件,不只是字符直接的傳輸與現實。 ? ? ??
服務端 using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.IO;
namespace Bose.XueLeCN.COM.FileReceiveControl
{
public class FileOut
{
public void Fileout()
{
int Port = 8001;
//string Ip = "192.168.1.20";
IPEndPoint ipep = new IPEndPoint(IPAddress.Any,Port);
EndPoint ep = (EndPoint)ipep;
Socket sc = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
sc.Bind(ep);
Console.WriteLine("this is server");
Console.WriteLine("waiting for a connect");
IPEndPoint ipepClient = new IPEndPoint(IPAddress.Any,0);
EndPoint epClient = (EndPoint)ipepClient;
int rec;
byte[] data=new byte[1024];
//==========獲取客戶端發送過來的 文件 byte 的大小
rec = sc.ReceiveFrom(data,ref epClient);
//==========這里的getstring()方法一定要加 其實偏移量,和長度,不然 得到的字符串中會有很多\0出現
int Length = int.Parse(Encoding.ASCII.GetString(data, 0, data.Length));
Console.WriteLine("Data is "+Encoding.ASCII.GetString(data,0,rec));
//===========將得到的數據返回個客戶端,進行通信,這里看似沒太大的意義,但是是為了方便以后判斷是否丟包和要求回發做準備
sc.SendTo(data,data.Length,SocketFlags.None,epClient);
data=new byte[Length];
//===========接收客戶端發送過來的文件數據
rec = sc.ReceiveFrom(data,ref epClient);
//===========將文件寫入到磁盤
File.WriteAllBytes(@"E:\1.jpg",data);
//===========死循環 方便調試 避免直接退出
while (true)
{
}
}
}
} 客戶端 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace FileDistributeControl
{
public class FileOut
{
public void Fileout()
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.1.20"), 8001);
// EndPoint ep = (EndPoint)ipep;
Socket sc = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
// sc.Bind(ep);//客服端 不需要綁定 endpoint
Console.WriteLine("this is client");
Console.WriteLine("client is connecting");
// 開始 傳圖片
string Path = @"F:\2.jpg";
// FileInfo fino = new FileInfo(Path);
//=====讀取文件,將文件讀取成數據流
FileStream fs = new FileStream(Path,FileMode.Open,FileAccess.Read);
byte[] FileBytes=new byte[fs.Length];
fs.Read(FileBytes,0,FileBytes.Length);
IPEndPoint ipClient = new IPEndPoint(IPAddress.Any, 0);
EndPoint epClient = (EndPoint)ipClient;
int rec;
byte[] b = new byte[1024];
b = Encoding.ASCII.GetBytes(fs.Length.ToString());
//=======發送文件的byte數組大小
sc.SendTo(b,b.Length,SocketFlags.None,ipep);
b=new byte[1024];
//=======接受服務端 發送過來的 信息... rec 是byte 的大小,服務端發送過來的 數據是 b這個字節數組
rec = sc.ReceiveFrom(b, ref epClient);
Console.Write("receive from server:" + Encoding.ASCII.GetString(b, 0, rec).Trim());
//=======發送文件
sc.SendTo(FileBytes,FileBytes.Length,SocketFlags.None,ipep);
//=======加一個死循環是方便調試,避免程序運行完畢 直接退出
while (true)
{
}
}
}
} ?? ? ?程序中需要注意的地方都加了注釋,應該可以很清楚的看明白。在客戶端和服務端的端口必須一樣,否則會報錯。
轉載于:https://www.cnblogs.com/_fyz/archive/2011/05/06/2038654.html
總結
以上是生活随笔為你收集整理的C# socket编程第三篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lec6-待学习的堆排序
- 下一篇: HDU 1063 Exponentiat