C#已经为我们封装了简单易用的Socket,在这基础上更封装了TcpListener,TcpClient,UdpClient这三个类。这里就是用四个类来实现最简单的TCP和UDP。
1.Socket TCP
(1)服务端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
class Program
{
/*
1:建立一个Socket对像;
2:用socket对像的Bind()方法绑定EndPoint;
3:用socket对像的Listen()方法开始监听;
4:接受到客户端的连接,用socket对像的Accept()方法创建新的socket对像用于和请求的客户端进行通信;
5:用新的socket对象接收(Receive)和发送(Send)消息。
*/
static void Main(string[] args)
{
//1. 寻址方案 套接字类型 协议类型
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.
IPAddress ipaddress = IPAddress.Parse("127.0.0.1");
EndPoint endpoint = new IPEndPoint(ipaddress, 8888); //向操作系统申请一份可用的ip和端口号
tcpServer.Bind(endpoint);
//3.
tcpServer.Listen(100); //能同时接收100个客户端的请求
Console.WriteLine("服务器启动完成");
Socket clientSocket = tcpServer.Accept(); //暂停当前线程,直到一个客户端连接过来,返回Socket对象
Console.WriteLine("接收到客户端的连接请求");
//4.
string message = "Hello Client";
var data = Encoding.UTF8.GetBytes(message); //将字符串转成字节数组
clientSocket.Send(data);
Console.WriteLine("我向客户端发送了一条消息:" + message);
byte[] data2 = new byte[1024]; //存放数组的容器
int length = clientSocket.Receive(data2);
string message2 = Encoding.UTF8.GetString(data2, 0, length);
Console.WriteLine("我接收到客户端发来的消息:" + message2);
Console.ReadKey();
}
}
|
(2)客户端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
/*
1:建立一个Socket对像;
2:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;
3:如果连接成功,就用socket对像的Send()方法向服务器发送信息;
4:用socket对像的Receive()方法接受服务器发来的信息 ;
5:通信结束后一定记得关闭socket;
*/
class Program
{
static void Main(string[] args)
{
Socket tcpClient;
string serverIP = "127.0.0.1";
int serverPort = 8888;
//1.
try {
tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 寻址方案 套接字类型 协议类型
//2.
IPAddress ipaddress = IPAddress.Parse(serverIP);
EndPoint endpoint = new IPEndPoint(ipaddress, serverPort);
tcpClient.Connect(endpoint);//发送连接请求
Console.WriteLine("请求服务器连接");
//3.
byte[] data = new byte[1024];
int length = tcpClient.Receive(data);
var message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine("我接收到服务器发来的消息:" + message);
//4.
string message2 = "这是我向服务器发送的消息";
tcpClient.Send(Encoding.UTF8.GetBytes(message2));
Console.WriteLine("我向服务器发送消息:" + message2);
Console.ReadKey();
}
catch (Exception e)
{
Console.WriteLine(e);
Console.ReadKey();
}
}
}
|
2.Socket UDP
(1)服务端(接收端)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
class Program
{
static void Main(string[] args)
{
//1. 寻址方案 套接字类型 协议类型 SocketType.Dgram,无连接。协议UDP。
Socket udpserver = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//2.绑定IP 端口
IPAddress ipaddress = IPAddress.Parse("127.0.0.1");
EndPoint endpoint = new IPEndPoint(ipaddress, 8888);
udpserver.Bind(endpoint);
//3.不用监听,直接接收
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] data = new byte[1024];
while (true) {
int length = udpserver.ReceiveFrom(data, ref remoteEndPoint);
string message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine("服务器接收到客户端发来的消息:" + message);
}
udpserver.Close();
Console.ReadKey();
}
}
|
(2)客户端(发送端)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Program
{
static void Main(string[] args)
{
//1.
Socket udpclient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//2.
IPAddress ipaddress = IPAddress.Parse("127.0.0.1");
EndPoint serverpoint = new IPEndPoint(ipaddress, 8888);
while (true) {
string message = Console.ReadLine();
byte[] data = Encoding.UTF8.GetBytes(message);
udpclient.SendTo(data, serverpoint);//直接发送,不用连接
}
Console.ReadKey();
}
}
|
这里就可以很直观的看出TCP和UDP的区别了,TCP需要建立连接后再传输数据。而UDP则不需要连接,只是向地址发送数据。
3.TcpListener/TcpClient TCP
(1)服务端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
class Program
{
static void Main(string[] args)
{
//1.TcpListener对Socket进行封装,会自己创建一个Socket对象
TcpListener tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8888);
try
{
//2.开始监听
tcpListener.Start();
//3.等待连接
TcpClient tcpClient = tcpListener.AcceptTcpClient();
//4.获取客户端发送的数据
NetworkStream ns = tcpClient.GetStream();
while (true)
{
byte[] date = new byte[1024];
int length = ns.Read(date,0,1024);
string message = Encoding.UTF8.GetString(date, 0, length);
Console.WriteLine("收到信息: "+message);
if (message == "stop") break;
}
ns.Close();
tcpClient.Close();
tcpListener.Stop();
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
|
(2)客户端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public static class Online
{
public static bool IsOnline(this TcpClient c)//该函数用来判断远程主机是否关闭连接
{
return !((c.Client.Poll(1000, SelectMode.SelectRead) && (c.Client.Available == 0)) || !c.Client.Connected);
}
}
class Program
{
static void Main(string[] args)
{
try {
TcpClient tcpClient = new TcpClient("127.0.0.1", 8888);//和远程主机建立连接
NetworkStream ns = tcpClient.GetStream();//通过网络流来传输数据
{
while (Online.IsOnline(tcpClient))
{
string message = Console.ReadLine();
byte[] date = new byte[1024];
date = Encoding.UTF8.GetBytes(message);
ns.Write(date, 0, date.Length);
}
Console.WriteLine("断开连接");
ns.Close();
tcpClient.Close();
}
Console.ReadLine();
}catch(Exception e){
Console.WriteLine(e);
Console.ReadLine();
}
}
}
|
4.UdpClient UDP
(1)服务端(接收端)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class Program
{
static void Main(string[] args)
{
UdpClient udpClient = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"),8888));//绑定本机IP端口
try {
while(true)
{
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] data = udpClient.Receive(ref ipEndPoint);
string message = Encoding.UTF8.GetString(data, 0, data.Length);
Console.WriteLine("收到信息:" + message);
}
}
catch (Exception e)
{
udpClient.Close();
}
}
}
|
(2)客户端(发送端)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class Program
{
static void Main(string[] args)
{
UdpClient udpClient = new UdpClient();
try
{
while (true)
{
//发送数据
string message = Console.ReadLine();
byte[] data = Encoding.UTF8.GetBytes(message);
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127
0.0.1"), 8888);
udpClient.Send(data, data.Length, ipEndPoint);
}
}
catch (Exception e)
{
Console.WriteLine(e);
udpClient.
}
}
}
|