思路

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

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. 指定端口号,多线程扫描局域网内IP地址

    小白第一次发博客,请各路大神不要喷,有错的地方还请不吝啬指教,谢谢....... 因为注释基本上已经说清楚啦,在这里就不多说什么啦,知识不够怕误人子弟 # -*- coding:utf-8 -*-im ...

  2. PBM文件格式

    PBM是一种单色位图文件,常用于打印机,由于需要下面对PBM文件格式进行分析. 每个文件的开头两个字节(ASCII码)作为文件描述子,可以理解为文件头.具体如下: 头 类型 编码 P1 位图 ASCI ...

  3. shell script 零碎知识

    1.test命令的测试功能 -e  文件名是否存在 -f  文件名是否存在且为文件 -d  文件名是否存在且为目录 范例1    检查/dmtsai是否存在,存在输出 exist  不存在输出 Not ...

  4. SQL Server带游标的SQL

    DECLARE test_cursor CURSOR FOR SELECT ID FROM dbo.T_BD_Restaurant WHERE id <> '0AAB2E55-79F8-4 ...

  5. 图片和提交servlet的相对和绝对路径

    xx.jsp在根目录下,图片的路径为:<img height="33" src="images/enter.gif" width="148&qu ...

  6. Codeforces 235E

    Codeforces 235E 原题 题目描述:设\(d(n)\)表示\(n\)的因子个数, 给定\(a, b, c\), 求: \[\sum_{i=1}^{a} \sum_{j=1}^{b} \su ...

  7. hdu 4740

    题目链接 老虎左拐,老鼠右拐,碰到不能走的拐一次,如果还不能走就停下,自己走过的不能走,求相遇的坐标或-1 一个停下之后,另一个还可以走 #include <cstdio> #includ ...

  8. Redis事务和分布式锁

    Redis事务 Redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行.Redis事务的实现需要用到 MUL ...

  9. auto_ptr 要点解析

    今天看了auto_ptr类的用法,又仔细看了看C++标准库中的符合标准的auto_ptr类别的实作,觉得自己基本上理解了auto_ptr的原理,下面就我的心得写几句,有不正确的地方,希望多多指教. 1 ...

  10. MediaController

    前言 本章内容是android.widget.MediaController,版本为Android 2.3 r1,翻译来自"唐明",再次感谢"唐明" !期待你一 ...