日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

C# Socket服务端与客户端通信(包含大文件的断点传输)

發布時間:2023/12/18 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# Socket服务端与客户端通信(包含大文件的断点传输) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

步驟:

一、服務端的建立

1.服務端的項目建立以及頁面布局

2.各功能按鍵的事件代碼

  1)傳輸類型說明以及全局變量

  2)Socket通信服務端具體步驟:

?    (1)建立一個Socket

  ?  (2)接收信息

  ?  (3)發送數據(這里分發送字符串、文件(包含大文件)、震動)

二、客戶端的建立

1.服務端的項目建立以及頁面布局

2.各功能按鍵的事件代碼

  1)傳輸類型說明以及全局變量

  2)Socket通信服務端具體步驟:

?    (1)建立一個Socket

  ?  (2)接收信息

  ?  (3)發送數據(這里分發送字符串、文件(包含大文件)、震動)

?

?

注意:此圖是Socket通信的精華,在使用Socket通信時,有什么迷惑的可以看看此圖,下面我們講解的時候也是參照此圖

?

Socket大家肯定很熟悉,對已內部的通信邏輯,肯定也有一定得了解---

對于Socket研究了兩天寫了一個小程序,通過Socket服務端與客戶端的通信,以及大文件之間斷點的傳輸(這里只做了服務端給客戶端傳送大文件,如果想把客戶端的大文件傳送給服務端也是一樣的道理,看了文章,大家肯定可以自己實現)······

(自己才疏學淺,如有bug請諒解,但功能還是能實現的)

下面根據步驟進入正題:

一、服務端的建立

1.服務端的項目建立以及頁面布局

新建解決方案“Socket通信”以及兩個Winform項目(1)SockeClient——客戶端 ? ?(2)SocketServer——服務器

給服務端界面布局——參照上圖(這個大家肯定都是手到擒來就不累贅了······)

2.各功能按鍵的事件代碼

先把整個服務端的代碼貼出來,然后我們在一一講解

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

namespace?SocketServer

{

????public?partial?class?Form1 : Form

????{

?

????????//說明:在傳遞信息的時候,會在需要傳遞的信息前面加一個字符來標識傳遞的是不同的信息

????????// 0:表示傳遞的是字符串信息

????????// 1:表示傳遞的是文件信息

????????// 2:表示的是震動

?

????????/// <summary>

????????/// 用來存放連接服務的客戶端的IP地址和端口號,對應的Socket

????????/// </summary>

????????Dictionary<string, Socket> dicSocket =?new?Dictionary<string, Socket>();

?

????????public?Form1()

????????{

????????????InitializeComponent();

????????}

?

????????private?void?Form1_Load(object?sender, EventArgs e)

????????{

????????????//不檢測跨線程之間的空間調用

????????????Control.CheckForIllegalCrossThreadCalls =?false;

????????}

?

????????/// <summary>

????????/// 開啟監聽

????????/// </summary>

????????/// <param name="sender"></param>

????????/// <param name="e"></param>

????????private?void?btnStart_Click(object?sender, EventArgs e)

????????{

????????????try

????????????{

????????????????//當點擊開始監聽的時候 在服務器端創建一個負責監IP地址跟端口號的Socket

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

????????????????//獲取IP

????????????????IPAddress ip = IPAddress.Any;

????????????????//創建端口號

????????????????IPEndPoint port =?new?IPEndPoint(ip, Convert.ToInt32(txtPort.Text));

????????????????//監聽

????????????????socketWatch.Bind(port);

????????????????ShowMsg("監聽成功");

????????????????socketWatch.Listen(10);

????????????????//新建線程,去接收客戶端發來的信息

????????????????Thread td =?new?Thread(AcceptMgs);

????????????????td.IsBackground =?true;

????????????????td.Start(socketWatch);

????????????}

????????????catch

????????????{

?????????????????

????????????}??????????

????????}

?

????????/// <summary>

????????/// 接收客戶端發送的信息

????????/// </summary>

????????/// <param name="o"></param>

????????private?void?AcceptMgs(object?o)

????????{

????????????try

????????????{

????????????????Socket socketWatc = (Socket)o;

????????????????while?(true)

????????????????{

????????????????????負責跟客戶端通信的Socket

????????????????????Socket socketSend = socketWatc.Accept();

????????????????????//將遠程連接的客戶端的IP地址和Socket存入集合中

????????????????????dicSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);

????????????????????//將遠程連接的客戶端的IP地址和端口號存儲下拉框中

????????????????????cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());

????????????????????ShowMsg(socketSend.RemoteEndPoint.ToString() +?": 連接成功");

????????????????????//新建線程循環接收客戶端發來的信息

????????????????????Thread td =?new?Thread(Recive);

????????????????????td.IsBackground =?true;

????????????????????td.Start(socketSend);

????????????????}

????????????}

????????????catch?{ }

?????????????

????????}

?

????????/// <summary>

????????/// 接收客戶端發來的數據,并顯示出來

????????/// </summary>

????????private?void?Recive(object?o)

????????{

????????????Socket socketSend = (Socket)o;

????????????try

????????????{

????????????????while?(true)

????????????????{

????????????????????//客戶端連接成功后,服務器應該接受客戶端發來的消息

?????????????????????

????????????????????if?(socketSend ==?null)

????????????????????{

????????????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????????????continue;

????????????????????}

????????????????????byte[] buffer =?new?byte[1024 * 1024 * 2];

????????????????????//實際接受到的有效字節數

????????????????????int?r = socketSend.Receive(buffer);

????????????????????//如果客戶端關閉,發送的數據就為空,然后就跳出循環

????????????????????if?(r == 0)

????????????????????{

????????????????????????break;

????????????????????}??????????????????

????????????????????if?(buffer[0] == 0)?//如果接收的字節數組的第一個字節是0,說明接收的字符串信息

????????????????????{

????????????????????????string?strMsg = Encoding.UTF8.GetString(buffer, 1, r - 1);

????????????????????????ShowMsg(socketSend.RemoteEndPoint.ToString() +?": "?+ strMsg);

????????????????????}

????????????????????else?if?(buffer[0] == 1)?//如果接收的字節數組的第一個字節是1,說明接收的是文件

????????????????????{

????????????????????????string?filePath =?"";

????????????????????????SaveFileDialog sfd =?new?SaveFileDialog();

????????????????????????sfd.Title =?"保存文件";

????????????????????????sfd.InitialDirectory =?@"C:\Users\Administrator\Desktop";

????????????????????????sfd.Filter =?"文本文件|*.txt|圖片文件|*.jpg|視頻文件|*.avi|所有文件|*.*";

????????????????????????//如果沒有選擇保存文件路徑就一直打開保存框

????????????????????????while?(true)

????????????????????????{

????????????????????????????sfd.ShowDialog(this);

????????????????????????????filePath = sfd.FileName;

????????????????????????????if?(string.IsNullOrEmpty(filePath))

????????????????????????????{

????????????????????????????????continue;

????????????????????????????}

????????????????????????????else

????????????????????????????{

????????????????????????????????break;

????????????????????????????}

????????????????????????}

????????????????????????//保存接收的文件

????????????????????????using?(FileStream fsWrite =?new?FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write))

????????????????????????{

????????????????????????????fsWrite.Write(buffer, 1, r - 1);

????????????????????????}

????????????????????????ShowMsg(socketSend.RemoteEndPoint +?": 接收文件成功");

?????????????????????????

????????????????????}

????????????????????else?if?(buffer[0] == 2)?//如果接收的字節數組的第一個字節是2,說明接收的是震動

????????????????????{

????????????????????????ZD();

????????????????????}

????????????????}

????????????}

????????????catch{}?????????

????????}

?

?

????????/// <summary>

????????/// 顯示信息

????????/// </summary>

????????/// <param name="message"></param>

????????private?void?ShowMsg(string?message)

????????{

????????????txtLog.AppendText(message +?"\r\n");

????????}

?

????????/// <summary>

????????/// 發送信息

????????/// </summary>

????????/// <param name="sender"></param>

????????/// <param name="e"></param>

????????private?void?btnSend_Click(object?sender, EventArgs e)

????????{

?????????????

????????????//獲得選中客戶端ip對應的通信Socket??????

????????????if?(cboUsers.SelectedItem ==?null)

????????????{

????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????return;

????????????}

????????????Socket socketSend = dicSocket[cboUsers.SelectedItem.ToString()];

????????????if?(socketSend ==?null)

????????????{

????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????return;

????????????}

????????????string?strSend=txtMsg.Text;

????????????try

????????????{

????????????????byte[] buffer = Encoding.UTF8.GetBytes(strSend);

????????????????//獲得發送的信息時候,在數組前面加上一個字節 0

????????????????List<byte> list =?new?List<byte>();

????????????????list.Add(0);

????????????????list.AddRange(buffer);

????????????????//將泛型集合轉換為數組

????????????????byte[] newBuffer = list.ToArray();

????????????????//將了標識字符的字節數組傳遞給客戶端

????????????????socketSend.Send(newBuffer);

????????????????txtMsg.Text =?"";

????????????}

????????????catch

????????????{

????????????}???????????

????????}

?

????????/// <summary>

