返回

(45)C#网络3 socket

发布时间:2023-08-23 00:14:53 286

 一、TCP传输

using System.Net.Sockets;

1.最基本客户端连服务器

服务端运行后一直处于监听状态,客户端每启动一次服务端就接收一次连接并打印客户端的ip地址和端口号。(服务端的端口号是固定的,客户端端口号是随机生成的)

服务端

static void Main(string[] args)
{
Int32 port = 8500;
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
//创建监听对象,参数1:IPAddress类的对象,参数2:端口号
TcpListener tcpListener = new TcpListener(ipAddress, port);
//开启监听
tcpListener.Start();
Console.WriteLine("服务器端口号:" + port + " 开始监听...");
while (true)
{
//接收一个tcp类型的客户端连接
TcpClient tcpClient = tcpListener.AcceptTcpClient();
//屏幕打印客户端的IP地址和端口号
Console.WriteLine("客户端:{0},连接到服务端", tcpClient.Client.RemoteEndPoint);
}
}

客户端

static void Main(string[] args)
{
Console.WriteLine("启动客户端 ...");
TcpClient client = new TcpClient();
try
{
// 与服务器连接
client.Connect("localhost", 8500);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return;
}
Console.ReadKey();
}

 2.服务端与客户端聊天

二、UDP传输

UDP是无连接协议,不需要用listener监听。

UDP传输是对等的没有主次之分

 

 IPEndPoint 类

将网络终结点表示为 IP 地址和端口号

//新实例初始化 IPEndPoint 类具有指定的地址和端号,IPEndPoint(IPAddress, Int32)
IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Any, 0);
//获取或设置IP地址
iPEndPoint.Address
//获取或设置端口号
iPEndPoint.Port

三、Socket

构造函数:

 Socket(AddressFamily, SocketType, ProtocolType)

AddressFamily 表示地址族 Socket,一般使用InterNetwork 表示ipv4

(45)C#网络3  socket_客户端

SocketType:指定套接字类型的实例 Socket 类表示

(45)C#网络3  socket_服务端_02

ProtocolType: 指定 Socket 类支持的协议

(45)C#网络3  socket_端口号_03

 

属性

Blocking:是否 Socket 处于阻塞模式。bool

Connected:获取一个值,该值指示是否 Socket 连接到远程主机从上次以来 Send 或 Receive 操作。bool

LocalEndPoint:表示本地ip与端口的组合,在调用bind后设置

RemoteEndPoint:面向连接中,该属性可以获取socket连接中的远程IP和端口,无连接中该属性包含将要和socket通信的默认远程ip和端口,RemoteEndPoint在调用acceppt或conncet后使用。

 

 

(45)C#网络3  socket_服务端_04

 

服务端

class Program
{
static Socket S;
static void Main(string[] args)
{
Console.WriteLine("启动服务器.....");
//参数1寻址方案,参数2套接字类型,参数3协议类型
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//设置IP地址和端口号
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8500);
//把地址绑定到socket对象
socket.Bind(ipEndPoint);
//启动监听,并设置连接队列的最大长度
socket.Listen(10);
try
{
//持续监听
while (true)
{
//等待客户端连接,连接后接收客户端返回一个通信用的socket对象
S = socket.Accept();
Console.WriteLine("客户端 " + S.RemoteEndPoint + " 连接到服务器.....");
Thread th = new Thread(receive);
th.Start(S);
}
}
catch { }
}
static void receive(object o)
{
while (true)
{
try
{
byte[] buffer = new byte[1024 * 1024 * 2];
//接收客户端消息读到缓冲区(字节数组类型),返回int字节数
int count = S.Receive(buffer);
//防止客户端关闭后进入死循环
if (count == 0)
{
break;
}
//将字节数组转成字符串
string str = Encoding.UTF8.GetString(buffer, 0, count);
Console.WriteLine("客户端" + str);
}
catch { }
}
}
static void write()
{

}
}

客户端

class Program
{
static void Main(string[] args)
{
string str = string.Empty;
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接指定的服务器
socket.Connect("127.0.0.1",8500);
Console.WriteLine("连接成功");
while (!str.Equals("exit"))
{
str = Console.ReadLine();
byte[] buffer = Encoding.UTF8.GetBytes(str);
socket.Send(buffer);
}
Console.ReadKey();
}
}

 

 

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
(5) go 格式化输入输出 类型转换 2023-08-22 21:00:24