当处理完了一个消息以后,但是只能一条一条的 发送和接收,这里如果说想要无限的发送或者说无限的接收
这里的话就是两种处理的方式:
1、开始一条新的线程
2、使用BeginAccept
客户端向服务器发送消息以后,服务器端需要不断的接收消息,如果想要持续不断的接收消息,那么就不再是 关闭 Socket了,如果关闭了话 就无法进行正常的持续接收了
使用 BeginReceive()方法进行,BeginReceive()方法和 Receive() 方法的区别在于,BeginReceive()方法是异步的进行接收数据,首先是需要一个 byte[] 数组进行接收,然后是一个标志,最后就是 一个 回调函数,因为 调用Receive()方法的话 程序会进行一个暂停,这里也就是 同步里边的方法,BeginReceive()的话就是接收到了消息以后使用那个方法进行处理,通过事件的方式,当服务器端接收到了 一个请求以后,会调用一个事件方法进行处理,so 定义一个方法,传递一个 参数,这个参数的作用:当接收到了 数据的时候,会调用一个方法,通过参数进行传递
接收的话 直接 使用转型的 方式进行一个接收
//转型
Socket clientSocket = ar.AsyncState as Socket;
返回为 object,传递的也是 object
再往下面就是 使用 EndReceive()方法完成数据的接收 ,有一个 int 的返回类型,代表了返回多少字节的数据,数据存储到了数组中。接着就是 UTF-8 进行反编码。得到一个字符串儿,然后进行输出即可。
因为调用完了 BeginReceive()方法以后不会影响后面的逻辑
调用完了 以后只会完成一条消息的接收,如果想要循环的接收消息的话,直接在 事件方法中进行 回调 Begin方法。
如果说想在客户端进行一个循环发送的话,直接在 客户端那边儿将 输入的东西 套一个 while()循环即可。
服务器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace Server_Message_ServerEnd
{
class Program
{
static void Main(string[] args)
{
StartServerAsync();
Console.ReadKey();
}
/// <summary>
/// 同步
/// </summary>
private void StartServerSync()
{
//创建 Socket,使用流的方式
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//申请端口,绑定 IP 局域网 IP 192.168.0.110(动态变化) 127.0.0.1(本机)
string Ip = "192.168.0.110";
int endPoint = 8089;
IPAddress serverIP = IPAddress.Parse(Ip);
IPEndPoint serverEndPoint = new IPEndPoint(serverIP, endPoint);
//绑定 ip 和端口号 (申请固定的 IP 和 端口号)
serverSocket.Bind(serverEndPoint);
//监听、最多为 10 个 、 0 为不限制
serverSocket.Listen(10);
//接受一个客户端的连接,返回 Socket 对象
Socket clientScoket = serverSocket.Accept();
//考虑到有中文,所以需要使用编码的形式
string msg = "Hello Client,你好";
//转换 字符串传递
byte[] data = Encoding.UTF8.GetBytes(msg);
clientScoket.Send(data);
//存储数据、1024 几十个字符都可以存下
byte[] dataBuffer = new byte[1024];
//接收到的数据
int count = clientScoket.Receive(dataBuffer);
//转变编码格式
string messageReceive = Encoding.UTF8.GetString(dataBuffer, 0, count);
Console.WriteLine(messageReceive);
Console.ReadKey();
//关闭客户端、客户端的连接
clientScoket.Close();
serverSocket.Close();
}
/// <summary>
/// 异步
/// </summary>
private static void StartServerAsync()
{
//创建 Socket,使用流的方式
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//申请端口,绑定 IP 局域网 IP 192.168.0.110(动态变化) 127.0.0.1(本机)
string Ip = "192.168.0.110";
int endPoint = 8089;
IPAddress serverIP = IPAddress.Parse(Ip);
IPEndPoint serverEndPoint = new IPEndPoint(serverIP, endPoint);
//绑定 ip 和端口号 (申请固定的 IP 和 端口号)
serverSocket.Bind(serverEndPoint);
Console.WriteLine("服务器启动成功...");
//监听、最多为 10 个 、 0 为不限制
serverSocket.Listen(10);
//接受一个客户端的连接,返回 Socket 对象
clientScoket = serverSocket.Accept();
//考虑到有中文,所以需要使用编码的形式
string msg = "Hello Client,你好";
//转换 字符串传递
byte[] data = Encoding.UTF8.GetBytes(msg);
clientScoket.Send(data);
//异步接收、监听客户端数据传递
clientScoket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientScoket);
//不会影响下边的执行
}
static Socket clientScoket;
static byte[] dataBuffer = new byte[1024];
static void ReceiveCallBack(IAsyncResult ar)
{
//转型
Socket clientSocket = ar.AsyncState as Socket;
//接收了 多少字节的数据、数据存储到了 数组中
int count = clientSocket.EndReceive(ar);
string msg = Encoding.UTF8.GetString(dataBuffer, 0, count);
Console.WriteLine("从客户端接收到了数据" + msg);
clientScoket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientScoket);
}
}
}
客户端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace Server_Message_ClientEnd
{
class Program
{
static void Main(string[] args)
{
//创建 Socket
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//建立连接、指定终端
clientSocket.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.110"), 8089));
//接收消息的数组
byte[] data = new byte[1024];
//接收服务器的消息
int count= clientSocket.Receive(data);
//数组转换信息
string msg = Encoding.UTF8.GetString(data, 0, count);
Console.WriteLine(msg);
while (true)
{
//发送消息到服务器
string s = Console.ReadLine();
//转换
clientSocket.Send(Encoding.UTF8.GetBytes(s));
}
Console.ReadKey();
clientSocket.Close();
}
}
}