Socket socketClints = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //偵聽socket //socketClints.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); socketClints.Bind(new IPEndPoint(IPAddress.Any, portSocketInt)); socketClints.Listen(100); socketClints.BeginAccept(new AsyncCallback(ClientAccepted), socketClints); //開始接收來自瀏覽器的http請求(其實是socket連接請求)
#region 客戶端連接成功 byte[] buffer = new byte[1024]; /// <summary> /// 客戶端連接成功 /// </summary> /// <param name="ar"></param> public void ClientAccepted(IAsyncResult ar) { #region var socket = ar.AsyncState as Socket; //這就是客戶端的Socket實例,我們后續可以將其保存起來 var client = socket.EndAccept(ar); //接收客戶端的消息(這個和在客戶端實現的方式是一樣的)異步 client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client); //准備接受下一個客戶端請求(異步) socket.BeginAccept(new AsyncCallback(ClientAccepted), socket); #endregion } #endregion #region 接收客戶端的信息 /// <summary> /// 接收某一個客戶端的消息 /// </summary> /// <param name="ar"></param> public void ReceiveMessage(IAsyncResult ar) { int length = 0; var socket = ar.AsyncState as Socket; //客戶端IP地址和端口信息 try { #region //方法參考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx length = socket.EndReceive(ar); //讀取出來消息內容 string recv_request = Encoding.UTF8.GetString(buffer, 0, length); //輸出接收信息 //WriteLine(clientipe + " :" + message, ConsoleColor.White); //消息處理 socketResolve(recv_request, socket); //服務器發送消息 //socket.Send(Encoding.UTF8.GetBytes("server received data")); //默認Unicode //接收下一個消息(因為這是一個遞歸的調用,所以這樣就可以一直接收消息)異步 socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket); #endregion } catch { //設置計數器 } }
//發送方法 需要修改數據
public void sendData()
{
byte[] data=System.Text.Encoding.UTF8.GetBytes(Encrypt(txt,sKey));
byte[] byLen = BitConverter.GetBytes(data.Length);
socket.Send(byLen);
//socket.Send();
socket.Send(data);
}
#endregion
客戶端:
ThStartBool=true;
newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); while (ThStartBool) { try { newSocket.Connect(ip, int.Parse(port)); socketSend("url/" + obj.ToString() + "_OK/"); Invoke(updateLableText, "連接成功"); //ReceiveObject state = new ReceiveObject() { Client = newSocket }; //newSocket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, new AsyncCallback(ReadCallback), state); newSocket.BeginReceive(m_byLen, 0, m_byLen.Length, SocketFlags.None, new AsyncCallback(RecvLen), newSocket); ThStartBool = false; } catch (Exception) { Thread.Sleep(3000);//3秒后重新連接 } }
int m_nIndex = 0, m_nRecvLen = 0;
byte[] m_byLen = new byte[4];
byte[] m_byData = null;
private void RecvLen(IAsyncResult ar)
{
try
{
Socket sock = ar.AsyncState as Socket;
int nLen = sock.EndReceive(ar);
m_nRecvLen += nLen;
if (m_nRecvLen != m_byLen.Length)
{
m_nIndex += nLen;
sock.BeginReceive(m_byLen, m_nIndex, m_byLen.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvLen), sock);
}
else
{
m_nIndex = m_nRecvLen = 0;
m_byData = new byte[BitConverter.ToUInt32(m_byLen, 0)];
sock.BeginReceive(m_byData, m_nIndex, m_byData.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvData), sock);
}
}
catch (Exception ex)
{
Invoke(updateLableText, "與服務器失去聯系,正在嘗試重連");
ThStartBool = true;
th = new Thread(new ParameterizedThreadStart(ThStartData));
th.Start(signID);
}
}
private void RecvData(IAsyncResult ar)
{
Socket sock = ar.AsyncState as Socket;
int nLen = sock.EndReceive(ar);
m_nRecvLen += nLen;
if (m_nRecvLen != m_byData.Length)
{
m_nIndex += nLen;
sock.BeginReceive(m_byData, m_nIndex, m_byData.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvData), sock);
}
else
{
m_nIndex = m_nRecvLen = 0;
//MessageBox.Show(Encoding.UTF8.GetString(m_byData));
string sKey = signID.Substring(2, 3) + signID.Substring(5, 3) + signID.Substring(10, 2);
//讀取出來消息內容
var message = Encoding.UTF8.GetString(m_byData);
dataParsing(Decrypt(message.ToString(), sKey));
sock.BeginReceive(m_byLen, m_nIndex, m_byLen.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvLen), sock);
}
}