????????/// 選擇文件

????????/// </summary>

????????/// <param name="sender"></param>

????????/// <param name="e"></param>

????????private?void?btnSelect_Click(object?sender, EventArgs e)

????????{

????????????//打開文件

????????????OpenFileDialog ofd =?new?OpenFileDialog();

????????????ofd.Title =?"選擇要傳的文件";

????????????ofd.InitialDirectory =?@"C:\Users\Administrator\Desktop";

????????????ofd.Filter =?"文本文件|*.txt|圖片文件|*.jpg|視頻文件|*.avi|所有文件|*.*";

????????????ofd.ShowDialog();

????????????//得到選擇文件的路徑

????????????txtPath.Text = ofd.FileName;

????????}

?

????????/// <summary>

????????/// 發送文件

????????/// </summary>

????????/// <param name="sender"></param>

????????/// <param name="e"></param>

????????private?void?btnSendFile_Click(object?sender, EventArgs e)

????????{

????????????//判斷是否選擇了要發送的客戶端

????????????if?(cboUsers.SelectedItem ==?null)

????????????{

????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????return;

????????????}

????????????Socket socketSend = dicSocket[cboUsers.SelectedItem.ToString()];

????????????if?(socketSend ==?null)

????????????{

????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????return;

????????????}

????????????string?filePath = txtPath.Text;

????????????if?(string.IsNullOrEmpty(filePath))

????????????{

????????????????MessageBox.Show("請選擇文件");

????????????????return;

????????????}

????????????Thread td =?new?Thread(SendBigFile);

????????????td.IsBackground =?true;

????????????td.Start();

?????????????

????????}

?

????????/// <summary>

????????/// 大文件斷點傳送

????????/// </summary>

????????private?void?SendBigFile()

????????{

????????????string?filePath = txtPath.Text;

????????????Socket socketSend = dicSocket[cboUsers.SelectedItem.ToString()];

????????????try

????????????{

????????????????//讀取選擇的文件

????????????????using?(FileStream fsRead =?new?FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Read))

????????????????{

????????????????????//1. 第一步:發送一個包,表示文件的長度,讓客戶端知道后續要接收幾個包來重新組織成一個文件

????????????????????long?length = fsRead.Length;

????????????????????byte[] byteLength = Encoding.UTF8.GetBytes(length.ToString());

????????????????????//獲得發送的信息時候,在數組前面加上一個字節 1

????????????????????List<byte> list =?new?List<byte>();

????????????????????list.Add(1);

????????????????????list.AddRange(byteLength);

????????????????????socketSend.Send(list.ToArray());?//

????????????????????//2. 第二步:每次發送一個1MB的包,如果文件較大,則會拆分為多個包

????????????????????byte[] buffer =?new?byte[1024 * 1024];

????????????????????long?send = 0;?//發送的字節數??????????????????

????????????????????while?(true)??//大文件斷點多次傳輸

????????????????????{

????????????????????????int?r = fsRead.Read(buffer, 0, buffer.Length);

????????????????????????if?(r == 0)

????????????????????????{

????????????????????????????break;

????????????????????????}

????????????????????????socketSend.Send(buffer, 0, r, SocketFlags.None);

????????????????????????send += r;

????????????????????????ShowMsg(string.Format("{0}: 已發送:{1}/{2}", socketSend.RemoteEndPoint, send, length));

????????????????????}

????????????????????ShowMsg("發送完成");

????????????????????txtPath.Text =?"";

????????????????}

????????????}

????????????catch

????????????{

?

????????????}

????????}

?

????????/// <summary>

????????/// 震動

????????/// </summary>

????????/// <param name="sender"></param>

????????/// <param name="e"></param>

????????private?void?btnZD_Click(object?sender, EventArgs e)

????????{

????????????//判斷是否選擇了要發送的客戶端

????????????if?(cboUsers.SelectedItem ==?null)

????????????{

????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????return;

????????????}

????????????Socket socketSend = dicSocket[cboUsers.SelectedItem.ToString()];

????????????if?(socketSend ==?null)

????????????{

????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????return;

????????????}

????????????try

????????????{

????????????????// 首字節是2說明是震動

????????????????byte[] buffer =?new?byte[1];

????????????????buffer[0] = 2;

????????????????socketSend.Send(buffer);

????????????}

????????????catch

????????????{

?????????????????

????????????}

?????????????

????????}

?

????????/// <summary>

????????/// 震動

????????/// </summary>

????????private?void?ZD()

????????{

????????????//獲取當前窗體的坐標

????????????Point point =?this.Location;

????????????//反復給窗體坐標復制一百次,達到震動的效果

????????????for?(int?i = 0; i < 100; i++)

????????????{

????????????????this.Location =?new?Point(point.X - 5, point.Y - 5);

????????????????this.Location =?new?Point(point.X + 5, point.Y + 5);

????????????}

????????????this.Location = point;

????????}

????}

}

  

1)傳輸類型說明以及全局變量

這些說明以及全局變量,說的也比較清楚,也不累贅了。

2)Socket通信服務端具體步驟:

(這些步驟都是根據第一個圖來的)

?(1)建立一個Socket

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

/// <summary>

????????/// 開啟監聽

????????/// </summary>

????????/// <param name="sender"></param>

????????/// <param name="e"></param>

????????private?void?btnStart_Click(object?sender, EventArgs e)

????????{

????????????try

????????????{

????????????????//當點擊開始監聽的時候 在服務器端創建一個負責監IP地址跟端口號的Socket

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

????????????????//獲取IP

????????????????IPAddress ip = IPAddress.Any;

????????????????//創建端口號

????????????????IPEndPoint port =?new?IPEndPoint(ip, Convert.ToInt32(txtPort.Text));

????????????????//監聽

????????????????socketWatch.Bind(port);

????????????????ShowMsg("監聽成功");

????????????????socketWatch.Listen(10);

????????????????//新建線程,去接收客戶端發來的信息

????????????????Thread td =?new?Thread(AcceptMgs);

????????????????td.IsBackground =?true;

????????????????td.Start(socketWatch);

????????????}

????????????catch

????????????{

?????????????????

????????????}??????????

????????}

  

在開啟監聽按鈕里,我們建立了Socket,以及監聽的最大客戶端數?socketWatch.Listen(10)

由于服務端會不停的去監視接收客戶端發來的信息,如果把這個工作放到主線程里,程序會出現假死的現象,所以這里給他放到一個新的線程里。

(2)接收信息

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

/// <summary>

????????/// 接收客戶端發送的信息

????????/// </summary>

????????/// <param name="o"></param>

????????private?void?AcceptMgs(object?o)

????????{

????????????try

????????????{

????????????????Socket socketWatc = (Socket)o;

????????????????while?(true)

????????????????{

????????????????????負責跟客戶端通信的Socket

????????????????????Socket socketSend = socketWatc.Accept();

????????????????????//將遠程連接的客戶端的IP地址和Socket存入集合中

????????????????????dicSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);

????????????????????//將遠程連接的客戶端的IP地址和端口號存儲下拉框中

????????????????????cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());

????????????????????ShowMsg(socketSend.RemoteEndPoint.ToString() +?": 連接成功");

????????????????????//新建線程循環接收客戶端發來的信息

????????????????????Thread td =?new?Thread(Recive);

????????????????????td.IsBackground =?true;

????????????????????td.Start(socketSend);

????????????????}

????????????}

????????????catch?{ }

?????????????

????????}

  

接收信息是會根據接收到字節數字的第一個字節來判斷接收到的是什么

這個在方法Recive里進行判斷

1

/// <summary>

