.NET技术之美-网络编程

概要

.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多个请求

posted @ 2015-03-24 16:01  草旅虫  阅读(390)  评论(0编辑  收藏  举报