使用tcp協議,鏈接服務器的方法
/// <summary> /// 連接使用tcp協議的服務端 /// </summary> /// <param name="ip">服務端的ip</param> /// <param name="port">服務端的端口號</param> /// <returns></returns> public static Socket ConnectServer(string ip, int port) { Socket s = null; try { IPAddress ipAddress = IPAddress.Parse(ip); IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port); s = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); s.Connect(ipEndPoint); if (s.Connected == false) s = null; } catch (Exception) { } return s; }
發送數據:
/// <summary> /// 向遠程主機發送數據 /// </summary> /// <param name="socket">連接到遠程主機的socket</param> /// <param name="buffer">待發送數據</param> /// <param name="outTime">發送超時時長,單位是秒(為-1時,將一直等待直到有數據需要發送)</param> /// <returns>0:發送成功;-1:超時;-2:出現錯誤;-3:出現異常</returns> public static int SendData(Socket socket, byte[] buffer, int outTime) { if (socket == null || socket.Connected == false) { throw new ArgumentException("參數socket為null,或者未連接到遠程計算機"); } if (buffer == null || buffer.Length == 0) { throw new ArgumentException("參數buffer為null ,或者長度為 0"); } int flag = 0; try { int left = buffer.Length; int sndLen = 0; int hasSend = 0; while (true) { if ((socket.Poll(outTime * 1000, SelectMode.SelectWrite) == true)) { // 收集了足夠多的傳出數據后開始發送 sndLen = socket.Send(buffer, hasSend, left, SocketFlags.None); left -= sndLen; hasSend += sndLen; // 數據已經全部發送 if (left == 0) { flag = 0; break; } else { // 數據部分已經被發送 if (sndLen > 0) { continue; } else // 發送數據發生錯誤 { flag = -2; break; } } } else // 超時退出 { flag = -1; break; } } } catch (SocketException) { //Log flag = -3; } return flag; }
發送string數據,用到方法System.Text.Encoding.Default.GetBytes對上面的方法進行封裝
/// <summary> /// 向遠程主機發送數據 /// </summary> /// <param name="socket">連接到遠程主機的socket</param> /// <param name="buffer">待發送的字符串</param> /// <param name="outTime">發送數據的超時時間,單位是秒(為-1時,將一直等待直到有數據需要發送)</param> /// <returns>0:發送數據成功;-1:超時;-2:錯誤;-3:異常</returns> public static int SendData(Socket socket, string buffer, int outTime) { if (buffer == null || buffer.Length == 0) { throw new ArgumentException("buffer為null或則長度為0."); } return SendData(socket, System.Text.Encoding.Default.GetBytes(buffer), outTime); }
接收數據:
/// <summary> /// 接收遠程主機發送的數據 /// </summary> /// <param name="socket">要接收數據且已經連接到遠程主機的</param> /// <param name="buffer">接收數據的緩沖區(需要接收的數據的長度,由 buffer 的長度決定)</param> /// <param name="outTime">接收數據的超時時間,單位秒(指定為-1時,將一直等待直到有數據需要接收)</param> /// <returns></returns> public static int RecvData(Socket socket, byte[] buffer, int outTime) { if (socket == null || socket.Connected == false) { throw new ArgumentException("socket為null,或者未連接到遠程計算機"); } if (buffer == null || buffer.Length == 0) { throw new ArgumentException("buffer為null ,或者長度為 0"); } buffer.Initialize(); int left = buffer.Length; int curRcv = 0; int hasRecv=0; int flag = 0; try { while (true) { if (socket.Poll(outTime * 1000, SelectMode.SelectRead) == true) { // 已經有數據等待接收 curRcv = socket.Receive(buffer, hasRecv, left, SocketFlags.None); left -= curRcv; hasRecv += curRcv; // 數據已經全部接收 if (left == 0) { flag = 0; break; } else { // 數據已經部分接收 if (curRcv > 0) { continue; } else // 出現錯誤 { flag = -2; break; } } } else // 超時退出 { flag = -1; break; } } } catch (SocketException) { //Log flag = -3; } return flag; }
原文地址:http://blog.csdn.net/love__coder/article/details/6649688