c# winform socket网络编程点对点传输文件socket文件传输监听端口Word文档格式.docx
《c# winform socket网络编程点对点传输文件socket文件传输监听端口Word文档格式.docx》由会员分享,可在线阅读,更多相关《c# winform socket网络编程点对点传输文件socket文件传输监听端口Word文档格式.docx(62页珍藏版)》请在冰点文库上搜索。
20.
Form1()
21.
22.
InitializeComponent();
23.
24.
25.
//不显示出dataGridView1的最后一行空白
26.
dataGridView1.AllowUserToAddRows
=
false;
27.
}
28.
29.
30.
#region
定义变量
31.
32.
33.
#endregion
34.
35.
36.
37.
进入窗体即启动服务
38.
39.
private
void
Form1_Load(object
sender,
EventArgs
e)
40.
41.
//开启接收线程
42.
Thread
TempThread
new
Thread(new
ThreadStart(this.StartReceive));
43.
TempThread.Start();
44.
45.
46.
47.
48.
49.
50.
51.
功能函数
52.
53.
StartReceive()
54.
55.
//创建一个网络端点
56.
IPEndPoint
ipep
IPEndPoint(IPAddress.Any,
int.Parse("
2005"
));
57.
58.
//MessageBox.Show(IPAddress.Any);
59.
60.
//创建一个套接字
61.
Socket
server
Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
62.
63.
//绑定套接字到端口
64.
server.Bind(ipep);
65.
66.
//开始侦听(并堵塞该线程)
67.
server.Listen(10);
68.
69.
//确认连接
70.
client
server.Accept();
71.
72.
//获得客户端节点对象
73.
clientep
(IPEndPoint)client.RemoteEndPoint;
74.
75.
76.
77.
//获得[文件名]
78.
string
SendFileName
System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
79.
//MessageBox.Show("
文件名"
+
SendFileName);
80.
81.
//获得[包的大小]
82.
bagSize
83.
包大小"
bagSize);
84.
85.
//获得[包的总数量]
86.
int
bagCount
int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)));
87.
包的总数量"
bagCount);
88.
89.
//获得[最后一个包的大小]
90.
bagLast
91.
最后一个包的大小"
bagLast);
92.
93.
//创建一个新文件
94.
FileStream
MyFileStream
FileStream(SendFileName,
FileMode.Create,
FileAccess.Write);
95.
96.
//已发送包的个数
97.
SendedCount
0;
98.
99.
while
(true)
100.
101.
byte[]
data
TransferFiles.ReceiveVarData(client);
102.
if
(data.Length
==
0)
103.
104.
break;
105.
106.
else
107.
108.
SendedCount++;
109.
//将接收到的数据包写入到文件流对象
110.
MyFileStream.Write(data,
0,
data.Length);
111.
//显示已发送包的个数
112.
已发送包个数"
+SendedCount.ToString());
113.
114.
115.
116.
//关闭文件流
117.
MyFileStream.Close();
118.
//关闭套接字
119.
client.Close();
120.
121.
//填加到dgv里
122.
//文件大小,IP,已发送包的个数,文件名,包的总量,最后一个包的大小
123.
this.dataGridView1.Rows.Add(bagSize,
clientep.Address,
SendedCount,
SendFileName,
bagCount,
124.
125.
文件接收完毕!
"
);
126.
127.
128.
129.
130.
131.
132.
133.
134.
拦截Windows消息,关闭窗体时执行
135.
protected
override
WndProc(ref
Message
m)
136.
137.
const
WM_SYSCOMMAND
0x0112;
138.
SC_CLOSE
0xF060;
139.
(m.Msg
&
(int)m.WParam
SC_CLOSE)
140.
{//捕捉关闭窗体消息
141.
//
User
clicked
close
button
142.
//this.WindowState
FormWindowState.Minimized;
//把右上角红叉关闭按钮变最小化
143.
144.
ServiceStop();
145.
146.
base.WndProc(ref
m);
147.
148.
149.
150.
151.
停止服务
152.
153.
//停止服务
154.
ServiceStop()
155.
156.
try
157.
158.
159.
160.
catch
{
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.}
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Net;
usingSystem.Threading;
usingSystem.Net.Sockets;
usingSystem.IO;
namespaceTestSocketServerHSTF
{
publicpartialclassForm1:
Form
{
publicForm1()
{
InitializeComponent();
//不显示出dataGridView1的最后一行空白
dataGridView1.AllowUserToAddRows=false;
}
#region定义变量
#endregion
#region进入窗体即启动服务
privatevoidForm1_Load(objectsender,EventArgse)
//开启接收线程
ThreadTempThread=newThread(newThreadStart(this.StartReceive));
TempThread.Start();
#region功能函数
privatevoidStartReceive()
//创建一个网络端点
IPEndPointipep=newIPEndPoint(IPAddress.Any,int.Parse("
//MessageBox.Show(IPAddress.Any);
//创建一个套接字
Socketserver=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//绑定套接字到端口
server.Bind(ipep);
//开始侦听(并堵塞该线程)
server.Listen(10);
//确认连接
Socketclient=server.Accept();
//获得客户端节点对象
IPEndPointclientep=(IPEndPoint)client.RemoteEndPoint;
//获得[文件名]
stringSendFileName=System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
//MessageBox.Show("
+SendFileName);
//获得[包的大小]
stringbagSize=System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
+bagSize);
//获得[包的总数量]
intbagCount=int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)));
+bagCount);
//获得[最后一个包的大小]
stringbagLast=System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
+bagLast);
//创建一个新文件
FileStreamMyFileStream=newFileStream(SendFileName,FileMode.Create,FileAccess.Write);
//已发送包的个数
intSendedCount=0;
while(true)
{
byte[]data=TransferFiles.ReceiveVarData(client);
if(data.Length==0)
{
break;
}
else
SendedCount++;
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data,0,data.Length);
//显示已发送包的个数
//MessageBox.Show("
}
//关闭文件流
MyFileStream.Close();
//关闭套接字
client.Close();
//填加到dgv里
//文件大小,IP,已发送包的个数,文件名,包的总量,最后一个包的大小
this.dataGridView1.Rows.Add(bagSize,clientep.Address,SendedCount,SendFileName,bagCount,bagLast);
#region拦截Windows消息,关闭窗体时执行
protectedoverridevoidWndProc(refMessagem)
constintWM_SYSCOMMAND=0x0112;
constintSC_CLOSE=0xF060;
if(m.Msg==WM_SYSCOMMAND&
(int)m.WParam==SC_CLOSE)
{//捕捉关闭窗体消息
//Userclickedclosebutton
//this.WindowState=FormWindowState.Minimized;
//把右上角红叉关闭按钮变最小化
ServiceStop();
base.WndProc(refm);
#region停止服务
//停止服务
privatevoidServiceStop()
try
catch{}
}
}
客户端用来发送文件,选择文件后点发送按钮发送文件
客户端代码:
1.////////////////////////////////////////////////////////////////////////////////
2.//title:
点对点文件传输程序
//
3.////////////////////////////////////////////////////////////////////////////////
4.
5.//////////////////////////Begin-发送端//////////////////////////////////
8.using
System.Collections;
9.using
13.using
15.using
16.
17.namespace
发送端
18.{
///
<
summary>
的摘要说明。
/summary>
System.Windows.Forms.Form
System.Windows.Forms.GroupBox
groupBox1;
System.Windows.Forms.OpenFileDialog
openFileDialog1;
System.Windows.Forms.TextBox
textBox1;
System.Windows.Forms.Button
button1;
System.Windows.Forms.Label
la