1.基于Tcp协议的Socket通讯类似于B/S架构,面向连接,不同的是服务器端可以向客户端主动的推送消息
流程顺序。可靠性高
(1)建立一个套接字(Socket)
(2)绑定服务器端IP地址及端口号-服务器端
(3)利用Listen()方法开启监听-服务器端
(4)利用Accept()方法等待客户端连接-服务器端
(5)Connect()方法与服务器端建立连接-客户端
(6)Send()方法向建立连接的主机发送消息
(7)Recive()方法接收来自建立连接的主机的消息
(8)closesocket关闭套接字
2.基于Udp的协议是无连接的。占用资源少,响应速度快,延迟低。(不可靠连接)。数据报模式
流程顺序
(1)建立一个套接字(Socket)
(2)绑定服务器端IP地址及端口号-服务器端
(3)通过SendTo()方法向制定的主机发送消息
(4)通过ReciveFrom()方法接收指定主机发送的消息
3.Tcplistener和Tcpclient进行通信
通过listener来创建socket,与客户端进行通信。
Tcplistener和Tcpclient利用NetWorkStream类表示网络。使用GetStream方法返回网络流,
然后调用该流的Read和Write方法,对数据进行读取和写入。
Tcplistener和Tcpclient中维护了一个Socket对象。
服务器
TcpListener创建传入IP和Port,start开始监听,AccptTcpClient方法得到客户端的连接返回一个TcpClientduixiang
调用这个TcpClient对象中的GetStream方法得到一个NetworkStream,一个网络流。使用这个网络流的Read方法
得到byte类型的数据。
class Program
{
static void Main(string[] args)
{
//1.TcpListener对socket进行了一层封装,在这个类中自己会去创建socket对象
TcpListener listener = new TcpListener(IPAddress.Parse("192.168.1.103"), 7788);
//2.开始监听
listener.Start();
//3.等待客户端连接过来
TcpClient client = listener.AcceptTcpClient();
//4.取得客户端发送过来的数据
NetworkStream stream = client.GetStream();//得到了一个网络流,从这个网络流可以取得客户端发送过来的数据
byte[] data = new byte[1024];
while (true)
{
int length = stream.Read(data, 0, 1024);//读取数据.参数:0是从哪个索引开始存放数据,1024最大读取的字节数。返回值为实际读取的数据
string message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine("Get message:" + message);
}
//5.释放资源
stream.Close();
client.Close();
listener.Stop();
Console.ReadKey();
}
}
客户端
通过创建TcpClient建立跟服务器的连接,通过GetStream方法,获得stream流,调用Write方法写入数据,传送信息给服务器
class Program
{
static void Main(string[] args)
{
//当我们创建tcpclient对象的时候,就会跟server去建立连接
TcpClient client = new TcpClient("192.168.1.103", 7788);
NetworkStream stream = client.GetStream();
//read读取数据,write写入数据
//利用一个死循环,重复向服务器端发送数据
while (true)
{
string message = Console.ReadLine();
byte[] data = Encoding.UTF8.GetBytes(message);
stream.Write(data, 0, data.Length);
}
stream.Close();
client.Close();
Console.ReadKey();
}
}
4.udpclient
udp只有一个类
Server端
创建UdpClient绑定ip和port
创建一个IPEndPoint存储接收到的数据来自什么ip和port
class Program
{
static void Main(string[] args)
{
//创建udpclient绑定ip跟端口号
UdpClient udpClient = new UdpClient
(new IPEndPoint(IPAddress.Parse("192.168.1.103"), 7788));
while (true)
{
//接收数据
IPEndPoint point = new IPEndPoint(IPAddress.Any, 0);
byte[] data = udpClient.Receive(ref point);//通过point确定数据来自哪个ip的哪个端口号
string message = Encoding.UTF8.GetString(data);
Console.WriteLine("Get Msg:" + message);
}
udpClient.Close();
Console.ReadKey();
}
}
客户端
创建UdpClient,使用Send方法将数据传输给制定的IP和Port
class Program
{
static void Main(string[] args)
{
UdpClient client = new UdpClient();
while (true)
{
string message = Console.ReadLine();
byte[] data = Encoding.UTF8.GetBytes(message);
client.Send(data, data.Length, new IPEndPoint(IPAddress.Parse("192.168.1.103"), 7788));
}
client.Close();
Console.ReadKey();
}
}