思路

搭建服务器主要为了接收客户端所传来的数据,在学习过程中,整体的搭建逻辑大体分为以下几个步骤:

1.启动线程监听服务端口

2.监听客户端链接并进行处理

3.接收客户端传入的消息

4.向客户端回传(数据的压缩、加密等处理)

5.传输的复杂数据中传输协议的应用

我觉的其中的难点在于如何处理传入的二进制字符,将逻辑处理分配给相关的处理函数

程序分为服务端和客户端,接收和传递规则要对应,否则无法正确解析数据,这里主要介绍服务端的搭建,客户端只要以相关的规则发送、解析数据即可。

代码


创建c#控制台应用程序,在Program.cs文件中,启动socket服务添加端口监视

       //定义监听的服务器IP及端口
        public static string ServerIP = "127.0.0.1";
        ;

        private static Socket ServerSocket;

        static void Main(string[] args)
        {
            //定义socket tcp传输规范
            ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //绑定IP及端口
            ServerSocket.Bind(new IPEndPoint(IPAddress.Parse(ServerIP), port));
            //开始监听 并设置连接数
            ServerSocket.Listen();
            //控制台输出服务器启动成功
             Console.WriteLine("       -----ChatServer {0}:{1} start-----              ", ServerIP, port);
            //创建线程监听链接
            Thread mThread = new Thread(ListenCallBack);
            //开启线程
            mThread.Start();
        }

监听客户端链接,并进行处理,上一步骤中ListenCallBack方法为开启线程执行的服务端方法,该方法使用while循环 一直运行着,用来处理客户端的链接。Sleep函数为让服务端的循环休息一会,以免代码跑的太快逻辑跟不上。

private static void ListenCallBack(object obj)
        {
            while (true)
            {
                Thread.Sleep();

                //客户端socket
                Socket socket = ServerSocket.Accept();
                Client client = new Client();

                //每个客户端访问创建一个新的客户端实例
                ClientSocket clientSocket = new ClientSocket(socket, client);
                client.ClientSocket = clientSocket;

                Console.WriteLine("服务端收到一次访问...");
            }
        }
 public class Client
    {
        private ClientSocket client_Socket;

        public ClientSocket Client_Socket
        {
            get { return client_Socket; }
            set { client_Socket = value; }
        }
    }
   public class ClientSocket
    {
        public ClientSocket(Socket socket, Client client)
        {
          Console.WriteLine("一个用户访问了服务器");
        }
}

现在搭建起了一个简单的服务端,可以进行访问,但却不能接收消息。其中ClientSocket中传入的socket参数,代表的是当前的客户端socket,访问方的信息多半都在里面,数据传输与接收也是通过这个对象来完成的。

处理接收数据

数据通过二进制传递过来以后 使用byte[]进行接收。数据的接收,我们还是要在ClientSocket中进行添加,因为客户端的所有信息包括我们向客户端的传输操作,都在socket对象中。

 socket.BeginReceive(接收到的数组, , 接收到的数组的长度, SocketFlags.None, 接收回调函数, socket);//异步接收客户端socket数据
socket.BeginSend(发送的数组, , 发送的数组长度, SocketFlags.None, 发送回调函数, socket);//向客户端socket发送数据

其中,发送的数组为了数据安全,应该是经过一系列的加密算法后的结果,而前端传递过来的数组,也应该是加密后,然后以相应的顺序解析为我们所需要的协议类型。

c#搭建服务端 准备工作(1)的更多相关文章

  1. CAS 5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明

    CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端 CAS5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明 CAS5.1.x ...

  2. CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端

    CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端 CAS5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明 CAS5.1.x ...

  3. 使用Apache MINA框架搭建服务端

    使用MINA框架搭建服务端步骤: 1.定义一个启动服务的类MinaServer,并实现接口ServletContextListener 2.定义一个处理业务逻辑的类MinaServerHandler, ...

  4. 用“MEAN”技术栈开发web应用(二)express搭建服务端框架

    上一篇我们讲了如何使用angular搭建起项目的前端框架,前端抽象出一个service层来向后端发送请求,后端则返回相应的json数据.本篇我们来介绍一下,如何在nodejs环境下利用express来 ...

  5. 在 Windows Server 上搭建 *** 服务端(转载加亲测)

    转载自:https://diveng.io/build-shadowsocks-server-on-windows-server.html 下面的教程建议大家使用第一种方法安装,说是比较简单.我则使用 ...

  6. Netty搭建服务端的简单应用

    Netty简介 Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客 ...

  7. c# 搭建服务端 byte[] 处理(3)

    数据的传输中,为防止数据传输过程中被获取解析 造成数据的不安全,一般都会采取各类的方式对数据进行加密.压缩等操作,在客户端或服务端以相同的算法解析即可获得数据,一定程度上减小了数据在中间过程被获取数据 ...

  8. c# 搭建服务端 传输协议(2)

    在网络的数据传输中,要将需要传输的数据转换为二进制数据后传输,才能被服务端正常的接收,socket传输中,接收到的数据都会被放入byte[]中存放,所以在数据发送前,对二进制的数组进行有规律的排序,才 ...

  9. Swift搭建服务端

    原文:Hello Server Side Swift 作者:Logan Wright 译者:CocoaChina--kmyhy(博客) 自从苹果官方发布了一个 Swift 的 Linux 开源版本之后 ...

随机推荐

  1. python成长之路第一篇(5)文件的基本操作

    一.三元运算 我们在上章学习的if,,else,,有一种简便的方法 他的表达式是这样的:变量 = 值1 if 条件 else 值2 解释过来就是如果aaa等于sss则输出值1否则输出值2 二.类的概念 ...

  2. EditPlus3.3 集成 SVN

    今天在玩EditPlus的时候,由于自己想上传文件至SVN,本机已经安装了TSVN,听说近期EditPlus支持了SVN操作,于是自己便带着好奇的心试试了.     已有的环境: EditPlus 3 ...

  3. C++临时对象销毁时间

    下面这段代码会输出什么? const char* p = string("hello temprary string").c_str(); cout << p; 下面这 ...

  4. 取PE文件的引入表和导出表

    直接上代码(这里列出C++和Delphi的代码),Delphi代码中包含导入及导出文件和函数列表,PE结构可参阅资料,很多很详细,需要注意的是,本例中是映射到内存,不是通过PE装载器装入的,所以对于节 ...

  5. js计算时间差,包括计算,天,时,分,秒

    收集两个计算时间差的计算方法代码片段: var date1=new Date(); //开始时间 var date2=new Date(); //结束时间 var date3=date2.getTim ...

  6. iOS使用sqlite3原生语法进行增删改查以及FMDB的使用

    首先要导入libsqlite3.dylib并且加入头文件#import <sqlite3.h>,在进行增删改查之前还要先把数据库搞进去. 一种方法是从外面拷贝到程序里:http://www ...

  7. CSS3 border属性的妙用

    .ribbon { background: #45c9c8; position: absolute; width: 75px; height: 25px; line-height: 25px; top ...

  8. Linux命令之ifconfig

    许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).通常需 ...

  9. 查看mysql字符集及修改表结构

    MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令.包括查看 MySQL 数据库服务器字符集.查看 MySQL 数据库字符集,以及数据表和字段的 ...

  10. OC语法8——@class关键字

    @class关键字: 在当前类中若要引用其他类的对象作成员变量(Book  *book),我们以前采用的方式是 #import "Book.h" 但 #import "B ...