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

C# Socket 通信的更多相关文章

  1. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  2. php简单实现socket通信

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  3. Socket通信类

    package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...

  4. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  5. socket通信

    socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...

  6. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...

  7. .NET开源高性能Socket通信中间件Helios介绍及演示

    一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...

  8. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  9. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  10. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

随机推荐

  1. JZOJ 4308.长寿花

    题面 思路 这种题当然要 \(dp\) 啦 设 \(g_{i,j}\) 表示前 \(i\) 个位置用指定的 \(j\) 种颜色装饰(即用颜色 \(1..j\) 来装饰) 那么 \(g_{i,j}=g_ ...

  2. P8421 [THUPC2022 决赛] rsraogps

    \(\text{Solution}\) 肯定扫描线在考虑维护什么东西,假设 \(r\) 右移时可以暴力得到所有新值,发现需要维护区间历史版本和以及区间当前值之和 这三个操作对于一个数来说变化次数都是 ...

  3. Postgresql动态共享内存类型

    一.简介 linux为多个进程通信提供了不同的IPC机制,如:System V , POSIX 和 MMAP,所以Postgresql共享内存管理也支持以上类型. 在Postgresql中可以使用dy ...

  4. SpringMVC基础源码分析(一)

    实现Controller的三种方式分析 每种实现的方式对应的HanderAdapter都不同. 实现Controller接口 该接口对应的HanderAdapter为SimpleControllerH ...

  5. 普冉PY32系列(六) 通过I2C接口驱动PCF8574扩展的1602LCD

    目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...

  6. 个人常用的git提交代码流程

    # 增加⼀一个新的远程仓库,并命名git remote add [shortname] [url] # 新建一个本地目录,将其初始化为 Git 代码库$ git init [project-name] ...

  7. 概率生成函数(PGF)简记

    基本搬运自<浅谈生成函数在掷骰子问题上的应用>. 对于定义在非负整数上的离散随机变量 \(X\),级数 \(F(z) = \sum\limits_{i\ge 0} \operatornam ...

  8. 自我生啃 AMBA AXI 总线笔记

    视频1:https://www.youtube.com/watch?v=1zw1HBsjDH8&list=PLkqJVNOiuuHtNrVaNK4O1BSgczja4obeW (What is ...

  9. 微信小程序(开发某些方式)

    1.开发工具:微信小程序开发工具(需要appid登录)2.调试:可使用微信开发者工具预览(用真机测试)3.真机调试:微信开发者工具真机调试(可打印以及查看网络等)4.扫一扫功能:   1.小程序里面可 ...

  10. 看图王 10.9.1.9791 With X64 去广告绿色版

    修改历史:2022.12.14:自改官方 10.9.1.9791 最新正式版本2022.06.18:首个自改官方 10.9.0.9760 修改内容:美化部分关联图标:基于官方最新版本制作,精简部分非必 ...