本文共 4063 字,大约阅读时间需要 13 分钟。
客户端代码
using System;using System.Net; // 获取网络信息相关数据使用using System.Net.Sockets; // 定义Socket类的时候使用using System.Text; // 数据转换的时候使用namespace Client{ class MainClass { public static void Main (string[] args) { // 获取主机名字(获取当前电脑的主机名,mac电脑使用hostname命令查看主机名) string hostName = Dns.GetHostName (); Console.WriteLine ("hostName : " + hostName); // 根据主机名获取相关的IP信息(获取本机ip地址) IPHostEntry ipEntry = Dns.GetHostEntry (hostName); // 获取IP地址数组(在计算机网络的技术中,一个主机是可以有多个IP地址的,所以这里是个数组类型) IPAddress[] adds = ipEntry.AddressList; // 遍历输出IP地址及其类型 for (int i = 0; i < adds.Length; i++) { Console.WriteLine ("IP地址[" + i + "]:" + adds [i].ToString ()); // 这里的地址类型是InterNetwork,指的就是我们常说的IPv4地址(例如:192.168.1.1 占32位) // ipv4使用的是十进制方式,ipv6是十六进制(例如:fe80::89b3:30d0:a95c:217e 占128位) Console.WriteLine ("地址类型[" + i + "]:" + adds [i].AddressFamily.ToString ()); } // 功能二: 向某个特定服务器发送消息 // 1.创建Socket实例 Socket client_socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 2.创建连接点IPEndPoint(测试的时候这里不可以写自己的地址哦) string strIP = "192.168.1.102"; // 其实代表的就是网络的终点,也就是我们要连接的服务器地址和端口号【端口号是用来识别应用程序的】 // 如果没有端口号,当电脑受到信息的时候就无法识别这条消息是该发送给QQ还是该发送给微博,类似这个意思 IPEndPoint ipEndPoint = new IPEndPoint (IPAddress.Parse (strIP), 2112); // 3.建立连接 client_socket.Connect (ipEndPoint); // 4.创建数据 string prefix = "Long:"; string content = Console.ReadLine (); // “\r是用来检测ReadLine的Line,但是ReadLine不会自动结束,需要回车,所以\n是用来检测回车的” string suffix = "\r\n"; // 5.数据转换,把字符串转换成比特流(使用System.Text) byte[] beSended = Encoding.UTF8.GetBytes (prefix + content + suffix); // 6.发送数据,将数组发送给ipEndPoint中定义的地址 client_socket.Send (beSended); } }}服务器有两种代码:
【服务器代码方式一】
///【服务器代码方式二】/// MyFirstServer 服务器端程序(Socket实现)/// using System;using System.Net.Sockets;using System.Net;using System.Text;namespace MyFirstServer{ class MainClass { public static void Main (string[] args) { // 1.创建Socket实例 Socket sockte_listen = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 2.创建IPEndPoint IPEndPoint ipEndPoint = new IPEndPoint (IPAddress.Any, 2112); // 3.套接字绑定IpEndPoint sockte_listen.Bind (ipEndPoint); // 4.监听,最大连接数 sockte_listen.Listen (50); // 5.接收客户端信息 while (true) { // 5.1 获取客户端Socket信息 // Accept 以同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,然后创建并返回新的 Socket Socket socket_client = sockte_listen.Accept (); // 客户端的网络地址类型 string clientNetworkType = socket_client.RemoteEndPoint.AddressFamily.ToString(); // 5.2 读取客户端信息 string receive_str = ""; while (true) { // 初始化临时存储数据的byte数组 byte [] datas = new byte[255]; // 调用客户端Socket实例的Receive方法,数据输出给datas socket_client.Receive (datas); // 将二进制数据转化为字符串,并拼接 receive_str += Encoding.UTF8.GetString (datas); // 检查字符串中是否有结束标识(如果不包含的话,返回值是-1) if (receive_str.IndexOf("\r\n") > -1 ) { // receive_str.Contains("\r\n") Console.WriteLine (receive_str); break; } } // 5.3 结束当前客户连接 socket_client.Close (); } } }}
////// MySecondServer 服务器端程序(TcpListener实现)/// using System;using System.Net.Sockets;using System.Net;using System.Text;namespace MySecondServer{ class MainClass { public static void Main (string[] args) { // 1.创建TcpListener实例(监听者) TcpListener listener = new TcpListener (IPAddress.Any, 2112); // 2.开始监听 listener.Start (); // 3.循环处理监听到的客户端 while (true) { // 3.1 获取TcpClient客户端 TcpClient client = listener.AcceptTcpClient (); // 3.2 从客户端获取网络数据流 NetworkStream stream = client.GetStream (); // 3.3 解析数据流 string receive_str = ""; byte[] datas = new byte[1024]; // 循环从网络数据流中获取数据,存到datas数组中 // 参数1:字节数组。参数2:从0开始的字节偏移量,从此处开始存储从当前流中读取到的数据。 // 参数3:要从当前流中最多读取的字节数 // stream.Read的返回值:读入缓冲区中的总字节数。如果当前可用的字节数没有请求的字节数那么多 // 则总字节数可能小于请求的字节数,或者如果已到达流的末尾,则为零 (0)。 while ( stream.Read(datas,0,datas.Length) != 0) { receive_str += Encoding.UTF8.GetString (datas); if (receive_str.IndexOf("\r\n") > -1) { Console.WriteLine (receive_str); break; } } // 3.4 关闭客户端 client.Close (); } } }}
转载地址:http://oukii.baihongyu.com/