最近研究檔案接收,稍微總結一下,以後繼承補充:
整完的工程下載下傳址地(源碼)
:http://download.csdn.net/detail/zhujinghao09/5313666
序程功能紹介:
伺服器: PC
言語 C#
按鈕開啟serverSocket
private void btnStartServer_Click(object sender, EventArgs e)
{
string strip = tbIP.Text; //手動填寫IP址地
string strport = tbPort.Text; //端口号
IPAddress IP;
int Port;
try
{
if (strip != "" && strport != "")
{
IP = IPAddress.Parse(strip);
Port = Convert.ToInt32(strport);
this.lIP.Text = IP.ToString();
this.lport.Text = strport;
}
else //如果沒有填寫任何資訊,則認默是當位址地和1234端口号
{
IP = GetIP(); //取得當地IP址地
Port = 1234;
this.lIP.Text = IP.ToString();
this.lport.Text = Port.ToString();
}
if (IP != null)
serverFullAddr = new IPEndPoint(IP, Port);
else
{
MessageBox.Show("沒有到得确正IP址地!!");
return;
}
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(serverFullAddr);
lbserverState.Text = "伺服器已啟動!!";
}
catch(Exception el)
{
MessageBox.Show(el.Message);
return;
}
//開啟帶有參數的聽監線程,并把伺服器socket傳遞給線程
ParameterizedThreadStart parstart = new ParameterizedThreadStart(ConnectListen);
Thread thListen = new Thread(parstart);
threadList.Add(thListen);
thListen.Start((object)server);
}
取得 當地IP址地 此段代碼直接從網上找到的
public IPAddress GetIP()
{
// string strAddr = "";
IPAddress IP=null;
try
{
string strHostName = System.Net.Dns.GetHostName();
System.Net.IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);
foreach (IPAddress _ipaddress in ipEntry.AddressList)
{
if (_ipaddress.AddressFamily.ToString().ToLower() == "internetwork")
{
//strAddr = _ipaddress.ToString();
IP = _ipaddress;
break;
}
}
// Log.Debug(" IP:" + strAddr);
}
catch (System.Exception e)
{
//Log.Error(" Get IP Address Error:" + e.Message);
MessageBox.Show("沒有取得主機的IP!!!");
}
return IP;
}
聽監用戶端接連線程
private void ConnectListen(object server)
{
Socket serverSocket = (Socket)server;
while (true) //環循接聽接連
{
serverSocket.Listen(20);
Socket acceptSock = serverSocket.Accept();
byte[] byteArray = new byte[50];
acceptSock.Receive(byteArray);//接收資料 //接收用戶端發送來過的使用者名 認默50個位元組,處置到得字元串
//将位元組數組轉成字元串
string strRec = System.Text.Encoding.Default.GetString(byteArray); //C# byte[] 轉換為 string
string socketName = strRec.Substring(0, strRec.IndexOf("\n"));
IPAddress clientIp = ((System.Net.IPEndPoint)acceptSock.RemoteEndPoint).Address; 取得用戶端IP址地
string strip = clientIp.ToString();
socketNameList.Add(socketName);
socketIpList.Add(strip);
UpdatePersonListBox(); //更新使用者清單
clientSocketList.Add(acceptSock);
ParameterizedThreadStart parstart = new ParameterizedThreadStart(RecvFile); 為每一個用戶端添加接收資訊聽監線程
Thread th = new Thread(parstart);
threadList.Add(th);
th.Start((object)acceptSock);
}
}
接收檔案線程
每日一道理
喜歡海,不管湛藍或是光燦,不管平靜或是波濤洶湧,那起伏蕩漾的,那絲絲的波動;喜歡聽海的音聲,不管是浪擊礁石,或是浪濤翻滾,那輕柔的,那澎湃的;喜歡看海,不管心情是舒暢的或是沉悶的,不管天氣是晴朗的或是陰沉的,那舒心的,那松弛的……
private void RecvFile(object acceptSock)
{
bool flag = false;
Socket recvSocket = (Socket)acceptSock;
byte[] byteArry = new byte[256];
string path = "recvVoice"; //建創接收檔案檔案夾
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string strnow = DateTime.Now.ToString("yyyyMMdd-hh-mm-ss"); //根據統系時光定名接收檔案
string strpath = "recvVoice\\" + strnow + ".wav";
byte[] buffLen = new byte[50];
int count=recvSocket.Receive(buffLen); //接收檔案的位元組長度用于斷判接收檔案結束 認默50位元組發送
string strRec = System.Text.Encoding.Default.GetString(buffLen);
string fLen = strRec.Substring(0, strRec.IndexOf("\n"));
int fileLen = 0;
try
{
fileLen = Convert.ToInt32(fLen);
}
catch(Exception el)
{
MessageBox.Show(el.Message);
}
int recCount = 0;
int readLen = 0;
MemoryStream memStream = new MemoryStream();
try
{
while ((recCount = recvSocket.Receive(byteArry)) > 0) // 環循接收檔案 位元組發送
{
readLen = readLen + recCount;
if (readLen >= fileLen) //跳出環循志标
{
memStream.Write(byteArry, 0, recCount);
flag = true;
break;
}
memStream.Write(byteArry, 0, recCount); //把網絡流寫進檔案流
flag = true; //接收檔案志标
}
}
catch (Exception el)
{
flag = false;
memStream.Close();
// fs.Close();
memStream = null;
// fs = null;
MessageBox.Show(el.Message);
RecvFile(acceptSock); //應用遞歸 繼承聽監檔案接收來信
return;
}
if (flag)
{
FileStream fs = new FileStream(strpath, FileMode.OpenOrCreate);
memStream.WriteTo(fs);
fs.Close();
fs = null;
UpdateLabel(flag);
IPAddress clientIp = ((System.Net.IPEndPoint)recvSocket.RemoteEndPoint).Address;
string strip = clientIp.ToString();
int index = socketIpList.IndexOf(strip);
AddVoiceToListBox(socketNameList[index] + "****" + socketIpList[index], strpath, flag); //把用戶端使用者名址地,接收檔案的存保徑路
//添加到音聲清單
}
flag = false;
memStream.Close();
memStream = null;
RecvFile(acceptSock); //應用遞歸 繼承聽監檔案接收來信
}
當地音聲發送數函
private void SendFile(Socket acceptSock,string vpath)
{
Socket sendSocket = (Socket)acceptSock;
byte[] byteArray = new byte[100];
Stream st = File.OpenRead(vpath);
Byte[] b = new Byte[1024];
string strlen = st.Length.ToString();
byte[] bytes = System.Text.Encoding.Default.GetBytes(strlen + "\r\n"); //string 轉換byte[]
sendSocket.Send(bytes); //發送檔案長度 用于斷判檔案接收結束
int count = 0;
int sent = 0;
int offset = 0;
int left = 0;
Thread.Sleep(1000); //重點哦
while (offset < st.Length)
{
//buffer.CopyTo(b, 1024);
count = st.Read(b, 0, 1024);
offset = offset + count;
left = Convert.ToInt32(st.Length) - offset;
if (left <= 1024)
{
byte[] temp = new byte[left];
sent = sendSocket.Send(b);
// Thread.Sleep(10);
count = st.Read(b, 0, left);
sent = sendSocket.Send(temp);
break;
}
sent = sendSocket.Send(b);
}
IPAddress clientIp = ((System.Net.IPEndPoint)sendSocket.RemoteEndPoint).Address;
string strip = clientIp.ToString();
int index = socketIpList.IndexOf(strip);
AddVoiceToListBox("Server Send To ****" + socketNameList[index], vpath, true);
}
整完的工程下載下傳址地(源碼)
:http://download.csdn.net/detail/zhujinghao09/5313666
文章結束給大家分享下程式員的一些笑話語錄:
問:你覺得讓你女朋友(或者任何一個女的)從你和李彥宏之間選一個,你覺得她會選誰?
答:因為李豔紅這種敗類,是以我沒女友!
