服务器端:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace ServerConsole { class Program { static void Main(string[] args) { //建立服务器端,通过创建一个TcpListener类型的实例来创建服务期短端 Console.WriteLine("server is running..."); IPAddress ip = , , , }); //(1)使用本机Ip地址和端口号创建一个System.Net.Sockets.TcpListener类型的实例 TcpListener listener = ); //(2)开始侦听,开启对指定端口的侦听。 listener.Start(); Console.WriteLine("server is listening...."); while (true) { //服务端获取客户端连接,可以在TcpListener实例上调用AcceptTcpClient()来获取与一个客户端的连接, //它返回一个TcpClient类型实例。此时它所包装的是由服务端去往客户端的Socket,而我们在客户端创建的TcpClient则是由客户端去往服务端的。 TcpClient tcpClient = listener.AcceptTcpClient(); Console.WriteLine("client connect:RemoteEndPoint:" + tcpClient.Client.RemoteEndPoint + "\nLocalEndPoint:" + tcpClient.Client.LocalEndPoint); } } } }
客户端:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; namespace ClientConsole { class Program { static void Main(string[] args) { //创建客户端,通过创建一个TcpClient的类型实例来创建客户端。 //每创建一个新的TcpClient便相当于创建了一个新的套接字Socket去与服务端通信,.Net会自动为这个套接字分配一个端口号 //共有两种连接方式, //(1)创建TcpClient类型实例时,可以在构造函数中指定远程服务器的地址和端口号。这样在创建的同时,就会向远程服务端发送一个连接请求(“握手”), //一旦成功,则两者间的连接就建立起来了。 //(2)也可以使用重载的无参数构造函数创建对象,然后再调用Connect()方法,在Connect()方法中传入远程服务器地址和端口号,来与服务器建立连接。 //而本程序使用的就是第二种。 try { int i; ; i < ; i++) { TcpClient client = new TcpClient(); client.Connect(); // 打印连接到的服务端信息 //TcpClient的Client属性返回了一个Socket对象,它的LocalEndPoint和RemoteEndPoint属性分别包含了本地和远程的地址信息。 Console.WriteLine("server is connected,\nRemoteEndPoint:" + client.Client.RemoteEndPoint + "\nLocalEndPoint:" + client.Client.LocalEndPoint); } }catch(Exception ex) { Console.WriteLine(ex.ToString()); } //多个客户端与服务端连接,因为我们说过一个TcpClient就是一个Socket,所以我们只要创建多个TcpClient,然后再使用connect()连接到服务器端即可。 Console.ReadKey(); } } }