namespace SocketClient {public partial class Form1 : Form{//說明:在傳遞信息的時候,會在需要傳遞的信息前面加一個字符來標識傳遞的是不同的信息// 0:表示傳遞的是字符串信息// 1:表示傳遞的是文件信息// 2:表示的是震動/// <summary>/// 用來存放連接服務的IP地址和端口號,對應的Socket (這個為了以后的擴展用,現在暫時沒用)/// </summary>Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();/// <summary>/// 存儲保存文件的路徑/// </summary>string filePath = "";/// <summary>/// 負責通信的Socket/// </summary>Socket socketSend; public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){//不檢測跨線程之間的空間調用Control.CheckForIllegalCrossThreadCalls = false;}/// <summary>/// 建立連接/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStart_Click(object sender, EventArgs e){try{//創建負責通信的SocketsocketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//獲取服務端的IPIPAddress ip = IPAddress.Parse(txtServer.Text.Trim());//獲取服務端的端口號IPEndPoint port = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));//獲得要連接的遠程服務器應用程序的IP地址和端口號socketSend.Connect(port);ShowMsg("連接成功");//新建線程,去接收客戶端發來的信息Thread td = new Thread(AcceptMgs);td.IsBackground = true;td.Start();}catch { }}/// <summary>/// 接收數據/// </summary>private void AcceptMgs(){ try{/// <summary>/// 存儲大文件的大小/// </summary>long length = 0;long recive = 0; //接收的大文件總的字節數while (true){byte[] buffer = new byte[1024 * 1024];int r = socketSend.Receive(buffer);if (r == 0){break;}if (length > 0) //判斷大文件是否已經保存完{//保存接收的文件using (FileStream fsWrite = new FileStream(filePath, FileMode.Append, FileAccess.Write)){fsWrite.Write(buffer, 0, r);length -= r; //減去每次保存的字節數ShowMsg(string.Format("{0}: 已接收:{1}/{2}", socketSend.RemoteEndPoint, recive-length, recive));if (length <= 0){ShowMsg(socketSend.RemoteEndPoint + ": 接收文件成功");}continue;} }if (buffer[0] == 0) //如果接收的字節數組的第一個字節是0,說明接收的字符串信息{string strMsg = Encoding.UTF8.GetString(buffer, 1, r - 1);ShowMsg(socketSend.RemoteEndPoint.ToString() + ": " + strMsg);}else if (buffer[0] == 1) //如果接收的字節數組的第一個字節是1,說明接收的是文件{length = int.Parse(Encoding.UTF8.GetString(buffer,1,r-1));recive = length;filePath = "";SaveFileDialog sfd = new SaveFileDialog();sfd.Title = "保存文件";sfd.InitialDirectory = @"C:\Users\Administrator\Desktop";sfd.Filter = "文本文件|*.txt|圖片文件|*.jpg|視頻文件|*.avi|所有文件|*.*";//如果沒有選擇保存文件路徑就一直打開保存框while (true){sfd.ShowDialog(this);filePath = sfd.FileName;if (string.IsNullOrEmpty(filePath)){continue;}else{break;}} }else if (buffer[0] == 2) //如果接收的字節數組的第一個字節是2,說明接收的是震動{ZD();}}}catch { }}/// <summary>/// 顯示信息/// </summary>/// <param name="message"></param>private void ShowMsg(string message){txtLog.AppendText(message + "\r\n");}/// <summary>/// 發送數據/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSend_Click(object sender, EventArgs e){try{byte[] buffer = Encoding.UTF8.GetBytes(txtMsg.Text);//獲得發送的信息時候,在數組前面加上一個字節 0List<byte> list = new List<byte>();list.Add(0);list.AddRange(buffer);//將泛型集合轉換為數組byte[] newBuffer = list.ToArray();//將了標識字符的字節數組傳遞給客戶端socketSend.Send(newBuffer);txtMsg.Text = "";}catch{} } /// <summary>/// 選擇文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSelect_Click(object sender, EventArgs e){//打開文件OpenFileDialog ofd = new OpenFileDialog();ofd.Title = "選擇要傳的文件";ofd.InitialDirectory = @"C:\Users\Administrator\Desktop";ofd.Filter = "文本文件|*.txt|圖片文件|*.jpg|視頻文件|*.avi|所有文件|*.*";ofd.ShowDialog();//得到選擇文件的路徑txtPath.Text = ofd.FileName;}/// <summary>/// 發送文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSendFile_Click(object sender, EventArgs e){ try{string filePath = txtPath.Text;if (string.IsNullOrEmpty(filePath)){MessageBox.Show("請選擇文件");return;}//讀取選擇的文件using (FileStream fsRead = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Read)){byte[] buffer = new byte[1024 * 1024 * 2];int r = fsRead.Read(buffer, 0, buffer.Length);//獲得發送的信息時候,在數組前面加上一個字節 1List<byte> list = new List<byte>();list.Add(1);list.AddRange(buffer);byte[] newBuffer = list.ToArray();//將了標識字符的字節數組傳遞給客戶端socketSend.Send(newBuffer, 0, r + 1, SocketFlags.None);txtPath.Text = "";}}catch{ }}/// <summary>/// 震動/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnZD_Click(object sender, EventArgs e){ try{// 首字節是2說明是震動byte[] buffer = new byte[1];buffer[0] = 2;socketSend.Send(buffer);}catch{ }}/// <summary>/// 震動/// </summary>private void ZD(){//獲取當前窗體的坐標Point point = this.Location;//反復給窗體坐標復制一百次,達到震動的效果for (int i = 0; i < 100; i++){this.Location = new Point(point.X - 5, point.Y - 5);this.Location = new Point(point.X + 5, point.Y + 5);}this.Location = point;}} }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

/// 接收客戶端發來的數據,并顯示出來

/// </summary>

private?void?Recive(object?o)

{

????Socket socketSend = (Socket)o;

????try

????{

????????while?(true)

????????{

????????????//客戶端連接成功后,服務器應該接受客戶端發來的消息

?????????????

????????????if?(socketSend ==?null)

????????????{

????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????continue;

????????????}

????????????byte[] buffer =?new?byte[1024 * 1024 * 2];

????????????//實際接受到的有效字節數

????????????int?r = socketSend.Receive(buffer);

????????????//如果客戶端關閉,發送的數據就為空,然后就跳出循環

????????????if?(r == 0)

????????????{

????????????????break;

????????????}??????????????????

????????????if?(buffer[0] == 0)?//如果接收的字節數組的第一個字節是0,說明接收的字符串信息

????????????{

????????????????string?strMsg = Encoding.UTF8.GetString(buffer, 1, r - 1);

????????????????ShowMsg(socketSend.RemoteEndPoint.ToString() +?": "?+ strMsg);

????????????}

????????????else?if?(buffer[0] == 1)?//如果接收的字節數組的第一個字節是1,說明接收的是文件

????????????{

????????????????string?filePath =?"";

????????????????SaveFileDialog sfd =?new?SaveFileDialog();

????????????????sfd.Title =?"保存文件";

????????????????sfd.InitialDirectory =?@"C:\Users\Administrator\Desktop";

????????????????sfd.Filter =?"文本文件|*.txt|圖片文件|*.jpg|視頻文件|*.avi|所有文件|*.*";

????????????????//如果沒有選擇保存文件路徑就一直打開保存框

????????????????while?(true)

????????????????{

????????????????????sfd.ShowDialog(this);

????????????????????filePath = sfd.FileName;

????????????????????if?(string.IsNullOrEmpty(filePath))

????????????????????{

????????????????????????continue;

????????????????????}

????????????????????else

????????????????????{

????????????????????????break;

????????????????????}

????????????????}

????????????????//保存接收的文件

????????????????using?(FileStream fsWrite =?new?FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write))

????????????????{

????????????????????fsWrite.Write(buffer, 1, r - 1);

????????????????}

????????????????ShowMsg(socketSend.RemoteEndPoint +?": 接收文件成功");

?????????????????

????????????}

????????????else?if?(buffer[0] == 2)?//如果接收的字節數組的第一個字節是2,說明接收的是震動

????????????{

????????????????ZD();

????????????}

????????}

????}

????catch{}?????????

}

  

(3)發送數據(這里分發送字符串、文件(包含大文件)、震動)

發送字符串信息

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

/// <summary>

????????/// 發送信息

????????/// </summary>

????????/// <param name="sender"></param>

????????/// <param name="e"></param>

????????private?void?btnSend_Click(object?sender, EventArgs e)

????????{

?????????????

????????????//獲得選中客戶端ip對應的通信Socket??????

????????????if?(cboUsers.SelectedItem ==?null)

????????????{

????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????return;

????????????}

????????????Socket socketSend = dicSocket[cboUsers.SelectedItem.ToString()];

????????????if?(socketSend ==?null)

????????????{

????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????return;

????????????}

????????????string?strSend=txtMsg.Text;

????????????try

????????????{

????????????????byte[] buffer = Encoding.UTF8.GetBytes(strSend);

????????????????//獲得發送的信息時候,在數組前面加上一個字節 0

????????????????List<byte> list =?new?List<byte>();

????????????????list.Add(0);

????????????????list.AddRange(buffer);

????????????????//將泛型集合轉換為數組

????????????????byte[] newBuffer = list.ToArray();

????????????????//將了標識字符的字節數組傳遞給客戶端

????????????????socketSend.Send(newBuffer);

????????????????txtMsg.Text =?"";

????????????}

????????????catch

????????????{

????????????}???????????

????????}

  發送震動

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

/// <summary>

????????/// 震動

????????/// </summary>

????????/// <param name="sender"></param>

????????/// <param name="e"></param>

????????private?void?btnZD_Click(object?sender, EventArgs e)

????????{

????????????//判斷是否選擇了要發送的客戶端

????????????if?(cboUsers.SelectedItem ==?null)

????????????{

????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????return;

????????????}

????????????Socket socketSend = dicSocket[cboUsers.SelectedItem.ToString()];

????????????if?(socketSend ==?null)

????????????{

????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????return;

????????????}

????????????try

????????????{

????????????????// 首字節是2說明是震動

????????????????byte[] buffer =?new?byte[1];

????????????????buffer[0] = 2;

????????????????socketSend.Send(buffer);

????????????}

????????????catch

????????????{

?????????????????

????????????}

?????????????

????????}

?

????????/// <summary>

????????/// 震動

????????/// </summary>

????????private?void?ZD()

????????{

????????????//獲取當前窗體的坐標

????????????Point point =?this.Location;

????????????//反復給窗體坐標復制一百次,達到震動的效果

????????????for?(int?i = 0; i < 100; i++)

????????????{

????????????????this.Location =?new?Point(point.X - 5, point.Y - 5);

????????????????this.Location =?new?Point(point.X + 5, point.Y + 5);

????????????}

????????????this.Location = point;

????????}

  

發送文件(包含大文件)

首先要選擇文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

/// <summary>

????????/// 選擇文件

????????/// </summary>

????????/// <param name="sender"></param>

????????/// <param name="e"></param>

????????private?void?btnSelect_Click(object?sender, EventArgs e)

????????{

????????????//打開文件

????????????OpenFileDialog ofd =?new?OpenFileDialog();

????????????ofd.Title =?"選擇要傳的文件";

????????????ofd.InitialDirectory =?@"C:\Users\Administrator\Desktop";

????????????ofd.Filter =?"文本文件|*.txt|圖片文件|*.jpg|視頻文件|*.avi|所有文件|*.*";

????????????ofd.ShowDialog();

????????????//得到選擇文件的路徑

????????????txtPath.Text = ofd.FileName;

????????}

