P:网络层协议;
TCP和UDP:传输层协议;
HTTP:应用层协议;
SOCKET:TCP/IP网络的API。
TCP/IP代表传输控制协议/网际协议,指的是一系列协议。
TCP和UDP使用IP协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。
TCP和UDP是FTP,HTTP和SMTP之类使用的传输层协议。虽然TCP和UDP都是用来传输其他协议的,它们却有一个显著的不同:TCP提供有保证的数据传输,而UDP不提供。这意味着TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。
HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。
记住,需要IP协议来连接网络;TCP是一种允许我们安全传输数据的机制,,使用TCP协议来传输数据的HTTP是Web服务器和客户端使用的特殊协议。
Socket 接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,用以开发TCP/IP网络上的应用程序。
#的网络编程和Socket通信 网络编程是指利用计算机网络进行数据交换和通信的编程。C#作为一种现代的、面向对象的、多范式的编程语言,提供了丰富的网络编程功能和类库,可以方便地实现各种网络应用和协议。本文将介绍C#中最基本和最常用的网络编程技术——Socket通信。
Socket(套接字)是一种抽象的概念,它表示两个网络节点之间的一个双向的、可靠的、持久的通信链路。Socket是网络编程中最底层的接口,它可以支持不同的传输层协议,如TCP(传输控制协议)和UDP(用户数据报协议)。TCP是一种面向连接的、可靠的、有序的、基于字节流的协议,它适合于传输大量的数据,如文件、邮件、网页等。UDP是一种无连接的、不可靠的、无序的、基于数据报的协议,它适合于传输少量的数据,如音频、视频、游戏等。
在C#中,Socket类位于System.Net.Sockets命名空间中,它封装了操作系统提供的底层Socket接口,并提供了一些高级的方法和属性,使得我们可以方便地创建和使用Socket对象。Socket类有以下几个重要的属性:
TCP通信需要有一个服务器端和一个客户端。服务器端负责监听来自客户端的连接请求,并为每个连接请求创建一个新的Socket对象,用于与客户端进行数据交换。客户端负责发起连接请求,并使用一个Socket对象与服务器进行数据交换。下面给出一个简单的示例,演示如何使用Socket进行TCP通信。
服务器端代码:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace TcpServer
{
class Program
{
static void Main(string[] args)
{
// 创建一个TCP Socket对象
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 绑定到本地IP地址和端口号
IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 8888;
IPEndPoint endPoint = new IPEndPoint(ip, port);
server.Bind(endPoint);
// 开始监听
server.Listen(10);
Console.WriteLine("服务器已启动,等待客户端连接...");
// 循环接受客户端连接请求
while (true)
{
// 接受一个客户端连接请求,并返回一个新的Socket对象
Socket client = server.Accept();
Console.WriteLine("客户端已连接,IP地址和端口号为:{0}", client.RemoteEndPoint);
// 创建一个字节数组,用于接收和发送数据
byte[] buffer = new byte[1024];
// 接收客户端发送的数据
int length = client.Receive(buffer);
string message = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("接收到客户端的数据:{0}", message);
// 向客户端发送数据
message = "你好,我是服务器。";
buffer = Encoding.UTF8.GetBytes(message);
client.Send(buffer);
Console.WriteLine("向客户端发送数据:{0}", message);
// 关闭客户端Socket
client.Close();
}
// 关闭服务器Socket
server.Close();
}
}
客户端代码:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace TcpClient
{
class Program
{
static void Main(string[] args)
{
// 创建一个TCP Socket对象
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 连接到服务器
IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 8888;
IPEndPoint endPoint = new IPEndPoint(ip, port);
client.Connect(endPoint);
Console.WriteLine("已连接到服务器,IP地址和端口号为:{0}", client.RemoteEndPoint);
// 创建一个字节数组,用于接收和发送数据
byte[] buffer = new byte[1024];
// 向服务器发送数据
string message = "你好,我是客户端。";
buffer = Encoding.UTF8.GetBytes(message);
client.Send(buffer);
Console.WriteLine("向服务器发送数据:{0}", message);
// 接收服务器发送的数据
int length = client.Receive(buffer);
message = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("接收到服务器的数据:{0}", message);
// 关闭客户端Socket
client.Close();
}
}
}
运行结果:
从上面的示例可以看出,使用Socket进行TCP通信的基本步骤如下:
UDP通信不需要建立连接,只需要知道对方的IP地址和端口号即可。UDP通信有一个发送方和一个接收方。发送方负责向指定的远程端点发送数据。接收方负责监听来自任意远程端点的数据。下面给出一个简单的示例,演示如何使用Socket进行UDP通信。
发送方代码:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace UdpSender
{
class Program
{
static void Main(string[] args)
{
// 创建一个UDP Socket对象
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// 创建一个远程端点,表示接收方的IP地址和端口号
IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 9999;
IPEndPoint endPoint = new IPEndPoint(ip, port);
// 创建一个字节数组,用于发送数据
byte[] buffer = new byte[1024];
// 向远程端点发送数据
string message = "你好,我是发送方。";
buffer = Encoding.UTF8.GetBytes(message);
sender.SendTo(buffer, endPoint);
Console.WriteLine("向远程端点发送数据:{0}", message);
// 关闭发送方Socket
sender.Close();
}
}
}
接收方代码:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace UdpReceiver
{
class Program
{
static void Main(string[] args)
{
// 创建一个UDP Socket对象
Socket receiver = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// 绑定到本地IP地址和端口号
IPAddress ip = IPAddress.Parse("127.0.0.1");
int port = 9999;
IPEndPoint endPoint = new IPEndPoint(ip, port);
receiver.Bind(endPoint);
// 创建一个字节数组,用于接收数据
byte[] buffer = new byte[1024];
// 接收来自任意远程端点的数据,并返回发送方的端点信息
EndPoint senderEndPoint = new IPEndPoint(IPAddress.Any, 0);
int length = receiver.ReceiveFrom(buffer, ref senderEndPoint);
string message = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("接收到来自{0}的数据:{1}", senderEndPoint, message);
// 关闭接收方Socket
receiver.Close();
}
}
}
运行结果:
接收到来自127.0.0.1:8888的数据:你好,我是发送方。
向远程端点发送数据:你好,我是接收方。
从上面的示例可以看出,使用Socket进行UDP通信的基本步骤如下:
总结 本文介绍了C#中最基本和最常用的网络编程技术——Socket通信。我们了解了什么是Socket,以及如何使用Socket进行TCP和UDP通信。我们还给出了一些简单的示例代码,演示了如何使用Socket类创建和使用Socket对象。通过学习本文,我们可以掌握C#中网络编程的基础知识,为进一步学习更高级的网络编程技术打下坚实的基础。
希望本文对你有所帮助。如果你有任何问题或建议,请在评论区留言。谢谢!
1.socket本身有“插座“的意思,因此用来描述网络连接的一对一关系。
2.在TCP/IP协议中,“IP地址+TCP/UDP端口号”唯一标识网络通信中的一个进程,“IP地址+端口号”就称为socket。
3.在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socketpair 就唯一标志一个连接。
网络数据流有大端和小端之分。发送主机通常将发送缓冲区中的数据按内存地址从高到低的顺序 发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存。因此 ,网络数据流的地址应这样规定:先发出的数据都是低地址,后发出的数据是高地址。
TCP/IP协议规定:网络数据流应采用大端字节序,即低地址高字节。
如果发送主机是小端字节序的,则需要做相应的字节序的转换。为使网络程序具有可移植性,使代码在大端和小端计算机上都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。
其中h表示host,n表示network,l表示32位长整数,s表示16位短整数。例如:htonl表示将32位的长整数从主机字节序转换为网络字节序。
服务器:调用socket(),bind(),listen()完成初始化以后,调用accept()阻塞等待,处于监听端口的状态。
客户端:调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回。
数据传输的过程:建立连接后,TCP协议提供全双工的通信服务,但是一般的客户端/服务器程序的流程是由客户端主动发起请求,服务器被动处理请求,一问一答的方式。因此,服务器从accept()返回后立即调用read(),读socket就像读管道一样,如果没有数据到达就阻塞等待,这时客户端调用write()发送请求给服务器,服务器收到后从read()返回,对客户端的请求进行处理,在此期间客户端调用read()阻塞等待服务器的应答,服务器调用write()将处理结果发送给客户端,再次调用read()阻塞等待下一条请求,客户端收到后从read() 返回,发送下一条请求,如此循环下去。
如果客户端没有更多的请求,就调用close()关闭连接,就如同写端关闭的管道一样,服务器的read()返回0,服务器就知道客户端关闭了连接,也调用close()关闭连接。注意:?任何一方调用close()后,连接的两个传输方向都关闭,不能再发送数据了。如果一方调用shutdown()则连接处于半关闭状态,仍可接受对方发送来的 数据。
1.socket的创建
(1)函数原型:
(2)参数说明:
domain为协议域,对于IPv4,family指定参数为AF_INET。
type 为指定socket的类型,对于TCP协议,type的参数指定为SOCK_STREAM,表示面向流的传输协议;如果是UDP协议,则type的参数指定为SOCK_DGRAM,表示面向数据报的传输协议。
protocal参数为指定协议,一般指定为0即可。
(3)返回值
*请认真填写需求信息,我们会在24小时内与您取得联系。