上一篇文章我们使用原生的socket分别实现了服务器和客户端,

本篇文章使用SuperSocket来开发实现服务器,

之前也介绍了SuperSocket是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架。你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作,但是你却可以使用 SuperSocket 很容易的开发出一款 Socket 服务器端软件,例如游戏服务器,GPS 服务器, 工业控制服务和数据采集服务器等等。

接下来开始我们的开发,首先我们需要安装SuperSocket相关程序包,我们新建一个项目开发SuperSocket服务器

然后打开NuGet程序包管理器,搜索SuperSocket ,下载安装SuperSocket和SuperSocket.Engine

下载安装完毕后,我们的项目中会自动引用了SuperSocke和log4net 相关程序集和配置文件

进入正题上代码,我们这里只用SuperSocket做服务器端,客户端使用SocketTool做测试

SocketTool

链接:https://pan.baidu.com/s/1ykEofUIZKE2yhe3mMyRbJw
提取码:m2nk

SuperSocket实现服务器:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using SuperSocket;
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol; namespace SuperSocket
{
public partial class SuperSocketServer : Form
{
public SuperSocketServer()
{
InitializeComponent();
} private void SuperSocketServer_Load(object sender, EventArgs e)
{
//txt_ip.Text = "127.0.0.1";
txt_port.Text = "";
} //AppServer 代表了监听客户端连接,承载TCP连接的服务器实例。理想情况下,我们可以通过AppServer实例获取任何你想要的客户端连接,服务器级别的操作和逻辑应该定义在此类之中。
AppServer appServer;
//缓冲字节数组
byte[] buffer = new byte[]; string ipAddress_Connect;
string ipAddress_Close;
string ipAddress_Receive; //存储session和对应ip端口号的泛型集合
Dictionary<string, AppSession> sessionList = new Dictionary<string, AppSession>(); enum OperateType
{ Add = , //添加
Remove = //移除
} /// <summary>
/// 开启服务
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_StartListen_Click(object sender, EventArgs e)
{
appServer = new AppServer();
if (!appServer.Setup(int.Parse(txt_port.Text)))
{
SetMessage("Failed to Setup");
return;
}
if (!appServer.Start())
{
SetMessage("Failed to Start");
return;
}
else
{
SetMessage("开启监听");
}
//SuperSocket自定义了三个事件 ,连接事件,接收事件,关闭事件
appServer.NewSessionConnected += appServer_NewSessionConnected;
appServer.NewRequestReceived += appServer_NewRequestReceived;
appServer.SessionClosed += appServer_SessionClosed;
} /// <summary>
/// 接收连接
/// </summary>
/// <param name="session"></param>
void appServer_NewSessionConnected(AppSession session)
{
//有新连接的时候,添加记录 session.LocalEndPoint属性获取当前session的ip和端口号
//AppSession 代表一个和客户端的逻辑连接,基于连接的操作应该定于在该类之中。你可以用该类的实例发送数据到客户端,接收客户端发送的数据或者关闭连接。 //获取远程客户端的ip端口号
ipAddress_Connect = session.RemoteEndPoint.ToString();
ComboboxHandle(ipAddress_Connect, OperateType.Add);
sessionList.Add(ipAddress_Connect, session);
SetMessage(ipAddress_Connect + "已连接!");
} /// <summary>
/// 接收数据
/// </summary>
/// <param name="session"></param>
/// <param name="requestInfo"></param>
void appServer_NewRequestReceived(AppSession session, StringRequestInfo requestInfo)
{
//requestInfo.Key 是请求的命令行用空格分隔开的第一部分
//requestInfo.Parameters 是用空格分隔开的其余部分
//requestInfo.Body 是出了请求头之外的所有内容
ipAddress_Receive = session.RemoteEndPoint.ToString();
SetMessage("收到" + ipAddress_Receive + "数据: "+requestInfo.Key +" "+ requestInfo.Body);
} /// <summary>
/// 关闭连接
/// </summary>
/// <param name="session"></param>
/// <param name="value"></param>
void appServer_SessionClosed(AppSession session, SocketBase.CloseReason value)
{
ipAddress_Close = session.RemoteEndPoint.ToString();
ComboboxHandle(ipAddress_Close, OperateType.Remove);
sessionList.Remove(ipAddress_Close);
SetMessage(ipAddress_Close + "已关闭连接!");
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_send_Click(object sender, EventArgs e)
{
//从客户端列获取想要发送数据的客户端的ip和端口号,然后从sessionList中获取对应session然后调用send()发送数据
if (cmb_socketlist.Items.Count != )
{
if (cmb_socketlist.SelectedItem == null)
{
MessageBox.Show("请选择一个客户端发送数据!");
return;
}
else
{
sessionList[cmb_socketlist.SelectedItem.ToString()].Send(txt_send.Text);
}
}
else
{
SetMessage("当前没有正在连接的客户端!");
}
txt_send.Clear();
} /// <summary>
/// 添加信息
/// </summary>
/// <param name="str"></param>
private void SetMessage(string str)
{
richTextBox1.Invoke(new Action(() => { richTextBox1.AppendText(str + "\r\n"); }));
} /// <summary>
/// combobox操作
/// </summary>
/// <param name="ipAddress"></param>
/// <param name="operateType">add 添加项/remove 移除项</param>
private void ComboboxHandle(string ipAddress, OperateType operateType)
{
if (operateType == OperateType.Add)
{
cmb_socketlist.Invoke(new Action(() => { cmb_socketlist.Items.Add(ipAddress); }));
}
if (operateType == OperateType.Remove)
{
cmb_socketlist.Invoke(new Action(() => { cmb_socketlist.Items.Remove(ipAddress); }));
}
} }
}

先挂上官方说明文档 http://docs.supersocket.net/v1-6/zh-CN

这里说明几点:

  (1)这里appServer_NewRequestReceived(AppSession session, StringRequestInfo requestInfo)方法中的StringRequestInfo
是包含请求信息的,

  requestInfo.Key 是请求的命令行用空格分隔开的第一部分

  requestInfo.Parameters 是用空格分隔开的其余部分,用空格分割开的字符串数组

  requestInfo.Body 是出了请求头之外的所有内容,是一个字符串

  (2)这里requestInfo是客户端发送过来 严格按照 请求头 请求参数 请求参数 请求参数 \r\n 的格式发送, 空格隔开的第一部分是请求头,后边用空格分割后组成的数据就是请求参数

而且必须是以回车换行结尾 SuperSocket才能正确接收;

  (3)这里请求头和请求参数用什么分割是可以自定义;我们可以自定义AppServer类,继承APPServer类,然后使用下面的代码扩展命令行协议

  比如用":"分割请求头和请求参数,用","分隔请求参数.

 public class YourServer : AppServer<YourSession>
{
public YourServer()
: base(new CommandLineReceiveFilterFactory(Encoding.Default, new BasicRequestInfoParser(":", ",")))
{ }
}

接下来我们开始测试,还是默认使用3333端口,开启监听,我们依旧是使用SocketTool工具创建三个客户端,一起访问服务器

服务器:

客户端

接下来三个客户端分别以"9100"为请求头,test为请求体给服务器发送数据,记住客户端发送数据一定以回车换行为结尾

客户端:

服务器:

接下里测试服务器给客户端,这里以服务器给端口为1083的客户端发送数据"aaaa"

从客户端列选择端口号为1083的客户端,在textbox输入aaaa 发送数据

服务器

客户端

接下里客户端关闭连接

服务器

到此,SuperSocket实现的服务器测试完美收官,其实SuperSocket的功能远不止于此,我也只是刚开始使用

待后续研究官方文档后什么新的发现在更新,告辞!

感谢客观阅读,拜谢(抱拳~)

两篇文章的源码

本来想上传GitHub的,毕竟这样显得专业一点,奈何初来乍到的,实在操作不了(留下了不懂英文的泪水),还是放云盘吧!

链接:https://pan.baidu.com/s/1zjCvkP2Ne9U3KR8vyBKhFw
提取码:gee7

c#Socket服务器与客户端的开发(2)的更多相关文章

  1. c#Socket服务器与客户端的开发(1)

    上个项目中用到了Socket通讯,项目中直接借助SuperSocket实现,但是我觉得这毕竟是一个我没接触过的东西,所以也顺便学习了一下原生socket的使用,做了一个socket服务器与客户端的开发 ...

  2. Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)

    Ajax跨域问题及解决方案   目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...

  3. 异步Socket服务器与客户端

      本文灵感来自Andre Azevedo 在CodeProject上面的一片文章,An Asynchronous Socket Server and Client,讲的是异步的Socket通信. S ...

  4. 一个 Java 的 Socket 服务器和客户端通信的例子

    一个 HelloWord 级别的 Java Socket 通信的例子.通讯过程: 先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求.然后运行 Client 端,客户端发出连接请 ...

  5. 最简单的socket服务器与客户端

    服务器: //服务器 #include <stdio.h> #include <netinet/in.h> #include <unistd.h> #include ...

  6. Socket 服务器和客户端通信

    //服务器端package com.svse.service; import java.io.BufferedReader; import java.io.IOException; import ja ...

  7. python简单的socket 服务器和客户端

    服务器端代码 if "__main__" == __name__: try: sock = socket.socket(socket.AF_INET, socket.SOCK_ST ...

  8. 利用ScktSrvr打造多功能Socket服务器

    Socket服务端编程中最重要的也是最难处理的工作便是客户请求的处理和数据的接收和发送,如果每一个Socket服务器应用程序的开发都要从头到尾处理这些事情的话,人将会很累,也会浪费大量时间.试想,如果 ...

  9. socket服务器开发中的SO_REUSEADDR选项与让人心烦的TIME_WAIT

    1 发现问题 我在开发一个socket服务器程序并反复调试的时候,发现了一个让人无比心烦的情况:每次kill掉该服务器进程并重新启动的时候,都会出现bind错误:error:98,Address al ...

随机推荐

  1. 模仿天猫实战【SSM】——总结

    第一篇文章链接:模仿天猫实战[SSM版]--项目起步 第二篇文章链接:模仿天猫实战[SSM版]--后台开发 总结:项目从4-27号开始写,到今天5-7号才算真正的完工,有许多粗糙的地方,但总算完成了, ...

  2. Ocelot中文文档-缓存

    目前Ocelot使用CacheManager项目提供了一些非常基本的缓存.这是一个了不起的项目,它解决了很多缓存问题. 我会推荐这个软件包来做Ocelot缓存. 如果你看看这里的例子,你可以看到如何设 ...

  3. SOFA 源码分析 — 扩展机制

    前言 我们在之前的文章中已经稍微了解过 SOFA 的扩展机制,我们也说过,一个好的框架,必然是易于扩展的.那么 SOFA 具体是怎么实现的呢? 一起来看看. 如何使用? 看官方的 demo: 1.定义 ...

  4. DevOps之二 Maven的安装与配置

    CentOS7 安装Maven 一.安装Maven mkdir -p /usr/local/maven3wget http://mirrors.hust.edu.cn/apache/maven/mav ...

  5. eclipse 安装svn和gradle

    公司项目用的eclispe  svn和gradle 所以需要配置 SVN教程:https://blog.csdn.net/jieshaowang1229/article/details/5159499 ...

  6. laravel5.4生成验证码

    laravel5.4生成验证码   总结:本篇博客介绍使用gregwar/captcha实现验证码的具体操作步骤,以及可能遇到的问题和解决办法. 转载请注明出处!!!本文地址:http://www.c ...

  7. Fiddler抓包工具证书安装

    转自:https://www.cnblogs.com/hushaojun/p/6385947.html Fiddler证书安装(查看HTTPS) 现在很多带有比较重要信息的接口都使用了安全性更高的HT ...

  8. spring的7个模块

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. Spring ...

  9. 浅谈服务间通信【MQ在分布式系统中的使用场景】

    解决的问题 一项技术的产生必然是为了解决问题而生,了解了一项技术解决的问题,就能够很轻松的理解这项技术的设计根本,从而更好地理解与使用这项技术. 消息中间件和RPC从根本上来说都是为了解决分布式系统的 ...

  10. javascript 内存管理

    1.垃圾回收机制 在编写Javascript程序时,开发人员不用关心内存问题,内存分配及无用内存的回收完全实现了自动化管理.垃圾收集器会按照预定的时间间隔, 周期性的找出那些不再继续使用的变量,然后释 ...