写在前面
本章目的:实现一个简单的网络程序,了解基本的内容
方法:创建一个服务器端VS工程,一个客户端VS工程(此时开着两个VS!),先运行服务器端工程,再运行客户端工程(“开始执行,不调试)”,看到客户端先向服务器发送字符串,服务器端收到后,将这个字符串返回到客户端,客户端将它打印出来
默认已配置好PHP运行的相关Web环境:
1、Apache
2、MySQL
3、PHP
预览
以下是上述两个工程代码:
服务器端
代码语言:javascript复制using System;
using System.Net;
using System.Net.Sockets;
namespace SimpleServer
{
class Program
{
static void Main()
{
//服务器IP地址,该地址为localhost
string ip = "127.0.0.1";
//服务器端口
int port = 8000;
//try catch:https://www.cnblogs.com/shuaijie/articles/3478750.html
//1、将预见可能引发异常的代码包含在try语句块中。
//2、如果发生了异常,则转入catch的执行。
//3、e参数来获得有关异常的信息
try
{
//获得终端(就是接收设备) using System.Net IPEndPoint类包含应用程序连接到主机上的服务所需的主机和端口信息,
//通过组合服务的主机IP地址和端口号,IPEndPoint类形成到服务的连接点。
//Parse()方法,把点分的十进制IP表示转化成IPAddress类
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ip), port);
//0、创建Socket using System.Net.Sockets
//1、在客户 / 服务器通信模式中,客户端需要主动创建与服务器的Socket(套接字),服务端收到了客户端的请求,
// 也会创建与客户端连接的Socket。Scoket可以看作两端通信的收发器,服务端和客户端都通过Scoket收发数据
//2、对于 IPv4,返回 System.Net.Sockets.AddressFamily.InterNetwork;
// 对于 IPv6,返回 System.Net.Sockets.AddressFamily.InterNetworkV6
//3、SocketType.Stream:(F12可查)支持可靠、 双向、 基于连接的字节流,而无需复制数据,不保留边界。
// 一个 Socket 这种类型的通信与单个对等方并在可以开始通信之前需要远程主机的连接。
//4、ProtocolType.Tcp:(F12可查)传输控制协议。
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//将Socket绑定在终端地址上,Bind:将相关联Socket与本地终结点。
listener.Bind(ipe);
//开始监听,最大允许处理1000个连接
listener.Listen(1000);
Console.WriteLine("开始监听");
//开始接受客户端请求 程序在这里会堵塞
//Accept:创建一个新Socket为新创建的连接。
Socket mySocket = listener.Accept();
byte[] bs = new byte[1024];
//Receive:接收来自绑定的 Socket 的数据,bs是接收到的数据的存储位置
int n = mySocket.Receive(bs);
//也可写成:mySocket.Receive(bs);
//客户端发来的数据返回给客户端
//Send:将数据发送到连接Socket。
mySocket.Send(bs);
//关闭与客户端的连接
mySocket.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
客户端
代码语言:javascript复制using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SimpleClient
{
class Program
{
static void Main()
{
//服务器IP地址
string ip = "127.0.0.1";
//服务器端口
int port = 8000;
try
{
//获得终端
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ip), port);
//创建Socket
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//开始接受客户端请求 程序在这里会堵塞
//Connect: 建立与远程主机的连接。
client.Connect(ipe);
Console.WriteLine("连接到服务器");
//向服务器发送数据
string data = "hello,world";
byte[] bs = UTF8Encoding.UTF8.GetBytes(data);
client.Send(bs);
//用一个数组保存服务器返回的数据
byte[] rev = new byte[256];
//接收到服务器返回的数据
client.Receive(rev);
//UTF8Encoding.UTF8.GetString:将字节数组中的一系列字节解码为字符串。
Console.WriteLine(UTF8Encoding.UTF8.GetString(rev));
//关闭连接
client.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}