最近研究文件接收,稍微总结一下,以后继承补充:
: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
文章结束给大家分享下程序员的一些笑话语录: 问:你觉得让你女朋友(或者任何一个女的)从你和李彦宏之间选一个,你觉得她会选谁?
答:因为李艳红这种败类,所以我没女友!