C#网络编程(Socket)
哎,最近看园子中的文章,感触良多!
private static Socket sokWatch = null;//定义一个套接字
public static Dictionary<string, Connection> dicList = Connection.dicList;//保存Client的字典
private static byte[] buffer = new byte[1024 * 1024];//接收数据的缓冲区
private delegate string AddHandle(ClientModel cModel);//执行业务逻辑的委托
private void StartListen(string ip, int port, int num)
{
sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sokWatch.Bind(new IPEndPoint(IPAddress.Parse(ip), port));
sokWatch.Listen(num);
sokWatch.BeginAccept(new AsyncCallback(ClientAccepted), sokWatch);
}
private void ClientAccepted(IAsyncResult ar)
{
var socket = ar.AsyncState as Socket;
var client = socket.EndAccept(ar);
Connection conn = new Connection(client);
if (!dicList.ContainsKey(client.RemoteEndPoint.ToString()))
{
dicList.Add(client.RemoteEndPoint.ToString(), conn);
}
HeartbeatClient(client);
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
private void ReceiveMessage(IAsyncResult ar)
{
var socket = ar.AsyncState as Socket;
var length = socket.EndReceive(ar);
var message = Encoding.UTF8.GetString(buffer, 0, length);
}
//实现这个类是为了支持多Client
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Communica
{
public class Connection
{
Socket sokWatch = null;
bool isRec = true;
public static Dictionary<string, Connection> dicList = new Dictionary<string, Connection>();
public Connection(Socket soc)
{
this.sokWatch = soc;
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public string SendToClient(string msg)
{
try
{
if (sokWatch != null)
{
byte[] buffer = Encoding.UTF8.GetBytes(msg);
sokWatch.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, null, null);
return "1";
}
else
{
return "0";
}
}
catch (Exception)
{
sokWatch.Shutdown(SocketShutdown.Both);
sokWatch.Dispose();
sokWatch.Close();
return "0";
}
}
}
}
private static byte[] buffer = new byte[1024 * 1024];
private static Socket sokClient = null;
/// <summary>
/// 连接到指定Server
/// </summary>
/// <param name="IP"></param>
/// <param name="Port"></param>
private void StartConnectionServer(string IP, int Port)
{
sokClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sokClient.Connect(new IPEndPoint(IPAddress.Parse(IP), Port));
sokClient.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), sokClient);
}
private void ReceiveMessage(IAsyncResult ar)
{
var socket = ar.AsyncState as Socket;
var length = socket.EndReceive(ar);
var message = Encoding.UTF8.GetString(buffer, 0, length);
//递归
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="msg"></param>
private void SendToServer(string msg)
{
if (sokClient != null && !string.IsNullOrEmpty(msg))
{
byte[] buffStr = Encoding.UTF8.GetBytes(msg);
sokClient.BeginSend(buffStr, 0, buffStr.Length, SocketFlags.None, null, null);
}
}
posted @ 2012-01-05 09:11 九五二七 阅读(41) 评论(0) 编辑
