C# Socket 通信
2024-10-21 11:51:21
C# Socket通信
Socket通信主要分为两部分,服务端和客户端,其中服务端和客户端都具有接收消息和发送消息的功能,具体通信流程就是服务端先去监听一个端口号,等待客户端的连接,客户端通过指定IP和端口号去连接服务端,最终实现相互通信。具体代码如下:
服务端
首先对端口进行监听
/// <summary>
/// 监听端口
/// </summary>
/// <param name="port">端口号</param>
public void Listen(int port)
{
Log_txt.AppendText("正在监听端口" + port + "\r\n");
Task.Run(() =>//开启新线程用于监听端口
{
try
{
IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Any, port);
Socket socketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketListener.Bind(iPEndPoint);//绑定端口号
socketListener.Listen(1000);//设置最大监听数
while (IsListening)//bool类型 表示是否监听
{
try
{
Socket socketAccepter = socketListener.Accept();//负责监听的socket
hashtable.Add(port, socketAccepter);//hashtable用于存储端口以及对应的socket对象 便于后续通信使用
Log_txt.AppendText(socketAccepter.RemoteEndPoint + "连接成功!\r\n");
Task.Run(() => { Recive(socketAccepter); });//开启新线程用于接收消息
}
catch (Exception x)
{
}
}
}
catch (Exception e)
{ }
});
}
完成监听后,就需要有一个方法来接收消息
/// <summary>
/// 接收消息
/// </summary>
/// <param name="socketAccepter">接收消息</param>
public void Recive(Socket socketAccepter)
{
while (IsAccepting)//bool类型 表示是否接收消息
{
try
{
byte[] buffer = new byte[1024 * 1024 * 10];//用于接收数据
int i = socketAccepter.Receive(buffer);//接收到的字节数
string msg = Encoding.UTF8.GetString(buffer, 0, i);//以UTF-8编码格式转换成字符串
LogInfo(2, socketAccepter.RemoteEndPoint + "收到消息:" + msg);//显示日志
}
catch (Exception e)
{ }
}
}
Socket通信,当然不能只有接收消息,还需要一个发送消息的方法,具体代码如下
/// <summary>
/// 发送消息
/// </summary>
/// <param name="socketAccepter">负责通信的socket</param>
/// <param name="Msg">要发送的消息</param>
public void SendMsg(Socket socketAccepter,string Msg)
{
if (!string.IsNullOrEmpty(Msg.Trim()) && socketAccepter != null)
{
byte[] buffer = Encoding.UTF8.GetBytes(Msg);
socketAccepter.Send(buffer);
LogInfo(1, "发送消息:" + Msg);
}
}
这样就完成了服务端的监听、接收和发送功能。还有一个显示日志方法 ,这里只是一个简单的显示到窗体日志框中,并没有写入日志文件,有需求的可以去看看Log4的使用方法。方法如下:
/// <summary>
/// 显示日志
/// </summary>
/// <param name="level">日志等级</param>
/// <param name="LogText">日志内容</param>
public void LogInfo(int level,string LogText)
{
switch (level)//根据日志等级呈现不同样式的消息
{
case 1://发送消息
Log_txt.SelectionColor = Color.Red;
break;
case 2://接收消息
Log_txt.SelectionColor = Color.Green;
break;
default:
Log_txt.SelectionColor = Color.Yellow;
break;
}
Log_txt.AppendText(LogText + "\r\n");
}
客户端
Socket 客户端的实现就是通过一个Socket对象去访问指定IP和端口号,代码如下:
public void Connect(string ip,int port)
{
IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);
Socket ConnectSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ConnectSocket .Connect(iPEndPoint);//连接服务端
Task.Run(() =>
{
Recive(ConnectSocket );//开启新线程用于接收消息
});
}
由于我是写在一个Form窗体中的,所以接收和发送方法是一样的,如果想分开可以分别写接收和发送方法。下面是类中的一些字段 供参考
Hashtable hashtable = new Hashtable();//用于存储端口以及对应的Socket对象
bool IsListening;//是否监听
bool IsAccepting;//是否接收消息
Encoding Encoding = Encoding.Default;//编码格式
这样一个简单的Socket通信就完成了,关于Socket通信如果你有疑惑或者更好的建议也欢迎一起讨论学习。
最新文章
- mysql的缓冲查询和非缓冲查询
- Session和Cache的区别
- 9月15日,YTFCloud,创业圈的技术新宠
- # HTML &;&; CSS 学习笔记
- js冒泡事件示例
- 将rcc.exe添加到系统Path
- Js 中常用方法
- OC—Setter、Getter
- String、StringBuffer、StringBuilder比较
- 201521123006 《Java程序设计》 第2周学习总结
- Spring Boot 学习之项目构建
- Java数据库 高级查询
- python 单向链表实现
- 分享收集的WebGL 3D学习资源
- tensorflow中命名空间、变量命名的问题
- 牛客网NOIP赛前集训营-提高组(第四场)游记
- 【BZOJ5252】林克卡特树(动态规划,凸优化)
- collection 和 collections
- mysql命令用法复习笔记
- 笔试题之xml