您的位置:首页 > 其它

套接字和数据流

2014-01-11 20:17 155 查看

套接字和数据流操作

 

1套接字

套接字有3种不同的类型:流套接字、数据报套接字和原始套接字。流套接字用来实现面向连接的TCP通信,数据报套接字实现无连接的UDP通信,原始套接字实现Ip数据包通信。3种套接字的套接字均可以使用System.Net.Sockets命名空间中的Socket类来实现。

1、  addressFamily表示网络类型,该参数使用AddressFamily枚举指定Socket使用的寻址方案。

2、  socketType指定Socket的类型,该参数使用SocketType枚举指定使用哪种套接字。

3、  protocolType指定Socket使用的协议,该参数使用ProctocolType枚举指定使用哪种协议。

套接字之间的连接过程可以分为3个步骤:服务器监听、客户端请求、连接确认。

服务器监听是指服务器套接字并不定位具体的客户端套接字,而是出于等待连接的状态,实时监控网络状态。

客户端请求是指客户端的套接字提出连接请求,要连接的目标是服务器的套接字。为此,客户端的套接字必须首选描述他要连接的服务器的套接字,指出服务器套接字的地址和端口号,然后再向服务器套接字提出连接请求。

连接确认是指当服务器套接字监听到客户端套接字的连接请求时,它就响应客户端套接字的请求,把服务器套接字的信息发给客户端,一旦客户端确认了信息,连接即可建立。而服务器套接字继续监听其他客户端套接字的连接请求。

4、  建立连接

5、  服务器和客户端通信的前提是服务器首先在指定的端口监听是否有客户端连接请求,当客户端向服务器发出请求,服务器接受请求后,双方即可建立连接。

( 1)服务器端编程。在服务器程序中,首先应创建一个本地套接字对象。

Socket localSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

            //然后将套接字绑定到用于TCP通信的本地IP地址和端口上。Bind方法用于完成绑定工作。

            IPAddress ipAddress = Dns.GetHostAddresses(" ")[0];

            IPEndPoint ipe = newIPEndPoint(ipAddress,56000);

           localSocket.Bind(ipe);

2、数据流

数据流Stream是对串行传输数据的一种抽象表示。

FileStream文件流,位于System.IO命名空间,FileStream类的实例实际

流提供以下3种基本操作:

写入:将数据从内存缓冲区传输到外部源。

读取:将数据从外部源传输到内存缓冲区。

查找:重新设置流的当前位置,以便随机读写。需要注意的是,并不是所有的流类型都能够支持查找,如网络流没有当前位置的概念,因此不支持查找功能。

Stream类及其派生类都提供了Read和Write方法,可支持字在字节级别上对数据进行读写。Read方法从当前流读取字节序列,Write方法向当前流中写入字节序列。但是仅支持字节级别的数据转化为字节数组之后才能调用Write方法写入流。

(1)      文件流

语法:FileStream(stringpath,FileMode mode,FileAccess access)

参数说明:

path指明文件文件所在的路径信息。

FileMode值用于指定当文件不存在时是否创建该文件,并确定是保留还是改写现有文件的内容,其枚举成员的含义如表:

CreateNew指定操作系统应创建新文件,如果文件已存在,则将引发IOExeception

Create指定操作系统应创建新文件,如果文件已存在,它将被覆盖

Open指定操作系统应打开现有文件。如果该文件不存在,则引发FileNotFoundException

OpenOrCreate指定操作系统应打开文件(如果文件存在);否则,应创建新文件

Truncate指定现有文件并查找到文件尾,或创建新文件。FileMode.Append只能同FileAccess.Write

Append打开现有文件并查找到文件尾,或创建新文件。FileMode.Append只能同FIleAccess.Write一起使用

FileAccess值是枚举的一个成员,它控制对文件的访问权限。

Read 打开文件,用于只读

Write 打开文件,用于只写

ReadWrite打开文件,用于读写

(2)      文件读取

static void Main(string[] args)

        {

            FileStream fs;

            //读取文件所在路径

            string filePath = "c:\\file1.txt";

         //打开文件

            try

            {

                fs = new FileStream(filePath ,FileMode.Open);

            }

            catch (Exception)

          {

                Console.WriteLine("文件打开失败");

                return;

            }

            long left = fs.Length;//尚未读取的文件内容长度

            byte[] bytes=new byte[100];//存储读取结果

            int maxLength = bytes.Length;//每次读取长度

            int start = 0;//读取位置

            int num = 0;//实际返回结果长度

            while (left>0)//当文件未读取长度大于0时,不断进行读取

            {

                fs.Position = start;

                num = 0;

                if (left<maxLength)

              {

                    num = fs.Read(bytes,0,Convert.ToInt32(left));

 

                }

                else

                {

                    num = fs.Read(bytes,0,maxLength);

                }

                if (num==0)

                {

                    break;

                }

                start += num;

                left -= num;

                Console.WriteLine(Encoding.UTF8.GetString(bytes));

            }

            Console.ReadLine();

            fs.Close();

 

字节转化为字符串。由于FileStream类的Read方法将文件中的数据读取到字节数组中,为了将这些数据以字符串的形式输出。需要利用解码技术将字节数组转化为字符串,再进行输出:

Console.WriteLine(Encoding.UTF8.GetString(bytes));

由于磁盘文件可能占用空间比较大,比如单个视频文件大小经常超出1G。此时如果直接将文件中的所有数据读入内存是一个很危险的操作。所以在对文件进行读取时,我们一般建议一个较小的字节数组作为缓冲区,分块循环读取。

3、写文件

Stream类及其所有子类都提供了Write方法,FileStream类也不例外。该方法可将字节数组写入流。

public  override voidWrite{

byte[] buffer,//包含要写入流的数据

int offset,//buffer中开始写入数据的位置

int size//要写入流的字结束

}

项目实例:

 FileStream fs = null;

            string file
4000
path = "D:\\file1.txt";

            Encoding encoder = Encoding.UTF8;//将待写入数据从字符串转换为字节数组

            Byte[] bytes = encoder.GetBytes("HelloWorld!\n\r");

            try

            {

                fs = File.OpenWrite(filepath);//设定书写的开始位置为文件的末尾

                fs.Position = fs.Length;//将待写入内容追加到文件末尾

                fs.Write(bytes, 0, bytes.Length);

            }

            catch (Exception ex)

            {

                Console.WriteLine("文件打开失败{0}", ex.ToString());

            }

            finally

            {

                fs.Close();

            }

            Console.ReadLine();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: