zoukankan      html  css  js  c++  java
  • Socket编程基础

    参考资料:

    Socket编程的原理 ①    

    Socket编程的实例   

    Socket位于TCP/IP协议中的应用层与网络层之间,如下图:

    大体流程如下图:

    using System.Net

    using System.Net.Sockets

    服务器端

    创建流式(SocketType.Stream)套接字-----Socket()

    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    addressFamily参数指定Socket使用的寻址方案,socketType参数指定Socket的类型,protocolType参数指定Socket使用的协议

    使Socket与一个本地终结点(IPEndPoint)相联-----Bind()

    IPAddress ip = IPAddress.Any;   会自动运算本机IP地址并返回一个IPAddress实例,还可以IPAddress ip=IPAddress.Parse(ip地址的字符串)

    IPEndPoint iep=new IPEndPoint(ip,端口);  参数是一个IPAddress实例和整型的端口,返回一个本地终结点

    socket.Bind(iep);

    使Socket与一个本地终结点连接侦听该接口上的请求-----Listen()

    socket.Listen(10);  参数指定队列中最多可容纳的等待接受的传入连接数,默认为5

    当侦听到用户端的连接时调用Accept完成连接的操作-----Accept() 

    Accept()方法会产生一个新的Socket对象来处理客户端的连接,而原来的Socket对象继续监听端口的请求

    while (true)  

    {    

    Socket temp = socket.Accept();     

    byte[] rebuffer = new byte[1024];   建立用于存储客户端信息的字节流数组

    将接收到的字节流存入字节数组-----Receive()    

    int len = temp.Receive(rebuffer,0,rebuffer.Length)  Receive()方法返回已接受的字节数,还有一种BeginReceive()用于异步接收数据    

    string reinfo += Encoding.ASCII.GetString(rebuffer,0,len);  将接收到的字节流解码为一个字符串    

    string seinfo="我已收到!"    

    byte[] sebuffer = Encoding.ASCII.GetBytes(seinfo);  将要发的字符串中的所有字符编码为一个字节数组

    将数据发送到连接的客户端的Socket-----Send()    

    temp.Send(sebuffer,0,sebuffer.Length);    

    temp.Close(); 

     }
    客户端

    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    IPAddress ip = IPAddress.Parse("服务器的ip地址");

    IPEndPoint ipe = new IPEndPoint(ip,"服务器的开放端口");

    socket.Connect(ipe);   与远程主机的一个socket连接

    string seinfo="收到了吗?";

    byte[] sebuffer = Encoding.ASCII.GetBytes(seinfo);

    socket.Send(sebuffer,0,sebuffer.Length);

    byte[] rebuffer = new bytep[1024];

    int len = socket.Receive(rebuffer,0,rebuffer.Length);

    string reinfo = Encoding.ASCII.GetString(rebuffer,0,len);

    scoket.close();

    源码下载

  • 相关阅读:
    将Nginx添加到windows服务中
    springboot使用redis管理session
    GIT常用命令
    阻止360、谷歌浏览器表单自动填充
    谈谈对Spring IOC的理解
    同一个Nginx服务器同一端口配置多个代理服务
    LeetCode 653. Two Sum IV
    109. Convert Sorted List to Binary Search Tree(根据有序链表构造平衡的二叉查找树)
    108. Convert Sorted Array to Binary Search Tree(从有序数组中构造平衡的BST)
    LeetCode 236. Lowest Common Ancestor of a Binary Tree(二叉树求两点LCA)
  • 原文地址:https://www.cnblogs.com/hanmeimei/p/socket.html
Copyright © 2011-2022 走看看