  然后在發送文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

/// <summary>

????????/// 發送文件

????????/// </summary>

????????/// <param name="sender"></param>

????????/// <param name="e"></param>

????????private?void?btnSendFile_Click(object?sender, EventArgs e)

????????{

????????????//判斷是否選擇了要發送的客戶端

????????????if?(cboUsers.SelectedItem ==?null)

????????????{

????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????return;

????????????}

????????????Socket socketSend = dicSocket[cboUsers.SelectedItem.ToString()];

????????????if?(socketSend ==?null)

????????????{

????????????????MessageBox.Show("請選擇要發送的客戶端");

????????????????return;

????????????}

????????????string?filePath = txtPath.Text;

????????????if?(string.IsNullOrEmpty(filePath))

????????????{

????????????????MessageBox.Show("請選擇文件");

????????????????return;

????????????}

????????????Thread td =?new?Thread(SendBigFile);

????????????td.IsBackground =?true;

????????????td.Start();

?????????????

????????}

?

????????/// <summary>

????????/// 大文件斷點傳送

????????/// </summary>

????????private?void?SendBigFile()

????????{

????????????string?filePath = txtPath.Text;

????????????Socket socketSend = dicSocket[cboUsers.SelectedItem.ToString()];

????????????try

????????????{

????????????????//讀取選擇的文件

????????????????using?(FileStream fsRead =?new?FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Read))

????????????????{

????????????????????//1. 第一步:發送一個包,表示文件的長度,讓客戶端知道后續要接收幾個包來重新組織成一個文件

????????????????????long?length = fsRead.Length;

????????????????????byte[] byteLength = Encoding.UTF8.GetBytes(length.ToString());

????????????????????//獲得發送的信息時候,在數組前面加上一個字節 1

????????????????????List<byte> list =?new?List<byte>();

????????????????????list.Add(1);

????????????????????list.AddRange(byteLength);

????????????????????socketSend.Send(list.ToArray());?//

????????????????????//2. 第二步:每次發送一個4KB的包,如果文件較大,則會拆分為多個包

????????????????????byte[] buffer =?new?byte[1024 * 1024];

????????????????????long?send = 0;?//發送的字節數??????????????????

????????????????????while?(true)??//大文件斷點多次傳輸

????????????????????{

????????????????????????int?r = fsRead.Read(buffer, 0, buffer.Length);

????????????????????????if?(r == 0)

????????????????????????{

????????????????????????????break;

????????????????????????}

????????????????????????socketSend.Send(buffer, 0, r, SocketFlags.None);

????????????????????????send += r;

????????????????????????ShowMsg(string.Format("{0}: 已發送:{1}/{2}", socketSend.RemoteEndPoint, send, length));

????????????????????}

????????????????????ShowMsg("發送完成");

????????????????????txtPath.Text =?"";

????????????????}

????????????}

????????????catch

????????????{

?

????????????}

????????}

  

注意:(1)發送文件的時候會分兩步發送 :第一步:發送一個包,表示文件的長度,讓客戶端知道后續要接收幾個包來重新組織成一個文件

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???第二步:每次發送一個1MB的包,如果文件較大,則會拆分為多個包

? ? ?(2)每個客戶端連接服務端的啥時候,都會把客戶端的ip以及端口號,放到下拉框里,想給那個客戶端發信息,就選擇對應的客戶端

二、客戶端的建立

1.客戶端的項目建立以及頁面布局

客戶端的界面布局與服務端很像,就是把對應的開始監聽換成連接,當然代碼也會有所改變,后面會講到·····

2.各功能按鍵的事件代碼

先把整個服客戶端的代碼貼出來,然后我們在一一講解

namespace SocketClient {public partial class Form1 : Form{//說明:在傳遞信息的時候,會在需要傳遞的信息前面加一個字符來標識傳遞的是不同的信息// 0:表示傳遞的是字符串信息// 1:表示傳遞的是文件信息// 2:表示的是震動/// <summary>/// 用來存放連接服務的IP地址和端口號,對應的Socket (這個為了以后的擴展用,現在暫時沒用)/// </summary>Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();/// <summary>/// 存儲保存文件的路徑/// </summary>string filePath = "";/// <summary>/// 負責通信的Socket/// </summary>Socket socketSend; public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){//不檢測跨線程之間的空間調用Control.CheckForIllegalCrossThreadCalls = false;}/// <summary>/// 建立連接/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStart_Click(object sender, EventArgs e){try{//創建負責通信的SocketsocketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//獲取服務端的IPIPAddress ip = IPAddress.Parse(txtServer.Text.Trim());//獲取服務端的端口號IPEndPoint port = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));//獲得要連接的遠程服務器應用程序的IP地址和端口號socketSend.Connect(port);ShowMsg("連接成功");//新建線程,去接收客戶端發來的信息Thread td = new Thread(AcceptMgs);td.IsBackground = true;td.Start();}catch { }}/// <summary>/// 接收數據/// </summary>private void AcceptMgs(){ try{/// <summary>/// 存儲大文件的大小/// </summary>long length = 0;long recive = 0; //接收的大文件總的字節數while (true){byte[] buffer = new byte[1024 * 1024];int r = socketSend.Receive(buffer);if (r == 0){break;}if (length > 0) //判斷大文件是否已經保存完{//保存接收的文件using (FileStream fsWrite = new FileStream(filePath, FileMode.Append, FileAccess.Write)){fsWrite.Write(buffer, 0, r);length -= r; //減去每次保存的字節數ShowMsg(string.Format("{0}: 已接收:{1}/{2}", socketSend.RemoteEndPoint, recive-length, recive));if (length <= 0){ShowMsg(socketSend.RemoteEndPoint + ": 接收文件成功");}continue;} }if (buffer[0] == 0) //如果接收的字節數組的第一個字節是0,說明接收的字符串信息{string strMsg = Encoding.UTF8.GetString(buffer, 1, r - 1);ShowMsg(socketSend.RemoteEndPoint.ToString() + ": " + strMsg);}else if (buffer[0] == 1) //如果接收的字節數組的第一個字節是1,說明接收的是文件{length = int.Parse(Encoding.UTF8.GetString(buffer,1,r-1));recive = length;filePath = "";SaveFileDialog sfd = new SaveFileDialog();sfd.Title = "保存文件";sfd.InitialDirectory = @"C:\Users\Administrator\Desktop";sfd.Filter = "文本文件|*.txt|圖片文件|*.jpg|視頻文件|*.avi|所有文件|*.*";//如果沒有選擇保存文件路徑就一直打開保存框while (true){sfd.ShowDialog(this);filePath = sfd.FileName;if (string.IsNullOrEmpty(filePath)){continue;}else{break;}} }else if (buffer[0] == 2) //如果接收的字節數組的第一個字節是2,說明接收的是震動{ZD();}}}catch { }}/// <summary>/// 顯示信息/// </summary>/// <param name="message"></param>private void ShowMsg(string message){txtLog.AppendText(message + "\r\n");}/// <summary>/// 發送數據/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSend_Click(object sender, EventArgs e){try{byte[] buffer = Encoding.UTF8.GetBytes(txtMsg.Text);//獲得發送的信息時候,在數組前面加上一個字節 0List<byte> list = new List<byte>();list.Add(0);list.AddRange(buffer);//將泛型集合轉換為數組byte[] newBuffer = list.ToArray();//將了標識字符的字節數組傳遞給客戶端socketSend.Send(newBuffer);txtMsg.Text = "";}catch{} } /// <summary>/// 選擇文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSelect_Click(object sender, EventArgs e){//打開文件OpenFileDialog ofd = new OpenFileDialog();ofd.Title = "選擇要傳的文件";ofd.InitialDirectory = @"C:\Users\Administrator\Desktop";ofd.Filter = "文本文件|*.txt|圖片文件|*.jpg|視頻文件|*.avi|所有文件|*.*";ofd.ShowDialog();//得到選擇文件的路徑txtPath.Text = ofd.FileName;}/// <summary>/// 發送文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSendFile_Click(object sender, EventArgs e){ try{string filePath = txtPath.Text;if (string.IsNullOrEmpty(filePath)){MessageBox.Show("請選擇文件");return;}//讀取選擇的文件using (FileStream fsRead = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Read)){byte[] buffer = new byte[1024 * 1024 * 2];int r = fsRead.Read(buffer, 0, buffer.Length);//獲得發送的信息時候,在數組前面加上一個字節 1List<byte> list = new List<byte>();list.Add(1);list.AddRange(buffer);byte[] newBuffer = list.ToArray();//將了標識字符的字節數組傳遞給客戶端socketSend.Send(newBuffer, 0, r + 1, SocketFlags.None);txtPath.Text = "";}}catch{ }}/// <summary>/// 震動/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnZD_Click(object sender, EventArgs e){ try{// 首字節是2說明是震動byte[] buffer = new byte[1];buffer[0] = 2;socketSend.Send(buffer);}catch{ }}/// <summary>/// 震動/// </summary>private void ZD(){//獲取當前窗體的坐標Point point = this.Location;//反復給窗體坐標復制一百次,達到震動的效果for (int i = 0; i < 100; i++){this.Location = new Point(point.X - 5, point.Y - 5);this.Location = new Point(point.X + 5, point.Y + 5);}this.Location = point;}} }

1)傳輸類型說明以及全局變量

?

這些說明以及全局變量,說的也比較清楚,也不累贅了。

2)Socket通信服務端具體步驟:

