zoukankan      html  css  js  c++  java
  • .Net之美读书笔记10(网络编程一)

    网络编程(Socket)

    这里对网络编程做下简单的整理,填补下自己这方面的知识空白。如果想了解请参考张子阳的.Net之美.


    概念讲述

    • TCP:面向连接的传输协议(网络协议的一种)
    • 远程主机: 跨进程访问即为远程访问
    • 套接字: 传输层与应用层的纽带,可使应用层编程不用关心传输层

    服务器与客户端链接

    服务端开启监听服务,客户端链接服务端。新建两个控制台程序Server/Client。
    Server:

    static void Main(string[] args)
    		{
    			Console.WriteLine("Server is running ...");
    			IPAddress ip = IPAddress.Parse("127.0.0.1");
    			int port = 8500;
    
    			TcpListener listener = new TcpListener(ip, port);
    			listener.Start();
    
    			Console.WriteLine("
    
     Enter "Q" exit.");
    			ConsoleKey key;
    			do
    			{
    				key = Console.ReadKey(true).Key;
    			} while (key != ConsoleKey.Q);
    		}
    

    Client:

    static void Main(string[] args)
    		{
    			Console.WriteLine("Client Running");
    
    			TcpClient client = new TcpClient();
    
    			IPAddress serverIp = IPAddress.Parse("127.0.0.1");
    			int serverPort = 8500;
    
    			try
    			{
    				client.Connect(serverIp, serverPort);
    			}
    			catch (Exception ex)
    			{
    				Console.WriteLine(ex.Message);
    				return;
    			}
    
    			Console.WriteLine("Server Connected!{0} --> {1}", client.Client.LocalEndPoint, client.Client.RemoteEndPoint);
    
    			Console.WriteLine("
    
     Enter "Q" exit.");
    			ConsoleKey key;
    			do
    			{
    				key = Console.ReadKey(true).Key;
    			} while (key != ConsoleKey.Q);
    		}
    

    命令行运行netstat -a查看端口连接状态

    服务端获取客户端链接

    AcceptTcpClient()为阻塞方法,调用后线程等待客户端链接
    Server:

    		static void Main(string[] args)
    		{
    			Console.WriteLine("Server is running ...");
    			IPAddress ip = IPAddress.Parse("127.0.0.1");
    			int port = 8500;
    
    			TcpListener listener = new TcpListener(ip, port);
    			listener.Start();
    			Console.WriteLine("Start Listening ...");
    
    			//目的获取多个客户端信息
    			while(true)
    			{
    				try
    				{
    					//获取一个连接,中断方法(等待客户端的链接)
    					TcpClient remoteClient = listener.AcceptTcpClient();
    					//打印链接到的客户端信息
    					Console.WriteLine("Client Connected!{0}<-{1}", remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);
    				}
    				catch (Exception ex)
    				{
    					Console.WriteLine("Error:" + ex.Message);
    				}
    			}
    		}
    

    客户端发送信息服务端接受

    Server:

    static void Main(string[] args)
    		{
    			int BufferSize = 8192;
    
    			Console.WriteLine("Server is running ...");
    			IPAddress ip = IPAddress.Parse("127.0.0.1");
    			int port = 8500;
    
    			TcpListener listener = new TcpListener(ip, port);
    			listener.Start();
    			Console.WriteLine("Start Listening ...");
    
    			//目的获取多个客户端信息
    			while(true)
    			{
    				try
    				{
    					//获取一个连接,中断方法(等待客户端的链接)
    					TcpClient remoteClient = listener.AcceptTcpClient();
    					//打印链接到的客户端信息
    					Console.WriteLine("Client Connected!{0}<-{1}", remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);
    
    					//获得流并写入buffer中
    					NetworkStream streamToClient = remoteClient.GetStream();
    					byte[] buffer = new byte[BufferSize];
    					int bytesRead = streamToClient.Read(buffer, 0, buffer.Length);
    					Console.WriteLine("Reading data,{0}bytes",bytesRead);
    
    					//获得请求的字符串
    					string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
    					Console.WriteLine("Received:{0}",msg);
    				}
    				catch (Exception ex)
    				{
    					Console.WriteLine("Error:" + ex.Message);
    				}
    			}
    		}
    

    Client:

    static void Main(string[] args)
    		{
    			Console.WriteLine("Client Running");
    
    			TcpClient client = new TcpClient();
    
    			IPAddress serverIp = IPAddress.Parse("127.0.0.1");
    			int serverPort = 8500;
    
    			try
    			{
    				client.Connect(serverIp, serverPort);
    			}
    			catch (Exception ex)
    			{
    				Console.WriteLine(ex.Message);
    				return;
    			}
    
    			Console.WriteLine("Server Connected!{0} --> {1}", client.Client.LocalEndPoint, client.Client.RemoteEndPoint);
    
    			string msg = ""Welcome To TraceFact.Net"";
    			NetworkStream streamToServer = client.GetStream();
    
    			byte[] buffer = Encoding.Unicode.GetBytes(msg);
    			streamToServer.Write(buffer, 0, buffer.Length);
    			Console.WriteLine("Sent:{0}",msg);
    			Console.WriteLine("
    
     Enter "Q" exit.");
    			ConsoleKey key;
    			do
    			{
    				key = Console.ReadKey(true).Key;
    			} while (key != ConsoleKey.Q);
    		}
    
  • 相关阅读:
    力扣(LeetCode) 14. 最长公共前缀
    力扣(LeetCode)965. 单值二叉树
    力扣(LeetCode)258. 各位相加
    力扣(LeetCode)389. 找不同
    PTA 阶乘之和取模
    A. Sea Battle
    PTA 二叉树路径
    PTA 重构二叉树
    PTA 笛卡尔树
    绿豆蛙的归宿
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/8317379.html
Copyright © 2011-2022 走看看