1、套接字编程
Socket:套接字
套接字是支持TCP/IP协议的网络通讯的基本操作单元,可以将套接字看做不同主机的进程进行双向通讯的端点,它构成了单个主机内及整个网络间的编程界面。
IP地址(Internet Protacol):
是互联网设备之间传输数据的一种协议,IP地址就是给每个连接在因特网的主机(或路由器)分配一个在全世界范围内唯一的标识符(类似你的家庭住址)。
端口:
标识某台计算机上的进程。
TCP/IP(传输控制协议/网际协议):
是一组网络通讯协议的总称,它规范了网络上的所有通讯设备,尤其是一个主机与另一个主机之间的数据交换格式以及传输方式
特点:
TCP(传输控制协议) 全双工
基于连接的一种协议
UDP特点:
是一个基于无连接的协议,没有生成连接的系统延迟,所以速度要比TCP快;
支持一对一、一对多的连接,可以使用广播的方式多地址的发送;
消耗的网络带宽更小;
UDP协议传输的数据有消息边界,而TCP是没有的
TCP服务器端代码:
需引用命名空间
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Server_Tcp
{
class Server
{
private Socket socket; //服务器监听套接字
private bool isListen = true;//判断服务器是否在监听(目的是为了方便退出)
public Server()
{
//定义网络终结点(封装IP和端口)
IPEndPoint endPoint =new IPEndPoint(IPAddress.Parse("127.0.0.1"),9999);
//实例化套接字(监听套接字)
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
//服务器端绑定地址
socket.Bind(endPoint);
//开始监听
socket.Listen(10);//10表示“监听对列”的最大长度
Console.WriteLine("服务器端已经启动");
try
{
while (isListen)
{
//Accept()接收客户端的连接
//会阻断当前线程的进行
Socket acceptSocket = socket.Accept();
Console.WriteLine("有一个客户端连接。。。。。。");
//开启一个后台线程,进行客户端的会话
Thread clientMsg = new Thread(ClientMsg);
clientMsg.IsBackground = true;//设置为后台线程
clientMsg.Name = "clientMsg";//设置线程名字
clientMsg.Start(acceptSocket);
}
}
catch (Exception)
{
}
}
/// <summary>
/// 服务器端和客户端通讯的后台线程方法
/// </summary>
/// <param name="sockMsg"></param>
public void ClientMsg(object sockMsg)
{
Socket socketMsg = sockMsg as Socket;//通讯Socket
while (true)
{
//准备一个“数据缓存(数组)”
byte[] msg = new byte[1024 * 1024];
//接收客户端发来的数据,返回数据真实长度
int count = socketMsg.Receive(msg);
//byte数组转换为string
string str = Encoding.UTF8.GetString(msg, 0, count);
//显示客户端发过来的数据
Console.WriteLine("客户端发过来的数据:"+str);
}
}
static void Main(string[] args)
{
Server server = new Server();
}
TCP客户端代码:
需引用命名空间
using System.Net;
using System.Net.Sockets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace Client_Tcp
{
class Client
{
private Socket clientSocket;//客户端通讯套接字
private IPEndPoint serverEndPoiint;//连接到的服务器IP和端口
public Client()
{
serverEndPoiint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),9999);
clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
try
{
clientSocket.Connect(serverEndPoiint);
}
catch (Exception)
{
}
}
public void SendMsg()
{
while (true)
{//输入数据
string str = Console.ReadLine();
//转换为字节
byte[] byteArray = Encoding.UTF8.GetBytes(str);
//发送数据
clientSocket.Send(byteArray);
Console.WriteLine("我:"+ str);
}
//关闭连接
clientSocket.Shutdown(SocketShutdown.Both);
//清理连接资源
clientSocket.Close();
}
static void Main(string[] args)
{
Client client = new Client();
client.SendMsg();
}
}
}
UDP接收端代码:
需引用命名空间
using System.Net;
using System.Net.Sockets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace Server_Udp
{
class Server
{
private IPEndPoint serverEndPoint;
private Socket serverSocket;
public Server()
{
serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),12345);
serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
serverSocket.Bind(serverEndPoint);
EndPoint ep = (EndPoint)serverEndPoint;
while (true)
{
byte[] byteArray = new byte[1024*1024];
int count = serverSocket.ReceiveFrom(byteArray,ref ep);
string str = Encoding.UTF8.GetString(byteArray,0,count);
Console.WriteLine("客户端发来的信息:"+str);
}
}
static void Main(string[] args)
{
Server server = new Server();
}
}
}
UDP发送端代码:
需引用命名空间
using System.Net;
using System.Net.Sockets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace Client_Udp
{
class Client
{
private IPEndPoint clientEndPoint;
private Socket clientrSocket;
public Client()
{
clientEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);
clientrSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
EndPoint ep = (EndPoint)clientEndPoint;
while (true)
{
string str = Console.ReadLine();
byte[] byteArray = new byte[1024 * 1024];
byteArray = Encoding.UTF8.GetBytes(str);
clientrSocket.SendTo(byteArray,ep);
Console.WriteLine("我发的信息:" + str);
}
}
static void Main(string[] args)
{
Client client = new Client();
}
}
}
原文地址:https://www.cnblogs.com/Damon-3707/p/11693079.html