(這些步驟都是根據第一個圖來的)

?(1)建立一個通信的Socket

/// <summary>/// 建立連接/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStart_Click(object sender, EventArgs e){try{//創建負責通信的SocketsocketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//獲取服務端的IPIPAddress ip = IPAddress.Parse(txtServer.Text.Trim());//獲取服務端的端口號IPEndPoint port = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));//獲得要連接的遠程服務器應用程序的IP地址和端口號socketSend.Connect(port);ShowMsg("連接成功");//新建線程,去接收客戶端發來的信息Thread td = new Thread(AcceptMgs);td.IsBackground = true;td.Start();}catch { }}

在連接按鈕里,我們建立了Socket

由于客戶端會不停的去監視接收服務端發來的信息,如果把這個工作放到主線程里,程序會出現假死的現象,所以這里給他放到一個新的線程里。

(2)接收信息

/// <summary>/// 接收數據/// </summary>private void AcceptMgs(){ try{/// <summary>/// 存儲大文件的大小/// </summary>long length = 0;long recive = 0; //接收的大文件總的字節數while (true){byte[] buffer = new byte[1024 * 1024];int r = socketSend.Receive(buffer);if (r == 0){break;}if (length > 0) //判斷大文件是否已經保存完{//保存接收的文件using (FileStream fsWrite = new FileStream(filePath, FileMode.Append, FileAccess.Write)){fsWrite.Write(buffer, 0, r);length -= r; //減去每次保存的字節數ShowMsg(string.Format("{0}: 已接收:{1}/{2}", socketSend.RemoteEndPoint, recive-length, recive));if (length <= 0){ShowMsg(socketSend.RemoteEndPoint + ": 接收文件成功");}continue;} }if (buffer[0] == 0) //如果接收的字節數組的第一個字節是0,說明接收的字符串信息{string strMsg = Encoding.UTF8.GetString(buffer, 1, r - 1);ShowMsg(socketSend.RemoteEndPoint.ToString() + ": " + strMsg);}else if (buffer[0] == 1) //如果接收的字節數組的第一個字節是1,說明接收的是文件{length = int.Parse(Encoding.UTF8.GetString(buffer,1,r-1));recive = length;filePath = "";SaveFileDialog sfd = new SaveFileDialog();sfd.Title = "保存文件";sfd.InitialDirectory = @"C:\Users\Administrator\Desktop";sfd.Filter = "文本文件|*.txt|圖片文件|*.jpg|視頻文件|*.avi|所有文件|*.*";//如果沒有選擇保存文件路徑就一直打開保存框while (true){sfd.ShowDialog(this);filePath = sfd.FileName;if (string.IsNullOrEmpty(filePath)){continue;}else{break;}} }else if (buffer[0] == 2) //如果接收的字節數組的第一個字節是2,說明接收的是震動{ZD();}}}catch { }}

接收信息是會根據接收到字節數字的第一個字節來判斷接收到的是什么,如果接收的是個大文件,首先會接收大文件的大小,然后根據大小接收相同大小的字節數組追加保存到一個文件里去。

(3)發送數據(這里分發送字符串、文件(包含大文件)、震動)

發送字符串信息

/// <summary>/// 發送數據/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSend_Click(object sender, EventArgs e){try{byte[] buffer = Encoding.UTF8.GetBytes(txtMsg.Text);//獲得發送的信息時候,在數組前面加上一個字節 0List<byte> list = new List<byte>();list.Add(0);list.AddRange(buffer);//將泛型集合轉換為數組byte[] newBuffer = list.ToArray();//將了標識字符的字節數組傳遞給客戶端socketSend.Send(newBuffer);txtMsg.Text = "";}catch{} }

發送震動

/// <summary>/// 震動/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnZD_Click(object sender, EventArgs e){ try{// 首字節是2說明是震動byte[] buffer = new byte[1];buffer[0] = 2;socketSend.Send(buffer);}catch{ }}/// <summary>/// 震動/// </summary>private void ZD(){//獲取當前窗體的坐標Point point = this.Location;//反復給窗體坐標復制一百次,達到震動的效果for (int i = 0; i < 100; i++){this.Location = new Point(point.X - 5, point.Y - 5);this.Location = new Point(point.X + 5, point.Y + 5);}this.Location = point;}

發送文件(不包含大文件)

首先要選擇文件

/// <summary>/// 選擇文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSelect_Click(object sender, EventArgs e){//打開文件OpenFileDialog ofd = new OpenFileDialog();ofd.Title = "選擇要傳的文件";ofd.InitialDirectory = @"C:\Users\Administrator\Desktop";ofd.Filter = "文本文件|*.txt|圖片文件|*.jpg|視頻文件|*.avi|所有文件|*.*";ofd.ShowDialog();//得到選擇文件的路徑txtPath.Text = ofd.FileName;}

然后在發送文件

/// <summary>/// 發送文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSendFile_Click(object sender, EventArgs e){ try{string filePath = txtPath.Text;if (string.IsNullOrEmpty(filePath)){MessageBox.Show("請選擇文件");return;}//讀取選擇的文件using (FileStream fsRead = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Read)){byte[] buffer = new byte[1024 * 1024 * 2];int r = fsRead.Read(buffer, 0, buffer.Length);//獲得發送的信息時候,在數組前面加上一個字節 1List<byte> list = new List<byte>();list.Add(1);list.AddRange(buffer);byte[] newBuffer = list.ToArray();//將了標識字符的字節數組傳遞給客戶端socketSend.Send(newBuffer, 0, r + 1, SocketFlags.None);txtPath.Text = "";}}catch{ }}

?

總結

以上是生活随笔為你收集整理的C# Socket服务端与客户端通信(包含大文件的断点传输)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

