开发工具:VS2017,控制台应用程序
TCP协议是一个Stream的协定,就像是电源一样,只要不断电,Stream和电流一般,Socket即为插座,TCP是支持可靠、双向、连接架构的字节数据流。
重要的C# API说明
IPAddress addr = IPAddress.Parse(“127.0.0.1”);
System.Net.IPAddress,IP地址的对象表示方法,将字符串IP地址转换为IPAddress实例。
IPEndPoint ipe = new IPEndPoint(addr, 21000);
System.Net.IPEndPoint,表示一个特定的IP地址和端口的组合,socket绑定等使用,是IP地址和端口被成对处理的对象。
AddressFamily.InterNetwork
System.Net.Sockets.AddressFamily是枚举,InterNetwork表示使用IP V4版本的地址进行通信。
SocketType.Stream
System.Net.Sockets.SocketType是枚举,Stream表示基于字节流,不重复数据的双向通信,使用TCP传输控制协议。
TCP通信案例
服务器端代码:
using System;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace What21Socket
{
class What21ServerSocket
{
public static void Main(string[] args)
{
Boolean running = true;
//============================================================================//
// 1、socket服务地址和监听端口
//============================================================================//
// socket服务地址
string host = "127.0.0.1";
// socket服务端口
int port = 21000;
// 将将IP地址字符串转换为IPAddress对象
IPAddress ip = IPAddress.Parse(host);
// 终结点EndPoint
IPEndPoint ipe = new IPEndPoint(ip,port);
//============================================================================//
// 2、创建socket连接服务端并监听端口
//============================================================================//
//创建TCP Socket对象
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定EndPoint对象(地址)
server.Bind(ipe);
//开始监听
server.Listen(0);
Console.WriteLine("已经处于监听状态,等待客户端连接 . . . ");
//============================================================================//
// 3、与客户端交互
//============================================================================//
while(running){
Socket remote = server.Accept();
Console.WriteLine("客户端连接 . . . ");
// 接收客户端消息
Receive(remote);
// 发送给客户端消息
Send(remote);
}
//============================================================================//
// 4、关闭服务
//============================================================================//
if(server!=null){
server.Close();
server=null;
}
Console.WriteLine("what21.com prompt, Press any key to continue . . . ");
Console.ReadKey(true);
}
static void Receive(Socket socket){
byte[] bytes = new byte[1024];
//从客户端接收消息
int len = socket.Receive(bytes,bytes.Length,0);
//将消息转为字符串
string recvStr = Encoding.ASCII.GetString(bytes, 0, len);
Console.WriteLine("接收的客户端消息 : {0}",recvStr);
}
static void Send(Socket socket)
{
string sendStr = "www.what21.com, What21ServerSocket, Client send message successful!";
Console.WriteLine("发送给客户端消息 : {0}",sendStr);
// 将字符串消息转为数组
byte[] bytes = Encoding.ASCII.GetBytes(sendStr);
//发送消息给客户端
socket.Send(bytes,bytes.Length,0);
}
}
}
实现服务器端的4步骤:
1、组装Socket通信的服务地址和服务端口,建立通信时的EndPoint对象。
2、创建Socket连接,监听到指定的地址和端口。
3、Socket TCP通信数据交互。
4、关闭Socket服务连接。
客户端代码:
using System;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace What21Socket
{
class What21ClientSocket
{
public static void Main(string[] args)
{
//============================================================================//
// 1、待连接的socket服务地址
//============================================================================//
string host = "127.0.0.1";
int port = 21000;
// 将将IP地址字符串转换为IPAddress对象
IPAddress ip = IPAddress.Parse(host);
// 创建终结点EndPoint
IPEndPoint ipe = new IPEndPoint(ip, port);
//============================================================================//
// 2、创建socket连接客户端
//============================================================================//
// 创建Socket并连接到服务器
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 连接到服务器
client.Connect(ipe);
//============================================================================//
// 3、与服务器端交互
//============================================================================//
Send(client);
Receive(client);
//============================================================================//
// 4、关闭Socket连接
//============================================================================//
if(client!=null){
client.Close();
client=null;
}
Console.WriteLine("what21.com prompt, Press any key to continue . . . ");
Console.ReadKey(true);
}
/***
* 发送消息
*/
static void Send(Socket socket)
{
string sendStr = "www.what21.com, What21ClientSocket, I am a Client!";
Console.WriteLine("发送给客户端消息 : {0}",sendStr);
// 将字符串消息转为数组
byte[] bytes = Encoding.ASCII.GetBytes(sendStr);
//发送消息给客户端
socket.Send(bytes,bytes.Length,0);
}
static void Receive(Socket socket){
byte[] bytes = new byte[1024];
//从客户端接收消息
int len = socket.Receive(bytes,bytes.Length,0);
//将消息转为字符串
string recvStr = Encoding.ASCII.GetString(bytes, 0, len);
Console.WriteLine("接收的服务端消息 : {0}",recvStr);
}
}
}
实现客户端的4步骤:
1、组装Socket通信的地址和端口,建立通信时的EndPoint对象。
2、创建Socket对象,建立与服务器的TCP连接。
3、Socket TCP通信数据交互。
4、关闭Socket通信的物理连接。
以上编译完成后,先运行服务器端(Server),再运行客户端(Client),可以看到通信过程的效果。
服务器端运行结果:
客户端运行结果:
总结:
Socket发送数据时,数据之间没有边界;Socket接收数据时,没有接收长度,即不知道有多少数据可以接收。