这篇文章主要介绍了C#使用Socket实现心跳的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Server端代码:
class Program
{
static SocketListener listener;
public static void Main(string[] args)
{
//实例化Timer类,设置间隔时间为5000毫秒;
System.Timers.Timer t = new System.Timers.Timer(5000);
t.Elapsed += new System.Timers.ElapsedEventHandler(CheckListen);
//到达时间的时候执行事件;
t.AutoReset = true;
t.Start();
listener = new SocketListener();
listener.ReceiveTextEvent += new SocketListener.ReceiveTextHandler(ShowText);
listener.StartListen();
Console.ReadKey();
}
private static void ShowText(string text)
{
Console.WriteLine(text);
}
private static void CheckListen(object sender, System.Timers.ElapsedEventArgs e)
{
if (listener != null && listener.Connection != null)
{
Console.WriteLine("连接数:" + listener.Connection.Count.ToString());
}
}
}
public class Connection
{
Socket _connection;
public Connection(Socket socket)
{
_connection = socket;
}
public void WaitForSendData(object connection)
{
try
{
while (true)
{
byte[] bytes = new byte[1024];
string data = "";
//等待接收消息
int bytesRec = this._connection.Receive(bytes);
if (bytesRec == 0)
{
// ReceiveText("客户端[" + _connection.RemoteEndPoint.ToString() + "]连接关闭...");
break;
}
data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
ReceiveText("收到消息:" + data);
string sendStr = "服务端已经收到信息!";
byte[] bs = Encoding.UTF8.GetBytes(sendStr);
_connection.Send(bs, bs.Length, 0);
}
}
catch (Exception)
{
ReceiveText("客户端[" + _connection.RemoteEndPoint.ToString() + "]连接已断开...");
Hashtable hConnection = connection as Hashtable;
if (hConnection.Contains(_connection.RemoteEndPoint.ToString()))
{
hConnection.Remove(_connection.RemoteEndPoint.ToString());
}
}
}
public delegate void ReceiveTextHandler(string text);
public event ReceiveTextHandler ReceiveTextEvent;
private void ReceiveText(string text)
{
if (ReceiveTextEvent != null)
{
ReceiveTextEvent(text);
}
}
}
public class SocketListener
{
public Hashtable Connection = new Hashtable();
public void StartListen()
{
Agine:
try
{
//端口号、IP地址
//int port = 8889;
//string host = "127.0.0.1";
//IPAddress ip = IPAddress.Parse(host);
//IPEndPoint ipe = new IPEndPoint(ip, port);
string ip = string.Empty;
System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
for (int i = 0; i != IpEntry.AddressList.Length; i++)
{
if (!IpEntry.AddressList[i].IsIPv6LinkLocal)
{
ip = IpEntry.AddressList[i].ToString();
}
}
IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), 6000);
//创建一个Socket类
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Bind(ipend);//绑定2000端口
s.Listen(0);//开始监听
ReceiveText("启动Socket监听...");
while (true)
{
Socket connectionSocket = s.Accept();//为新建连接创建新的Socket
ReceiveText("客户端[" + connectionSocket.RemoteEndPoint.ToString() + "]连接已建立...");
Connection gpsCn = new Connection(connectionSocket);
gpsCn.ReceiveTextEvent += new Connection.ReceiveTextHandler(ReceiveText);
Connection.Add(connectionSocket.RemoteEndPoint.ToString(), gpsCn);
//在新线程中启动新的socket连接,每个socket等待,并保持连接
Thread thread = new Thread(gpsCn.WaitForSendData);
thread.Name = connectionSocket.RemoteEndPoint.ToString();
thread.Start(Connection);
}
}
catch (ArgumentNullException ex1)
{
ReceiveText("ArgumentNullException:" + ex1);
}
catch (SocketException ex2)
{
ReceiveText("SocketException:" + ex2);
}
goto Agine;
}
public delegate void ReceiveTextHandler(string text);
public event ReceiveTextHandler ReceiveTextEvent;
private void ReceiveText(string text)
{
if (ReceiveTextEvent != null)
{
ReceiveTextEvent(text);
}
}
}
Client端代码:
class Program
{
static void Main(string[] args)
{
Socket c;
//int port = 4029;
// 避免使用127.0.0.1,我在本机测试是不能运行的
//string host = "127.0.0.1";
//IPAddress ip = IPAddress.Parse(host);
//IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
string ip = string.Empty;
System.Net.IPHostEntry IpEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
for (int i = 0; i != IpEntry.AddressList.Length; i++)
{
if (!IpEntry.AddressList[i].IsIPv6LinkLocal)
{
ip = IpEntry.AddressList[i].ToString();
}
}
IPEndPoint ipend = new IPEndPoint(IPAddress.Parse(ip), 6000);
c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
try
{
c.Connect(ipend);//连接到服务器
Console.WriteLine("连接到Socket服务端...");
Console.WriteLine("发送消息到服务端...");
string sendStr = "m s g";
byte[] bs = Encoding.UTF8.GetBytes(sendStr);
c.Send(bs, bs.Length, 0);
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes);
Console.WriteLine("服务器返回信息:" + recvStr);
}
catch (ArgumentNullException ex1)
{
Console.WriteLine("ArgumentNullException:{0}", ex1);
}
catch (SocketException ex2)
{
Console.WriteLine("SocketException:{0}", ex2);
}
Console.ReadKey();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持得得之家。
沃梦达教程
本文标题为:C#使用Socket实现心跳的方法示例
基础教程推荐
猜你喜欢
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- ZooKeeper的安装及部署教程 2023-01-22
- 一个读写csv文件的C#类 2022-11-06
- C# windows语音识别与朗读实例 2023-04-27
- C#控制台实现飞行棋小游戏 2023-04-22
- C#类和结构详解 2023-05-30
- C# 调用WebService的方法 2023-03-09
- unity实现动态排行榜 2023-04-27
- winform把Office转成PDF文件 2023-06-14
- C# List实现行转列的通用方案 2022-11-02