![](https://csdnimg.cn/release/download_crawler_static/86288289/bg3.jpg)
实验四 3
2. 文件流与网络流的读写;
3. 数据传输过程控制与进度显示;
使用 TCP 的网络通信程序需要双方连接配对,服务端程序首先要先执行 Socket 类的 bind
方法完成端口绑定,绑定时要指定网络端口值,而客户端需要指明要连接的服务器的端口值。
接下来执行
Socket
类的
listen
方法使套接字对象处于监听状态,
listen
方法中的参数值指明
允许的最大连接数。客户端采用 Socket 类的 Connect 方法向服务器发起连接,服务端将发生
Accept 事件,可使用 Socket 的 BeginAccept 方法实现异步操作,该方法需要已定义的回调函
数,这个回调函数响应连接请求后被调用,驱动程序创建新的 Socket 对象用于与客户端传输数
据。
数据的传输是通过 Read 和 Write 方法实现的,网络硬件设备提供的只是数据的发送和接
收服务,而网络设备随着网络吐吞表现会有变化,发送方的 Write 方法与读取方的 Read 方法
很难存在严格的一一对应关系,比如发送方多次使用 Write 方法而接收方可能一次 Read 方法
可接受完毕,程序逻辑要能够适应这种次数的不对应要求。常规方法是首先将文件大小信息发
送给接收者,双方都通过文件长度值控制数据读写完全。文件的长度信息是用长整型数类型表
示,在传送前要转化为字节序列,接收方则要对接收到的字节序列还原为长整型数。通过文件
长度值控制发送与接收的循环,直到文件传送完成。
网络通信任务属耗时操作宜采用工作线程方式执行,工作线程向窗体发消息的方式实现把
当前传输进度通知窗体线程。
4.4 实验内容
在本实验中只有一个客户端连接到服务端,客户端打开文件,读取文件内容到字节数组中,
将字节数组内容写入到网络流。
4.4.1 客户端程序
创建窗体应用程序,添加一个文件选择对话框,一个进度条控件,首先添加变量声明部分:
//文件发送客户端,负责与服务器连接,传送文件
public static IntPtr main_wnd_handle;
public static IntPtr main_label2_handle;
public static String tran_file_name;
[DllImport("User32.dll", EntryPoint = "PostMessage")]
private static extern int PostMessage(
IntPtr hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
int lParam // second message parameter
);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(
IntPtr hWnd, // handle to destination window
3