zoukankan      html  css  js  c++  java
  • 在C#中初遇Socket

    后期项目实战:多人在线聊天室

    源码位置:https://git.oschina.net/z13qu/BlogProjects

    课前须知

    1. 这里不讲解Socket和TCP/IP的底层知识
      对于初学者来说底层原理枯燥难懂,越讲越懵逼,等大家成为大神,需要深层掌握协议时,再去了解也不迟
    2. TCP/IP:传输控制协议/因特网互联协议
      初学者不要太纠结这个东西,协议也可以理解为约定,就是大家都遵守的一种东西。
      比如开车要靠右,就是让道路变得有条有序,TCP/IP协议的目的就是让传输数据变得有条有序
    3. Socket和TCP/IP关系
      TCP/IP是一种协议,Sokect是遵循这种协议做传输数据的一个工具。
      例如:你只知道开车靠右,但是没车,你还是不能运输东西,不是吗?Socket就像遵循开车靠右 (TCP/IP协议) 的车

    正式内容

    服务端代码

    static void Main(string[] args)
    {
        IPAddress ip = IPAddress.Parse("127.0.0.1");
        #region 端口
        //端口号的范围从0到65535,建议自己写程序设置端口,都大于3000小于65535,
        //因为windows很多默认程序都小于3000,这样可以避免不必要的端口冲突。
        #endregion
        IPEndPoint ipe = new IPEndPoint(ip, 5001);
        //1.建立一个Socket对象
        Socket socketServer = new Socket(AddressFamily.InterNetwork, 
        SocketType.Stream, ProtocolType.Tcp);
        //2.Socket关联到这个IP上面
        socketServer.Bind(ipe);
        #region 3.开始监听这个IP是否有客户端连接
        //Listen参数:同时有多台客户端连接服务器时,最多允许排队等待的客户端数量
        #endregion
         //最多允许8个客户端排队等待(这个数值建议小于30)
        socketServer.Listen(8);
        Console.WriteLine("正在监听...");
    
        //接收发送连接信息的客户端(一直等待客户端连接,不继续执行)
        Socket acceptSocket = socketServer.Accept();
        Console.WriteLine("连接成功!!");
        string message = string.Empty;
        byte[] receiveBytes = new byte[2048];
        //服务端会一直等待客户端发送消息,否则不继续执行
        int byteLen = acceptSocket.Receive(receiveBytes, receiveBytes.Length, 0);
        message += Encoding.UTF8.GetString(receiveBytes, 0, byteLen);
        Console.WriteLine("客户端消息:" + message);
    
        //发送消息给客户端
        string sendMessage = "Hi Boy,I am SocketServer!";
        byte[] sendBytes = Encoding.UTF8.GetBytes(sendMessage);
        acceptSocket.Send(sendBytes, sendBytes.Length, 0);
    
        //释放Socket占用的资源
        acceptSocket.Dispose();
        socketServer.Dispose();
    
        Console.ReadKey();
    }
    

    客户端代码

    static void Main(string[] args)
    {
        IPAddress ip = IPAddress.Parse("127.0.0.1");
        IPEndPoint ipe = new IPEndPoint(ip, 5001);
        //1.建立一个Socket对象
        Socket socketClient = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp);
        try
        {
            //2.去连接这个IP(没有Socket监听这个端口,就会报错)
            socketClient.Connect(ipe);
            Console.WriteLine("连接服务端" + ipe + "成功");
            //发送信息给服务端
            string sendMessage = "Hello SocketServer,I am SocketClient.";
            byte[] sendBytes = Encoding.UTF8.GetBytes(sendMessage);
            socketClient.Send(sendBytes);
    
            //接收信息
            string receiveMessage = "";
            byte[] receiveBytes = new byte[2048];
            //客户端会一直等待服务器发送消息,否则不继续执行
            int byteLen = socketClient.Receive(receiveBytes, 
            receiveBytes.Length, 0);
            receiveMessage += Encoding.UTF8.GetString(receiveBytes, 0, byteLen);
            Console.WriteLine("服务器信息:" + receiveMessage);
    
            //释放Socket占用的资源
            socketClient.Dispose();
            Console.ReadKey();
        }
        catch (Exception)
        {
            throw;
        }
    }
    

    总结

    注意:先运行服务端,再运行客户端。

    这样简单的Socket通讯,在C#中就算完成了。
    但是你会发现,服务端只能连接一个客户端,而且发送的内容都是写死的。
    期待和Socket的再次遇。。。。


    【原文链接】http://www.cnblogs.com/z13qu/p/6992208.html

  • 相关阅读:
    jaxb 专题一(JAXB 实现java对象与xml之间互相转换)
    spring @Transactional注解参数详解
    Spring声明式事务管理与配置详解
    spring源码解析--事务篇(前篇)
    Java的三种代理模式
    Spring AOP面向切面编程详解
    Spring AOP基于注解的“零配置”方式实现
    Spring AOP 中pointcut expression表达式解析及配置
    Spring AOP详解
    一种解决maven单继承的办法
  • 原文地址:https://www.cnblogs.com/z13qu/p/6992208.html
Copyright © 2011-2022 走看看