服务器和客户端通信过程:
服务端:
1.创建用于监听消息的套接字(Socket);
2.将套接字绑定到本地地址和端口上(可使用Bind函数);
3.设置监听模式(可使用listen函数);
4.等待客户请求;
5.通信;
6.关闭套接字;
客户端:
1.创建套接字;
2.向服务器发送连接请求;
3.通信;
4.关闭套接字;
注意:运行时,请先启动服务器,再启动客户端。
服务器端代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.IO;
namespace Server
{
public class Program
{
static void Main(string[] args)
{
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //定义一个套接字用于监听客户端发来的信息 包含3个参数(IP4寻址协议,流式连接,TCP协议)
EndPoint point = new IPEndPoint(IPAddress.Any, 1234); //将IP地址和端口号绑定到网络节点point上,端口号无要求4-6位即可
tcpServer.Bind(point);//监听绑定的网络节点
tcpServer.Listen(1000);//将套接字的监听队列长度限制为100
Socket socConnection = null; //创建一个负责和客户端通信的套接字
string RemoteEndPoint; //客户端网络结点号
Dictionary<string, Socket> dic = new Dictionary<string, Socket> { }; //定义一个字典,存储客户端信息
while (true) //持续不断监听客户端发来的请求
{
try
{
socConnection = tcpServer.Accept(); //暂停当前线程,直到有一个客户端连接过来
}
catch (Exception ex)//捕获异常
{
Console.WriteLine(ex.Message);
break;
}
IPAddress clientIP = (socConnection.RemoteEndPoint as IPEndPoint).Address;//获取客户端的IP
int clientPort = (socConnection.RemoteEndPoint as IPEndPoint).Port; //获取客户端的端口号
RemoteEndPoint = socConnection.RemoteEndPoint.ToString(); //客户端网络结点号
dic.Add(RemoteEndPoint, socConnection); //添加客户端信息
string message = "you have connected server!";
socConnection.Send(Encoding.UTF8.GetBytes(message));//给客户端发送一个消息,表示客户端与服务器已建立连接
Console.WriteLine(RemoteEndPoint);//输出客户端IP地址和端口号
}
}
}
}
客户端代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace Client
{
class Client
{
static void Main(string[] args)
{
while (true)//持续不断的监听,也可采用其他形式,如线程
{
try
{
Socket tcpClient = null;
tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //定义一个套字节监听 包含3个参数(IP4寻址协议,流式连接,TCP协议)
IPAddress ipaddress = IPAddress.Parse("10.123.456.789");//定义IP
EndPoint point = new IPEndPoint(ipaddress, 1234); //将IP地址和端口号绑定到网络节点point上
tcpClient.Connect(point); //客户端套接字连接到网络节点
while (true)//持续监听服务端发来的消息
{
try
{
byte[] receiveMessage = new byte[1024 * 1024]; //定义一个1M的内存缓冲区,用于临时性存储接收到的消息
int length = tcpClient.Receive(receiveMessage); //将客户端套接字接收到的数据存入内存缓冲区,并获取长度
string strRevMsg = Encoding.UTF8.GetString(receiveMessage, 0, length); //将套接字获取到的字符数组转换为字符串
Console.WriteLine(strRevMsg);//输出接收到服务器端的消息
}
catch (Exception ex)//捕获异常
{
Console.WriteLine(ex);
}
}
}
catch (Exception ex)//捕获异常
{
Console.WriteLine(ex);
}
}
}
}
}
若有写的不够好的地方,欢迎留言,请多多指教,谢谢!