套接字和数据流
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();
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();
相关文章推荐
- 基于数据流的原始套接字
- 黑马程序员--数据流与套接字
- vbs 二进制数据流转换字符串的方法
- APUE笔记---网络IPC:socket套接字使用+聊天程序
- 网络编程之-原始套接字
- 前后端数据流导向
- 把获得的数据流转换成一副图片(Bitmap)
- 简单的,使用套接字实UDP通信(循环服务器)
- 以原始套接字的方式 截获流经本机网卡的IP数据包
- 关于串口的字符串输出和二进制数据流输出
- Java解析网络数据流的三种特殊方法
- 套接字
- 套接字I/O模式和I/O模型
- 套接字Socket
- 为SSIS编写自定义数据流组件(DataFlow Component)之进阶篇:自定义编辑器
- ios代码静态分析工具有哪些,我主要想获得控制流和数据流
- TCP/IP协议的套接字类型及异步winsock编程例子
- socket网络编程中常用的SO_KEEPALIVE套接字选项
- 网络编程进阶--非网络通信套接字
- 基于流式套接字实现文件传输