下面是关于“VisualC#.Net网络程序开发-Socket篇第1/2页”的详细攻略。
简介
在本篇文章中,我们将学习如何通过C#语言使用Socket API进行网络编程。Socket是通信终端之间进行双向字节流的机制,是网络应用程序开发的基本组件之一。我们将学习Socket的原理,了解如何创建Socket的实例以及如何通过Socket进行数据传输。
Socket的原理
Socket基于IP地址和端口号来向网络发送和接收数据。IP地址是互联网络中每一个节点的唯一标识符,而端口号是IP地址上的16位数字,用于标识一个应用程序所使用的TCP或UDP协议下的一个端口。
Socket的实现基于计算机网络层次模型中的传输层,在TCP/IP协议中,Socket使用向下两个协议来实现网络通信:IP协议和TCP或UDP协议。IP协议负责将数据包从源主机传输到目的主机,而TCP或UDP负责将数据包从源主机传输到目的进程。使用Socket API,程序员可以通过TCP或UDP协议进行网络通信。
创建Socket实例
创建Socket实例是使用Socket API进行网络编程的第一步。在C#中,我们可以使用System.Net.Sockets名字空间下的Socket类来创建Socket实例。示例如下:
using System;
using System.Net;
using System.Net.Sockets;
namespace SocketDemo
{
class Program
{
static void Main(string[] args)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
}
}
在上面的示例中,我们使用AddressFamily.InterNetwork枚举值来指定我们将使用的IP地址族为IPv4,使用SocketType.Stream枚举值来指定我们将使用的传输层协议为TCP。
数据传输
创建Socket实例之后,我们就可以使用它来进行数据传输了。在C#中,我们可以使用Socket类的Send和Receive方法来发送和接收数据。示例如下:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace SocketDemo
{
class Program
{
static void Main(string[] args)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] sendData = Encoding.ASCII.GetBytes("Hello, World!");
socket.Send(sendData, 0, sendData.Length, SocketFlags.None);
byte[] receiveData = new byte[1024];
int receiveLength = socket.Receive(receiveData);
string receiveMessage = Encoding.ASCII.GetString(receiveData, 0, receiveLength);
Console.WriteLine(receiveMessage);
}
}
}
在上面的示例中,我们首先将要发送的数据“Hello, World!”转换为字节数组sendData,然后使用Socket的Send方法将该字节数组发送出去。接着,我们使用一个大小为1024的字节数组receiveData,表示接收缓存区,并调用Receive方法来接收网络上的数据,该方法会返回接收到的字节数。最后,我们使用Encoding.ASCII.GetString方法将接收到的字节数组转换为字符串,并在控制台输出。
示例
示例1
我们可以编写一个简单的客户端程序,使用Socket实现向服务器发送一条消息并接收服务器的响应。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace SocketDemo
{
class Client
{
private Socket _socket;
public Client()
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
public void Connect(string host, int port)
{
IPAddress ipAddress = IPAddress.Parse(host);
IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
_socket.Connect(remoteEP);
}
public void Send(string message)
{
byte[] sendData = Encoding.ASCII.GetBytes(message);
_socket.Send(sendData, 0, sendData.Length, SocketFlags.None);
}
public string Receive()
{
byte[] receiveData = new byte[1024];
int receiveLength = _socket.Receive(receiveData);
string receiveMessage = Encoding.ASCII.GetString(receiveData, 0, receiveLength);
return receiveMessage;
}
public void Close()
{
_socket.Shutdown(SocketShutdown.Both);
_socket.Close();
}
}
class Program
{
static void Main(string[] args)
{
Client client = new Client();
client.Connect("127.0.0.1", 8888);
client.Send("Hello, Server!");
string receiveMessage = client.Receive();
Console.WriteLine(receiveMessage);
client.Close();
}
}
}
在上面的示例中,我们先定义了一个Client类,它封装了与服务器进行通信的Sockt实例以及相关的方法。Connect方法用于连接服务器,Send方法用于向服务器发送消息,Receive方法用于接收服务器的响应,Close方法用于关闭Socket连接。
在Main方法中,我们先创建了一个Client实例,然后调用Connect方法连接服务器。接着,使用Send方法向服务器发送一条消息“Hello, Server!”,并使用Receive方法接收服务器的响应。最后,使用Close方法关闭Socket连接。
示例2
我们可以编写一个简单的服务器程序,使用Socket实现监听客户端请求并返回一个消息。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace SocketDemo
{
class Server
{
private Socket _listener;
public Server(int port)
{
_listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_listener.Bind(new IPEndPoint(IPAddress.Any, port));
_listener.Listen(10);
}
public void Start()
{
Socket handler = null;
try
{
handler = _listener.Accept();
byte[] buffer = new byte[1024];
int bytesRec = handler.Receive(buffer);
string data = Encoding.ASCII.GetString(buffer, 0, bytesRec);
Console.WriteLine($"Received: {data}");
byte[] msg = Encoding.ASCII.GetBytes("Hello, Client!");
handler.Send(msg);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
}
public void Stop()
{
_listener.Close();
}
}
class Program
{
static void Main(string[] args)
{
Server server = new Server(8888);
server.Start();
server.Stop();
}
}
}
在上面的示例中,我们定义了一个Server类,它封装了一个Socket实例以及相关的方法。当Server的Start方法被调用时,Socket会一直监听端口直到有客户端连接。一旦有客户端连接,Accept方法会返回一个新的Socket实例,它与客户端的Socket建立连接。然后,我们使用Receive方法接收客户端发送的消息,并使用Send方法向客户端发送一条消息“Hello, Client!”。最后,我们关闭连接。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Visual C#.Net 网络程序开发-Socket篇第1/2页 - Python技术站