五月天综合在线 | 香蕉久草 | 97成人在线观看视频 | 最近中文字幕大全中文字幕免费 | 亚洲精品久久激情国产片 | 亚洲一区尤物 | 色婷婷综合久色 | 伊人网综合在线观看 | 免费a v在线 | 久久99热久久99精品 | 96国产精品视频 | 欧美成人精品欧美一级乱 | 国产剧情久久 | 99这里只有久久精品视频 | 一级黄色片在线观看 | 伊人国产在线观看 | a v在线视频 | 久久久高清一区二区三区 | 婷婷激情综合 | 免费看特级毛片 | 午夜久久久久久久久久影院 | 成片视频免费观看 | 一区二区三区在线看 | 国产麻豆精品传媒av国产下载 | 亚洲精品国产精品国 | 国产精品第一页在线 | 国产精品免费人成网站 | 九九九九九精品 | 久草在线免费看视频 | 免费在线观看污 | 国产亚洲精品综合一区91 | 精品国产aⅴ麻豆 | 久久国产经典视频 | 在线观看网站黄 | 色 免费观看 | 国产精品美女在线观看 | 亚洲va欧美va人人爽春色影视 | 国产资源精品在线观看 | 高清不卡一区二区在线 | 国产一区成人在线 | 日韩av黄 | 中文在线免费观看 | 国产精品亚洲a | 国产一线天在线观看 | 国产色女人 | 探花视频在线版播放免费观看 | 亚洲成av人影院 | 99视频在线精品国自产拍免费观看 | av福利免费| 狠狠色丁香婷婷综合欧美 | 国产成人av网 | 91亚洲精品久久久蜜桃网站 | 超碰夜夜 | 久久久久国产一区二区三区四区 | 一区二区三区四区五区在线视频 | 成人免费观看视频大全 | 亚洲精品美女久久17c | 91视频在线免费 | 免费亚洲精品视频 | 日日天天狠狠 | 久久久久色| 一区二区三区不卡在线 | 亚洲 欧美变态 另类 综合 | 亚洲91中文字幕无线码三区 | 激情网在线视频 | 亚洲精品高清在线观看 | 国产 日韩 欧美 自拍 | 欧美va天堂va视频va在线 | 欧美aa级| 国产999视频 | 一级免费片 | 国产a网站 | 最近日本中文字幕a | 欧美色图亚洲图片 | 久久综合久久综合这里只有精品 | 久久久久久久久久久久久国产精品 | 97色综合 | 国产亚洲精品久久久久久大师 | 三级黄色在线观看 | 久久综合免费视频 | 国产日本在线 | 六月丁香六月婷婷 | 九色福利视频 | 亚州av一区| 毛片在线网 | 午夜精品一区二区三区免费视频 | 日日摸日日添日日躁av | 亚洲国产精品久久久 | 精品视频资源站 | 精品欧美小视频在线观看 | 西西4444www大胆视频 | 久久久久综合网 | 男女精品久久 | 婷婷在线免费观看 | aⅴ视频在线 | 午夜精品一区二区国产 | 激情综合网在线观看 | 欧美成a人片在线观看久 | 国产xxxx | 天天躁天天狠天天透 | 日韩专区一区二区 | 免费三级骚| 国产免费影院 | 91亚洲精品国产 | 久产久精国产品 | 很黄很色很污的网站 | 日韩网站免费观看 | 99久久精品国产网站 | 黄色性av| 日韩精品免费在线 | 欧美日韩免费一区二区三区 | 日本在线观看中文字幕 | 日韩午夜精品 | 亚洲综合五月 | 成人av片在线观看 | 日批在线观看 | 天天综合视频在线观看 | 欧美一级淫片videoshd | 成人国产精品久久久春色 | 日一日干一干 | 在线观看国产高清视频 | www色,com | 欧美性猛片, | 香蕉视频在线视频 | 五月色婷 | 国产精品99精品久久免费 | 国产精品一区二区av日韩在线 | 日本精品视频免费观看 | 欧美在线观看视频一区二区三区 | 成人黄色在线电影 | 久久99国产综合精品免费 | 午夜精品一区二区三区在线观看 | 日本激情视频中文字幕 | 97偷拍在线视频 | 91在线视频| 婷婷丁香在线观看 | 久久a久久 | 日韩一区二区在线免费观看 | 久久国产露脸精品国产 | 亚洲日韩中文字幕 | 天天色成人网 | 久久久av电影 | 亚洲天堂网站视频 | 久久精品79国产精品 | 在线免费观看国产视频 | 亚洲国产精品va在线看黑人动漫 | 欧美精品资源 | 六月丁香在线视频 | 天天狠狠 | 99理论片| 国产成人黄色片 | 天天综合区 | 麻豆影音先锋 | 亚洲深爱激情 | 日韩a级黄色片 | 午夜免费视频网站 | 婷婷成人在线 | 日本精品二区 | 男女啪啪网站 | 在线看国产日韩 | 精品国产伦一区二区三区观看体验 | 国产精品a级 | 在线观看视频三级 | 91一区啪爱嗯打偷拍欧美 | 在线观看亚洲a | 最近中文字幕免费视频 | 国产精品一区免费在线观看 | 亚洲国产精久久久久久久 | 久久综合婷婷国产二区高清 | 色老板在线 | 国产丝袜制服在线 | www99久久| 国产精品剧情在线亚洲 | 国产亚洲片 | 国产99久久精品一区二区300 | 国产精品永久免费在线 | 亚洲精品国产视频 | 日韩欧美精选 | av短片在线观看 | 亚洲国产小视频在线观看 | 国产91九色视频 | 国内精品小视频 | 在线免费试看 | 色综合天天色综合 | 新版资源中文在线观看 | 天天色天天草天天射 | 久久精品网站免费观看 | 五月婷婷六月丁香在线观看 | 欧美激情第八页 | 欧美日韩高清国产 | 免费日韩视 | 亚洲婷婷在线视频 | 岛国av在线 | 五月激情视频 | 色婷婷视频网 | 免费视频 三区 | 美女黄久久 | 成人性生交视频 | 成人毛片网 | 欧美日韩一级视频 | 亚洲一区二区精品视频 | 国产高清一区二区 | 97超碰免费 | 国产免费观看久久黄 | 久久国内精品 | av在线官网 | 亚洲综合最新在线 | 国产视频久久 | 91看片淫黄大片在线播放 | 亚洲精品成人在线 | 久久社区视频 | 日韩a级免费视频 | www成人av | 人人玩人人添人人澡97 | 国产小视频在线观看 | 国产精品露脸在线 | 综合色久 | 狠狠操狠狠干天天操 | 免费福利在线播放 | 国产91在线 | 美洲 | 亚洲欧美日韩不卡 | 日韩在线观看视频网站 | 91免费观看国产 | 毛片网在线 | av在线电影网站 | 在线亚洲成人 | 国产剧情一区二区在线观看 | 亚洲丝袜一区二区 | 国产精品一区二区久久久 | 国内一区二区视频 | 免费福利在线观看 | 亚洲一区二区视频 | 十八岁以下禁止观看的1000个网站 | 国产人成在线观看 | 成人免费亚洲 | 国产日韩欧美在线观看 | 一本到视频在线观看 | 久久99视频免费观看 | 日韩免费在线观看视频 | 中文字幕免费高清av | 国产96在线 | 色瓜| 91禁看片 | 国产一级在线免费观看 | 亚洲91视频 | 天天视频亚洲 | 96国产在线 | 久久麻豆精品 | 成人毛片网| 欧美日韩一区二区免费在线观看 | 九九色视频 | 欧美日韩国产精品一区二区亚洲 | 天天做综合网 | 伊人色综合久久天天网 | 99在线精品视频观看 | 亚洲国产三级在线观看 | 六月丁香激情综合 | 久久久久久毛片精品免费不卡 | 精品国产午夜 | 黄色av影院| av福利免费 | 在线精品视频免费观看 | 欧美精品亚洲精品 | 久久久伦理 | 草久电影 | 日日婷婷夜日日天干 | 午夜精品中文字幕 | 国产美女免费视频 | 久久婷婷久久 | 六月激情久久 | 亚洲精品一区二区网址 | 日本xxxx.com| 精品一二三区视频 | 91视视频在线直接观看在线看网页在线看 | 亚洲精品www久久久久久 | 国产女人40精品一区毛片视频 | 五月激情站| 色噜噜狠狠色综合中国 | 久久久免费精品国产一区二区 | 成人在线黄色电影 | 成人欧美亚洲 | 精品国产精品一区二区夜夜嗨 | 99精品国产99久久久久久97 | 亚洲成av| 国产高清网站 | 黄色精品久久 | 激情在线免费视频 | av手机在线播放 | 久久手机免费视频 | 亚洲 欧美 精品 | 国产精品刺激对白麻豆99 | 99自拍视频在线观看 | 黄色网在线免费观看 | 午夜精品久久久久久99热明星 | 黄色精品国产 | 久久资源在线 | 99在线观看视频网站 | 欧美视频在线二区 | 久久欧美视频 | 2021国产精品 | 国产小视频网站 | 蜜臀91丨九色丨蝌蚪老版 | 午夜精品影院 | 69精品在线观看 | 久久精品国产免费看久久精品 | 超碰97人人干 | 国产精品中文 | 久久久久国产精品www | 天天爱天天操天天爽 | 久久精品三级 | 久久女同性恋中文字幕 | 在线播放国产一区二区三区 | 在线国产高清 | 亚洲播放一区 | 欧美大片在线观看一区 | 亚洲激情av | 久久精品综合视频 | 天天做天天爱天天爽综合网 | 97超碰国产在线 | 国产精品国内免费一区二区三区 | 久黄色 | 日日干美女 | 亚洲精品中文在线资源 | 欧美精品久久人人躁人人爽 | 欧美激情视频三区 | 欧美一二三区在线播放 | 国产99久 | 欧美久草在线 | 久久艹艹 | 日韩av电影手机在线观看 | 99精品久久久久久久久久综合 | 亚州精品在线视频 | 日韩中文字幕在线 | 天天操天天干天天综合网 | 久久99国产精品久久99 | 国产在线永久 | 国产一区二区在线免费视频 | 狠狠操天天操 | 欧美在线91 | 一区二区三区在线视频111 | 久久99久久99精品免视看婷婷 | 久久久久欧美精品999 | 国产精品一区二区美女视频免费看 | 人人射| 九九综合久久 | 国产精品久久久久免费观看 | 日韩在线视频看看 | 国产中文字幕在线观看 | 中文字幕在线观看亚洲 | 欧美精品在线一区 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 国产美女免费视频 | 国产精品久久久久一区二区三区 | 综合久久综合久久 | 国产亚洲欧美一区 | 国产最新91 | 日韩精品免费在线视频 | 999精品网| 黄免费在线观看 | 天天干,天天射,天天操,天天摸 | 国产成人精品一区二三区 | 精品一区 在线 | 网站免费黄 | 激情深爱.com | 91成人区 | 狠狠色丁香婷婷综合久久片 | 狠狠色丁香久久综合网 | 日韩特黄一级欧美毛片特黄 | 四虎8848免费高清在线观看 | 永久免费精品视频网站 | 九九爱免费视频 | 日韩在线观看一区二区三区 | 国产成人99av超碰超爽 | 亚洲综合欧美日韩狠狠色 | 日韩av成人在线观看 | 久久精品日本啪啪涩涩 | 久久久五月婷婷 | 涩五月婷婷 | 欧美成人黄色 | 久久九九久久九九 | 五月天电影免费在线观看一区 | 成人免费观看视频大全 | 日韩精选在线观看 | 91成人欧美| 99午夜| 一区二区视频网站 | 国产99久久久久 | 在线色资源 | 国产91精品看黄网站 | 最新动作电影 | 欧美日韩精品在线免费观看 | 国产一区二区综合 | 日韩欧美在线中文字幕 | 亚洲春色奇米影视 | 国产精品理论片在线观看 | 欧美成人69av | 日韩欧美综合 | 欧美日韩高清在线 | 激情综合婷婷 | 免费色网站 | 91人人爽久久涩噜噜噜 | 国产精品一区二区美女视频免费看 | 草久在线| 久久99精品久久久久久 | 91精品国产乱码 | 97人人澡人人爽人人模亚洲 | 国产男女无遮挡猛进猛出在线观看 | 日韩丝袜在线观看 | www.福利| 久草香蕉在线 | 四虎影视精品成人 | 国产偷国产偷亚洲清高 | 亚洲综合情 | 综合中文字幕 | 色婷婷综合久久久久中文字幕1 | 中文字幕中文字幕在线中文字幕三区 | 午夜久久久影院 | 国产成人一区二区啪在线观看 | 国产在线观看黄 | 911久久 | 久久这里只有精品23 | 超碰人人射 | 欧美日韩中文字幕综合视频 | 婷婷激情久久 | 国产一级免费av | 国产亚洲资源 | www.久久久.cum | 麻豆视频在线播放 | 91经典在线 | 五月婷久久 | 国产字幕在线观看 | 国产精品久久在线观看 | 午夜精品久久久 | 日韩精品在线观看视频 | 91视频在线观看下载 | 日韩精品一区二区三区免费观看视频 | 久久区二区 | 四虎国产精品永久在线国在线 | 99999精品视频 | 久久午夜视频 | 91看片在线播放 | 在线免费观看黄 | 国产精品久久久久久一二三四五 | 中文字幕免费观看视频 | 在线观看欧美成人 | 亚洲日本一区二区在线 | 国产精品网站 | 日韩性片 | 成人免费大片黄在线播放 | 天天天天爽 | 久久深爱网 | 91桃色免费观看 | 麻豆视频成人 | 中文字幕美女免费在线 | 深爱婷婷激情 | 日韩高清dvd | 国产不卡在线看 | 国产精品3 | 日韩网站视频 | 国产区精品视频 | 日韩专区 在线 | 五月天婷亚洲天综合网精品偷 | 国产黄a三级三级三级三级三级 | 一区二区三区视频 | 久久天天躁 | 丝袜美腿av | 亚洲第一成网站 | 超碰在线天天 | 欧美激情精品久久久久 | 黄色毛片大全 | 天天操天天操天天操天天操天天操天天操 | 人人爽人人爽人人爽人人爽 | 四虎影视4hu4虎成人 | 天天激情 | 伊人五月天综合 | 亚洲欧美国产视频 | 性色av一区二区 | 中文字幕国产视频 | 激情丁香月 | 国产免费人成xvideos视频 | 免费网站在线观看成人 | 91精品免费 | av中文字幕网 | 五月婷婷久 | 天天草天天色 | 777xxx欧美 | 91精品在线播放 | 免费在线观看污网站 | 日韩视频免费在线观看 | 久久久国产精品人人片99精片欧美一 | 91麻豆精品国产91久久久无限制版 | 免费黄色在线 | 在线观看视频97 | 婷婷色5月 | 在线观看午夜av | 色综合天天在线 | 97视频人人| 国产一级片免费观看 | 成人四虎影院 | 成年人视频在线免费播放 | av电影亚洲 | 91在线观看视频网站 | av一级免费 | 97视频在线观看视频免费视频 | 在线视频 你懂得 | 在线91色 | 99久久婷婷 | 视频成人永久免费视频 | 精品一区二区免费在线观看 | 欧美日韩在线网站 | 九九热中文字幕 | 亚洲自拍偷拍色图 | 日韩免费看的电影 | 国产三级午夜理伦三级 | 国产视频一区二区在线播放 | 天天色综合天天 | 你操综合 | 日本中文字幕系列 | 国产精品美女久久久久久久网站 | 久久九九影视 | 成人在线免费观看网站 | av短片在线观看 | 黄色在线观看www | 日韩免费在线网站 | 成片免费观看视频大全 | 免费成人在线电影 | 一区二区三区在线观看免费视频 | 麻豆超碰 | 国产剧情一区二区 | 丁香视频全集免费观看 | 人人干网站 | 天天干天天想 | 91精选| avav片| 国产精品夜夜夜一区二区三区尤 | 亚洲国产高清视频 | 看全黄大色黄大片 | 女人18精品一区二区三区 | 天堂av色婷婷一区二区三区 | 五月导航 | 欧美色图88 | 中国一区二区视频 | 狠狠干网址 | 欧美日韩在线第一页 | 国产精品一区二区av麻豆 | 丁香六月在线 | 精品久久久久久久久久久久久 | 九色视频网 | 91av99| 日本中文字幕免费观看 | 91女人18片女毛片60分钟 | 黄色在线免费观看网站 | 亚洲色图激情文学 | 精品久久网| 色综合综合 | 亚洲激精日韩激精欧美精品 | 中国黄色一级大片 | 精品国产一区二区在线 | 新版资源中文在线观看 | 在线观看www视频 | 日韩免费av网址 | a爱爱视频 | 国产这里只有精品 | 色婷婷国产精品 | 香蕉精品视频在线观看 | 视频一区二区国产 | 国产精品丝袜在线 | 午夜精品视频在线 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 国产一级特黄毛片在线毛片 | 欧美在线久久 | 欧美一区中文字幕 | 日日插日日干 | 成人在线视频免费 | 五月婷影院 | 久久久精品亚洲 | 国产精品不卡在线观看 | 2021国产精品 | 色多多污污在线观看 | 手机看片午夜 | 久草免费在线 | 日韩精品在线免费播放 | 天天干视频在线 | 国产资源网 | 香蕉影院在线观看 | 精品久久久亚洲 | 在线 精品 国产 | 天天插伊人 | 久久精品99北条麻妃 | 欧美日韩免费一区二区三区 | 激情综合色播五月 | 日韩视频免费 | 91精品视频免费看 | 亚州欧美精品 | 日韩激情免费视频 | 一区二区三区韩国免费中文网站 | 欧美精品免费在线 | 麻豆视频国产在线观看 | 久久久免费 | 午夜精品婷婷 | 波多野结衣视频一区二区 | 久久精品国产一区 | 国产成人一区二区啪在线观看 | 九九国产精品视频 | 视频在线精品 | 国产日韩精品一区二区在线观看播放 | 日本在线观看黄色 | 国产欧美日韩精品一区二区免费 | 国产日韩在线播放 | 狠狠色丁香久久综合网 | 超碰在线网 | 91亚洲狠狠婷婷综合久久久 | 亚洲精品视频中文字幕 | 99精品视频在线观看视频 | 波多野结衣在线视频免费观看 | 欧美日本啪啪无遮挡网站 | 丁香婷婷久久 | 免费成人在线网站 | 日黄网站 | 国产精品黑丝在线观看 | 日韩电影中文,亚洲精品乱码 | 免费在线看成人av | 久久草草影视免费网 | 国产精品人成电影在线观看 | 91激情视频在线播放 | 中文字幕a∨在线乱码免费看 | 天天色天天射天天干 | 亚州精品天堂中文字幕 | 亚洲国产中文字幕 | 成人一区二区在线观看 | 精品国产1区| 久久精品播放 | 视频91在线| 亚洲高清91| 麻豆91在线观看 | 久久中文欧美 | 一本一本久久a久久精品牛牛影视 | 五月天丁香 | 中文字幕第 | 狠狠色2019综合网 | 久久久精品国产免费观看同学 | 中文字幕一区二区三区四区 | 久久久久久久久久久免费视频 | 狠狠gao | 黄a在线观看 | 色香网 | 亚洲视频久久久久 | 国产99久久久国产精品成人免费 | 四虎永久视频 | 国产精品99久久久久久久久 | 日本三级在线观看中文字 | 国产精品1区2区在线观看 | 黄色天堂在线观看 | 日本中文字幕系列 | 国产精品美 | 国产精品久久久久久一二三四五 | 色婷婷亚洲精品 | 欧美午夜精品久久久久 | 五月天九九 | 伊人电影在线观看 | 黄色成人影院 | 中文字幕人成不卡一区 | 不卡的av | 五月婷婷黄色 | 国产成人免费网站 | 免费观看的黄色片 | 中文字幕大全 | 波多野结衣电影一区二区 | 中文字幕不卡在线88 | 亚洲另类视频在线观看 | 日韩精品一区电影 | 午夜av在线播放 | 麻豆免费视频网站 | 美女久久久久久久久久 | 最近乱久中文字幕 | 免费人做人爱www的视 | 99色精品视频 | 国产在线色 | 亚洲精品午夜久久久 | 香蕉网站在线观看 | 狠狠狠色狠狠色综合 | av电影久久 | 色中色亚洲 | 国内久久久 | 69精品 | 最近高清中文字幕 | 四虎国产精品免费观看视频优播 | 在线天堂中文在线资源网 | 91精品视频免费在线观看 | 亚洲一区二区三区毛片 | 精品国产一区二区三区日日嗨 | 国产美女主播精品一区二区三区 | 日韩欧美有码在线 | 9在线观看免费 | 日韩在线视频观看免费 | 亚洲综合导航 | 97av在线视频免费播放 | 狠狠色丁香久久婷婷综合_中 | 人人澡人人爱 | 日韩欧美在线观看一区二区三区 | 91热精品| 国产一区麻豆 | 夜夜干天天操 | 91影视成人 | av免费在线网| 国产精品成久久久久 | 欧美怡红院视频 | 麻豆国产网站 | 免费中文字幕在线观看 | 免费能看的av | 久久系列 | 狠狠操操 | 国产精品成人在线 | 欧美久久99 | 99国产高清| 国产午夜精品在线 | 国产精彩视频 | 日韩在线观看小视频 | 日av免费| 精品视频免费在线 | 婷婷精品在线视频 | 成年人黄色大片在线 | 91看片淫黄大片在线播放 | 国产精品女同一区二区三区久久夜 | 亚洲美女在线国产 | 中文字幕在线视频国产 | 99视频在线观看视频 | www日韩欧美 | 成人国产一区 | 亚洲91精品 | 亚洲精品久久久久久久不卡四虎 | 国产色在线观看 | 夜色在线资源 | 麻豆一区在线观看 | 在线电影日韩 | 国产一级视频在线免费观看 | 日日干综合 | 99se视频在线观看 | 亚洲精品国产成人 | 在线观看 亚洲 | 精品久久久999 | 国产精品国产毛片 | 国产精品乱码在线 | 在线观看91 | 欧美一级片免费观看 | 激情亚洲综合在线 | 青青草国产精品 | 在线观看一| 99c视频高清免费观看 | 麻豆一二| 久草视频国产 | 亚洲精区二区三区四区麻豆 | 日本女人的性生活视频 | 国产精品久久久久久久久费观看 | 99精品在线免费在线观看 | 亚洲国产精品va在线看 | 国产第一页精品 | 国产精品麻豆99久久久久久 | 亚洲天堂视频在线 | 免费97视频 | 成年美女黄网站色大片免费看 | 日本久久久久久久久 | 91丨精品丨蝌蚪丨白丝jk | 麻豆视频在线观看免费 | a午夜在线 | 国产1级视频 | 午夜精品av在线 | 国产在线观看你懂得 | 成年人电影毛片 | 中文字幕有码在线 | 国产成人精品一区二 | av黄免费看| 97超碰在线久草超碰在线观看 | 99精品视频免费看 | 国产一级黄色av | 免费在线观看成人小视频 | 国产小视频在线观看免费 | 97在线观看免费视频 | 国产精品不卡在线观看 | av一区二区三区在线播放 | 亚洲精品在线观看不卡 | 韩日视频在线 | 免费色视频网站 | 91人人射 | 亚洲精品国产拍在线 | 99精品视频观看 | 精品国产人成亚洲区 | 国产超碰在线 | 九九视频免费在线观看 | 亚洲电影成人 | 国产一区在线免费观看视频 | 日日干影院| 亚洲激情网站免费观看 | 91传媒激情理伦片 | 成人黄色中文字幕 | 日韩超碰 | 亚洲精品理论片 | 伊人天堂久久 | 久草在线观 | 国产成人专区 | 国产美女视频一区 | 久久国产精品视频 | 色综合久久88色综合天天人守婷 | 久草网免费 | 日本特黄一级片 | 日韩中文字幕a | 国内精品久久久久久中文字幕 | 九九精品久久久 | 亚洲视频每日更新 | 国产美女免费 | 国产亚洲精品久久久久久电影 | 97在线免费 | 中文字幕最新精品 | 黄色毛片大全 | 日韩免费电影一区二区三区 | 黄污网| 国产精品久久三 | 麻豆国产网站 | 精品麻豆入口免费 | 中文字幕在线看 | 91看片淫黄大片在线播放 | 久久精品国产免费 | 极品久久久久久久 | 婷婷黄色片| 日韩欧美精品在线观看 | 欧美一区二区在线 | 91av蜜桃| 最新av中文字幕 | 在线a人片免费观看视频 | 丁香九月婷婷综合 | 国产精品不卡在线观看 | 中文字幕高清视频 | 亚洲精品视频www | 在线观看亚洲免费视频 | 91一区啪爱嗯打偷拍欧美 | 九草视频在线 | 最近中文字幕免费大全 | 伊人色综合久久天天 | 在线精品观看国产 | 国产一级性生活 | 激情五月婷婷 | 99riav1国产精品视频 | 国产在线91精品 | 伊人国产在线播放 | 国产精品久久久久久久免费 | 午夜在线免费视频 | 激情五月婷婷激情 | 91av在| 国产精品久久久久永久免费看 | 黄色大片视频网站 | 天天综合网天天综合色 | 日韩av黄 | 国产精品中文字幕av | 国产婷婷在线观看 | 久久人人精品 | 最近最新最好看中文视频 | 日韩大片在线播放 | 99视频一区| 精品免费在线视频 | 色资源二区在线视频 | 色婷婷视频在线 | 国产成人免费精品 | 国产综合91| 欧美va天堂va视频va在线 | 999国产精品视频 | 国产精品久久久视频 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 天天爽天天搞 | 亚洲精品国精品久久99热 | a国产精品 | 美女视频黄是免费的 | 亚洲国产一区在线观看 | 国产成人精品久 | 国产精品99页 | 91高清免费| 欧美日韩在线视频观看 | 国产经典av | 国产精品久久久久久久久毛片 | 色婷婷狠狠| 美女性爽视频国产免费app | 国产99久久久久久免费看 | 国产伦理精品一区二区 | 精品黄色片| wwwav视频| 欧洲色综合 | 人人舔人人干 | 欧美韩国在线 | 国产视频亚洲视频 | 欧美精品网站 | 五月开心综合 | 亚洲在线视频播放 | 97人人看| 天天摸日日操 | 91私密视频 | 中文字幕一区二区三区在线播放 | 色久五月| 国产在线探花 | 永久中文字幕 | 日韩精品一二三 | 00av视频 | 国产亚洲人 | 色播99| 99精品免费在线观看 | 中文字幕色在线 | 国产黄色免费电影 | 国产精品99久久久久 | 性日韩欧美在线视频 | 999男人的天堂| 五月婷婷电影网 | 久色网 | 久久精品香蕉 | 久久精品99久久久久久2456 | 国产精品18久久久久久首页狼 | 国产v亚洲v | h视频在线看 | 色丁香色婷婷 | 九九视频精品免费 | 日韩久久精品一区二区三区下载 | 国产小视频在线看 | 91高清视频免费 | 久久精品女人毛片国产 | 亚洲国产三级在线观看 | 日韩在线视频网 | 欧美激情综合五月 | 人人爱人人做人人爽 | 色多多污污在线观看 | 久久草在线精品 | 国产成人精品999 | 天天操天天操天天操天天操天天操天天操 | 国产亚洲婷婷免费 | 99久久精品久久久久久动态片 | 久久久免费看片 | 69精品久久久 | 国产91精品久久久久 | 蜜臀久久99静品久久久久久 | 激情网第四色 | 国产精品第 | 国产色婷婷 | 色综合久久88色综合天天人守婷 | 亚洲人人av | 最近中文字幕在线播放 | 国产精品粉嫩 | www.91av在线 | 久久成人黄色 | 99精品视频在线观看播放 | 激情婷婷在线观看 | 91成人免费看片 | 亚洲欧美视频网站 | 色综合天天综合网国产成人网 | 久产久精国产品 | 久久99操 | 成人久久免费 | 永久免费观看视频 | 国产精品日韩久久久久 | 麻豆成人在线观看 | 97电影在线观看 | 日韩99热| 日韩精品大片 | 色综合天天综合 | 国产精品久久久久久久久毛片 | 久久久久久久久久久综合 | 91久久精品一区二区二区 | 国产欧美综合视频 | 99精品视频精品精品视频 | 91香蕉视频在线下载 | 免费av看片 | 伊人日日干 | 国产一级91 | 免费福利在线播放 | 黄色一级动作片 | 天操夜夜操 | 欧美成人精品三级在线观看播放 | 热久久电影 | 欧美大片大全 | 丁香婷婷激情国产高清秒播 | 久久久久国产一区二区三区四区 | 五月婷婷久久综合 | 99久久精品午夜一区二区小说 | 在线观看片 | 国产精选在线观看 | 国产精品视频专区 | 亚洲五月六月 | 国产精品人人做人人爽人人添 | 亚洲日b视频 | 欧美一区在线观看视频 | 国内免费的中文字幕 | 成年美女黄网站色大片免费看 | 欧美性精品 | 国内精品国产三级国产aⅴ久 | 97免费在线观看 | 欧美 另类 交 | 国产黄色大片 | 激情五月伊人 | 色91av | 99 色 | 亚洲狠狠干 | 天天鲁天天干天天射 | 亚洲精品国产第一综合99久久 |