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通信如果你有疑惑或者更好的建议也欢迎一起讨论学习。

最新文章

  1. mysql的缓冲查询和非缓冲查询
  2. Session和Cache的区别
  3. 9月15日,YTFCloud,创业圈的技术新宠
  4. # HTML &amp;&amp; CSS 学习笔记
  5. js冒泡事件示例
  6. 将rcc.exe添加到系统Path
  7. Js 中常用方法
  8. OC—Setter、Getter
  9. String、StringBuffer、StringBuilder比较
  10. 201521123006 《Java程序设计》 第2周学习总结
  11. Spring Boot 学习之项目构建
  12. Java数据库 高级查询
  13. python 单向链表实现
  14. 分享收集的WebGL 3D学习资源
  15. tensorflow中命名空间、变量命名的问题
  16. 牛客网NOIP赛前集训营-提高组(第四场)游记
  17. 【BZOJ5252】林克卡特树(动态规划,凸优化)
  18. collection 和 collections
  19. mysql命令用法复习笔记
  20. 笔试题之xml

热门文章

  1. 队列——queue的用法(及洛谷B3616)
  2. vulnhub靶场之DRIFTINGBLUES: 9 (FINAL)
  3. web自动化中如何使用cookie登录
  4. JZOJ 4754.矩阵
  5. 题解 P4163 [SCOI2007]排列
  6. .Net Core 配置源码学习 (一)
  7. dotnet总结
  8. LeetCode-1706 球会落在何处
  9. EF Core自动将实体映射到数据库
  10. Xilinx XPM使用说明--XPM_MEMORY_SDPRAM