概要
.NET框架提供了system.net.*的一系列网络编程,其中system.net.socket主要提供低层TCP,UDP通信,system.Net高层下的通信HTTP,FTP,SMTP通信
1、面向连接的传输协议-TCP
什么是面向连接:首先必须要有一个握手过程,确认连接成功之后才能传输数据.
TCP最大的特点是全双工:就是A与B交互,数据可以从A到B,也可以从B到A
点对点:只能是一对一不能一对多
2、套接字
套接字的两个重要的属性:发起连接的本地IP和端口号,远程的IP地址和端口号
.NET框架中提供了system.net.sockets.socket类,两个帮助类TcpClient和TcpListener
TcpListener持续对端口侦听,如果发现对象,则会生成一个TcpClient对象来处理和发送消息,而且同时TcpListen还会同时监听端口
2.1、server创建并监听接口
console.writerine("server is running"); ipaddress ip=new ipaddress.parse("192.168.0.100"); TcpListen listerner=new TcpListern(ip,8500); listernen.start(); console.writerline("start Listeing..");
2.2、client创建连接和接口
console.writerline("Client is running"); TcpClient client=new TcpClient(); client.connect(ipaddress.parse("192.168.0.100"),8500);
2.3、server端获取客户端连接状态
console.writerine("server is running"); ipaddress ip=new ipaddress.parse("192.168.0.100"); TcpListen listerner=new TcpListern(ip,8500); listernen.start(); console.writerline("start Listeing.."); TcpClient remoteClient=listener.AcceptTcpClient(); console.writerline("client connected!local:{0} <--Client:{1}",remoteClient.client.localendpoint,remoteClient.client.remoteendpoint)
server端获取多个客户端的连接
while(true){ TcpClient remoteClient=listener.AcceptTcpClient(); console.writerline("client connected!local:{0} <--Client:{1}",remoteClient.client.localendpoint,remoteClient.client.remoteendpoint) }
AcceptTcpClient()方法在没有收到客户端的连接的之前,不会向前持行
2.4、同步传输字符串
2.4.1、server端接收
.NET框架提供了TcpClient的getStream()方法获取client连接server的流
const int buffersize=8192; console.writerine("server is running"); ipaddress ip=new ipaddress.parse("192.168.0.100"); TcpListen listerner=new TcpListern(ip,8500); listernen.start(); console.writerline("start Listeing.."); TcpClient remoteClient=listener.AcceptTcpClient(); console.writerline("client connected!local:{0} <--Client:{1}",remoteClient.client.localendpoint,remoteClient.client.remoteendpoint) //// networkstream streamToClient=remoteClient.GetSream(); byte[] buff=new byte[buffersize]; int byteRead=streamToClient.Read(buffer,0,buffersize); string msg=encoding.unncode.getstring(buffer,0,bytesread);
2.4.2、Client发送
同样client需要发送消息,也需要获取server端的流
networkstream streamToServert=client.GetSream();
byte[] buff=new byte[buffersize];
streamToClient.writer(buffer,0,buffersize);
2.5、连接总结
1.不使用do/while,server中只用一个listener.accepttcpclient(),则server端可以出来来自一个client的请求
2.使用一个do/while,将listener.accepttcpclient(),TcpClient.GetStream().Read()方法都放在这个循环内,那么server可以处理多个client,但每个client只能处理一个请求
3.使用一个do/while,将listener.accepttcpclient(),TcpClient.GetStream().Read()方法都放在这个循环外,那么server可以处理一个client多个请求