首页 > 编程语言 >C# Socket入门

C# Socket入门

时间:2023-04-26 09:22:35浏览次数:40  
标签:Socket C# IP 入门 TCP new byte 客户端

1.什么是Socket

socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据;

套接字就是四元组,即源ip+端口port 目的ip+端口port,表示绝对唯一的连接;

Socket 是在应用层(Http、SSH、FTP)和传输层(TCP、UDP)之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信;

实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议;

 

2.Http与TCP/IP与Socket的关系

WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上;

HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口;

 

 

2.Socket流程

通过上面对Socket的理解,我们知道Socket编程将两个进程之间分为服务端和客户端;其各自的流程如下

服务器端:
第一步:建立一个用于通信的Socket对象
第二步:使用bind绑定IP地址和端口号
第三步:使用listen监听客户端
第四步:使用accept中断程序直到连接上客户端
第五步:接收来自客户端的请求
第六步:返回客户端需要的数据
第七步:如果接收到客户端已关闭连接信息就关闭服务器端

客户端:
第一步:建立一个用于通信的Socket对象
第二步:根据指定的IP和端口connet服务器
第三步:连接成功后向服务器端发送数据请求
第四步:接收服务器返回的请求数据
第五步:如果还需要请求数据继续发送请求
第六步:如果不需要请求数据就关闭客户端并给服务器发送关闭连接信

 

3.Socket编程

   3.1.服务端

   根据上面对服务端Socket流程的定义,首先需要创建服务端的Socket对象

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

   其次是绑定本地的IP和端口号

ServerSocket.Bind(new IPEndPoint(ip,port));
或者
IPEndPoint ipEndPoint = new IPEndPoint(ip,port)
ServerSocket.Bind(ipEndPoint);

   然后让Socket侦听传入的连接,参数为指定侦听队列的容量

ServerSocket.Listen(10);

   接收连接并返回一个新的Socket,Accept会中断程序,直到有客户端连接,而Accept方法返回的Socket即是已经与客户端连接成功的套接字(Socket),用该套接字就可以与客户端进行消息的收发

Socket socket = ServerSocket.Accept();

    从客户端中读取数据

byte[] receive = new byte[1024];
int length = socket.Receive(receive);// length 接收字节数组长度

   发送数据到客户端

//Encoding.ASCII.GetBytes()将字符串转成字节
//byte[] message = Encoding.ASCII.GetBytes("Connect the Server"); //通信时实际发送的是字节数组,所以要将发送消息转换字节
byte[] message = Encoding.UTF8.GetBytes("Connect the Server");    //防止中文乱码使用该方法对字符串进行编码
socket.Send(message);

 3.2客户端

 创建一个客户端的Socket对象

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

使用Socket的Connnect方法向服务端发送连接请求,Connect方法下重载的Connect(IP,Port)可以选择。

ClientSocket.Connect(iPEndPoint);

如果连接成功,则可以用Send方法向服务端发送消息

byte[] send = new byte[1024];
send = Encoding.UTF8.GetBytes(richTextBox_Send.Text);  //将文本内容转换成字节发送
ClientSocket.Send(send);  

也可以用Recive方法接收消息

byte[] receive = new byte[1024];
ClientSocket.Receive(receive);  //调用Receive()接收字节数据

最后在通信结束后关闭连接

ClientSocket.Close();   //关闭套接字

4.因为服务端的Accept方法会中断程序,所以可以通过线程,或者Socket提供的异步方法

 

 

参考文档

https://blog.csdn.net/weixin_49959955/article/details/123798500

https://blog.csdn.net/weixin_44201102/article/details/117224252

标签:Socket,C#,IP,入门,TCP,new,byte,客户端
From: https://www.cnblogs.com/M-MAKI/p/17353302.html

相关文章

  • C++数据结构(树)
    树是一种递归定义的数据结构,如果树中节点的各子树从左到右是有次序的,不能互换,则称该树为有序树,否则叫无序树。关于树的节点:节点拥有的子树的个数叫做节点的度如果度为0,那么该节点叫做叶节点或终端节点,除了根节点外的分支节点称为内部节点树的度是各节点度的最大值。节点的子......
  • MFC-GetTopWindow获取指定窗口的子窗口中最顶层的窗口句柄
     //GetTopWindowHWNDhWnd=::FindWindow(_T("#32770"),_T("测试程序"));if(!hWnd){AfxMessageBox(_T("请打开测试程序"));ExitProcess(0);}CStringstr;str.Format(_T("主窗口句柄:hWnd=%d\r\n&q......
  • 关于vcpkg中x-history命令移除后及git subtree的使用问答
    1、现在的版本中已经移除了x-history命令,我该使用什么方式来查看port的历史记录呢如果当前版本的vcpkg中已经移除了x-history命令,您可以使用以下方法查看port的历史记录:使用Git命令:首先,确保您已经安装了Git。然后,在命令行或终端中,导航到vcpkg的安装目录。接下来,使用以下命令......
  • ChatGPT:宝塔面板中nginx配置代理访问openai
    反向代理配置代码点击查看代码#PROXY-START/location/{proxy_passhttps://api.openai.com;proxy_set_headerHost$proxy_host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_se......
  • 大规模 Transformer 模型 8 比特矩阵乘简介 - 基于 Hugging Face Transformers、Accel
    引言语言模型一直在变大。截至撰写本文时,PaLM有5400亿参数,OPT、GPT-3和BLOOM有大约1760亿参数,而且我们仍在继续朝着更大的模型发展。下图总结了最近的一些语言模型的尺寸。由于这些模型很大,因此它们很难在一般的设备上运行。举个例子,仅推理BLOOM-176B模型,你就需要8......
  • SMU Spring 2023 Trial Contest Round 10
    SMUSpring2023TrialContestRound10 A-RemoveDuplicates#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,int>PII;typedefpair<string,int>PSI;constintN=2e2+5,INF=0x3f3f3f3f,Mod=1e6;constdoubleeps=1e-6;typedef......
  • C++ 多线程并发
    C++参考手册-并发支持库《C++ConcurrencyinAction》https://segmentfault.com/a/1190000040628584?utm_source=sf-similar-articlehttps://zhuanlan.zhihu.com/p/547312117bilibiliC++多线程并发基础入门教程1创建线程C++11之前原生不支持多线程,C++11起逐步引......
  • 基于ICP配准算法的三维点云数据的匹配仿真
    1.算法仿真效果matlab2022a仿真结果如下:       2.算法涉及理论知识概要       ICP算法能够使不同的坐标下的点云数据合并到同一个坐标系统中,首先是找到一个可用的变换,配准操作实际是要找到从坐标系1到坐标系2的一个刚性变换。ICP算法本质上是基于最小......
  • m基于LOC-PCA算法的人脸重建算法matlab仿真,给定人物侧脸实现正脸重建
    1.算法仿真效果matlab2022a仿真结果如下:       2.算法涉及理论知识概要      提出了一种有效的图像姿态合成方法。姿势合成用于预测在给定姿势的期望姿势处具有最小误差的面部图像。在许多情况下,这是经常需要的例如动画电影的制作、法医学和3D人脸几......
  • C# 查找特性标识的所有类并获取属性值
    写个方法去获取被特性(Attribute)标记的类,并且获取标记的属性值usingOneLove.Core.ExtendedEnum;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Reflection;usingSystem.Text;usingSystem.Threading.Tasks;namespaceOneLove.Core.Ex......