1 TCP的应用编程服务器端重要笔记 2 1. TcpListener类用于侦听和接受传入的连接请求。 3 TcpClient类用于提供本地主机和远程主机的连接信息。 4 2.TcpClient类 5 主要用于编写客户端程序,且需要直接利用构造函数创建TcpClient对象。 6 构造函数有四种重载形式 7 TcpClient() 8 TcpClient(AddressFamily family) 9 TcpClient(IPEndPoint iep) 10 TcpClient(string hostname,int port)11 (1)TcpClient():12 /-------该构造函数创建一个默认的TcpClient对象,并自动分配本机(客户端IP地址和端口号。---------/13 TcpClient tcpClient=new TcpClient();14 tcpClient.Connect("www.abcd.com", 51888);15 16 (2)TcpClient(AddressFamily family):17 /------AddressFamily枚举指定使用哪种网络协议。-------/18 TcpClient tcpClient = new TcpClient(AddressFamily.InterNetwork);19 tcpClient.Connect("www.abcd.com", 51888);20 21 (3)TcpClient(IPEndPoint iep):22 /------该构造函数的参数iep指定本机(客户端)IP地址与端口号。当客户端有一个以上的IP地址时,而且程序员希望直接指定使用的IP地址和端口号,可以使用这种方式。如果使用这种方式--------/23 IPAddress[] address = Dns.GetHostAddresses(Dns.GetHostName());24 IPEndPoint iep = new IPEndPoint(address[0], 51887);25 TcpClient tcpClient = new TcpClient(iep);26 tcpClient.Connect("www.abcd.com", 51888);27 28 (4)TcpClient(string hostname,int port)29 /------- 这是使用最方便的一种构造函数。参数中的hostname表示要连接到的远程主机的DNS名,port表示要连接到的远程主机的端口号。该构造函数会自动分配最合适的本地主机IP地址和端口号,并对DNS进行解析,然后与远程主机建立连接---------/30 TcpClient tcpClient = new TcpClient("www.abcd.com", 51888);31 32 3.TcpClient对象中的GetString()方法可以获得NetworkStream对象33 例如:this.client = client;34 NetworkStream networkStream = client.GetStream();35 而在服务器与客户之间的传输数据要用到NetworkStream对象36 例如: public BinaryReader br;37 public BinaryWriter bw;38 br = new BinaryReader(networkStream); /*以上是user类当中的成员变量和构造方法当39 bw = new BinaryWriter(networkStream); 中的代码*/40 String receiveString=null;41 //这里的user对象是TcpListener对象创建后,调用start()方法和AcceptTcpClient()方法获得连接到服务器的TcpClient的对象,具体操作在TcpListener知识点的时候具体阐述42 receiveString=user.br.ReadString();//从网络流中读出字符串,此方法会自动判断字符串长度前缀,并根据长度前缀读出字符串43 44 4.调用string的静态方法Format可以设置输出的格式45 例如:AddItemToListBox(string.Format("开始在{0}:{1}监听客户连接", localAddress, port));46 47 5.String类型的对象的Split()方法可以分解字符串中指定的分割符,分割成几个字符串48 例如:string [] splitString=receiveString.Split(‘,’)//把receiveString字符串按逗号分离开来全部存入string类型的数组当中49 例如:string command = message.Split(',')[0].ToLower();//字符串message以逗号分割成几个子字符串,取第一个子字符串?????????????????50 51 6.String类的对象的Substring(int i)方法可以提取出下标为i至末尾的子字符串52 例如:string talkString = receiveString.Substring(splitString[0].Length + splitString[1].Length + 2);53 54 7.TcpListener对象的创建和使用:55 TcpListener myListener;56 myListener = new TcpListener(localAddress, port);57 myListener.Start();//staty()函数开始监听58 TcpClient newClient = null;59 newClient = myListener.AcceptTcpClient();//在服务器中,TcpClient对象必须要用 AcceptTcpClient();方法获取60 myListener.Stop();//这是停止监听时的代码举例61 62 8.Thread线程的概念和使用:63 (1)服务器监听操作需要建立一个线程;64 (2)服务器在监听操作的线程中,如果有客户端连接则再创建一个线程用于处理与对应用户的交互65 (3)Thread的使用举例:66 例如:Thread myThread = new Thread(ListenClientConnect);67 myThread.Start();68 //在上述的使用当中Thread构造方法中的参数ListenClientConnect是一个方法的指针,即方法的名字,若该方法无参数,则如上述所示创建线程69 例如:Thread threadReceive = new Thread(ReceiveData);70 threadReceive.Start(user);71 //这是在ReceiveData中有参数的情况,只能在Start()方法中输入对应的参数