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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

仿微信 即时聊天工具 - SignalR (一)

發(fā)布時間:2024/8/1 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 仿微信 即时聊天工具 - SignalR (一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

話不多說,先上圖

?

?

?

?

?

?

背景:

微信聊天,經(jīng)常會遇見視頻發(fā)不了,嗯,還有聊天不方便的問題,于是我就自己買了服務(wù)器,部署了一套可以直接在微信打開的網(wǎng)頁進行聊天,這樣只需要發(fā)送個url給朋友,就能聊天了!

由于自己無聊弄著玩的,代碼比較粗糙,各位多指正!

1、首先安裝SignalR,這步我就不做過多說明了

安裝好以后在根目錄新建一個Hubs文件夾,做用戶的注冊和通知

MessageHub.cs 文件

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

using?Microsoft.AspNet.SignalR;

using?Microsoft.AspNet.SignalR.Hubs;

using?System;

using?System.Collections;

using?System.Collections.Generic;

using?System.Linq;

using?System.Threading;

using?System.Threading.Tasks;

using?System.Web;

?

namespace?SignalR.Hubs

{

????[HubName("MessageHub")]

????public?class?MessageHub : Hub

????????{

????????????private?readonly?ChatTicker ticker;

????????????public?MessageHub()

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

????????????????ticker = ChatTicker.Instance;

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

?

????????????public?void?register(string?username,?string?group?=?"default")

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

????????????????var?list = (List<SiginalRModel>)HttpRuntime.Cache.Get("msg_hs");

????????????????if?(list ==?null)

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

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

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

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

?

????????????????if?(list.Any(x => x.connectionId == Context.ConnectionId))

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

????????????????????Clients.Client(Context.ConnectionId).broadcastMessage("已經(jīng)注冊,無需再次注冊");

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

????????????else?if?(list.Any(x => x.name == username))

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

????????????????var?model = list.Where(x => x.name == username && x.group?==?group).FirstOrDefault();

????????????????if?(model !=?null)

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

????????????????????//注冊到全局?

????????????????????ticker.GlobalContext.Groups.Add(Context.ConnectionId,?group);

????????????????????Clients.Client(model.connectionId).exit();

????????????????????ticker.GlobalContext.Groups.Remove(model.connectionId,?group);

????????????????????list.Remove(model);

????????????????????model.connectionId = Context.ConnectionId;

????????????????????list.Add(model);

????????????????????Clients.Group(group).removeUserList(model.connectionId);

????????????????????Thread.Sleep(200);

????????????????????var?gourpList = list.Where(x => x.group?==?group).ToList();

????????????????????Clients.Group(group).appendUserList(Context.ConnectionId, gourpList);

????????????????????HttpRuntime.Cache.Insert("msg_hs", list);

????????????????????// Clients.Client(model.connectionId).broadcastMessage("名稱重復(fù),只能注冊一個");

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

????????????????//Clients.Client(Context.ConnectionId).broadcastMessage("名稱重復(fù),只能注冊一個");

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

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

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

????????????????????list.Add(new?SiginalRModel() { name = username,?group?=?group, connectionId = Context.ConnectionId });

?

????????????????????//注冊到全局?

????????????????????ticker.GlobalContext.Groups.Add(Context.ConnectionId,?group);

????????????????????Thread.Sleep(200);

?

????????????????????var?gourpList = list.Where(x => x.group?==?group).ToList();

????????????????????Clients.Group(group).appendUserList(Context.ConnectionId, gourpList);

????????????????????HttpRuntime.Cache.Insert("msg_hs", list);

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

?

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

?

????????????public?void?Say(string?msg)

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

????????????????var?list = (List<SiginalRModel>)HttpRuntime.Cache.Get("msg_hs");

????????????????if?(list ==?null)

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

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

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

????????????????var?userModel = list.Where(x => x.connectionId == Context.ConnectionId).FirstOrDefault();

????????????????if?(userModel !=?null?)

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

????????????????????Clients.Group(userModel.group).Say(userModel.name, msg);

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

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

?

????????public?void?Exit()

????????{

????????????OnDisconnected(true);

????????}

?

????????public?override?Task OnDisconnected(bool?s)

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

????????????????????var?list = (List<SiginalRModel>)HttpRuntime.Cache.Get("msg_hs");

????????????????????if?(list ==?null)

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

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

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

????????????????????var?closeModel = list.Where(x => x.connectionId == Context.ConnectionId).FirstOrDefault();

?

????????????????????if?(closeModel !=?null)

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

????????????????????????list.Remove(closeModel);

?

????????????????????????Clients.Group(closeModel.group).removeUserList(Context.ConnectionId);

?

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

????????????????????HttpRuntime.Cache.Insert("msg_hs", list);

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

????????????????????return?base.OnDisconnected(s);

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

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

?????????

?

????public?class?ChatTicker

????????{

????????????#region 實現(xiàn)一個單例

?

????????????private?static?readonly?ChatTicker _instance =

????????????????new?ChatTicker(GlobalHost.ConnectionManager.GetHubContext<MessageHub>());

?

????????????private?readonly?IHubContext m_context;

?

????????????private?ChatTicker(IHubContext context)

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

?

????????????????m_context = context;

????????????????//這里不能直接調(diào)用Sender,因為Sender是一個不退出的“死循環(huán)”,否則這個構(gòu)造函數(shù)將不會退出。?

????????????????//其他的流程也將不會再執(zhí)行下去了。所以要采用異步的方式。?

????????????????//Task.Run(() => Sender());

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

?

????????????public?IHubContext GlobalContext

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

????????????????get?{?return?m_context; }

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

?

????????????public?static?ChatTicker Instance

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

????????????????get?{?return?_instance; }

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

?

????????????#endregion

????????}

?

????public?class?SiginalRModel {

????????public?string?connectionId {?get;?set; }

?

????????public?string?group?{?get;?set; }

????????public?string?name {?get;?set; }

????}

}<br data-filtered="filtered"><br data-filtered="filtered">我把類和方法都寫到一塊了,大家最好是分開!

?

接下來是控制器

HomeController.cs

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

using?Microsoft.AspNet.SignalR;

using?Microsoft.AspNet.SignalR.Client;

using?SignalR.Hubs;

using?SignalR.ViewModels;

using?System;

using?System.Collections;

using?System.Collections.Generic;

using?System.IO;

using?System.Linq;

using?System.Web;

using?System.Web.Mvc;

using?Newtonsoft.Json;

using?System.Diagnostics;

using?System.Text.RegularExpressions;

?

namespace?SignalR.Controllers

{

????public?class?HomeController : Controller

????{

????????public?ActionResult Index()

????????{

?????

????????????return?View();

????????}

?

?

????????public?ActionResult GetV(string?v)

????????{

????????????if?(!string.IsNullOrEmpty(v))

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

????????????????string?url = RedisHelper.Get(v)?.ToString();

????????????????if?(!string.IsNullOrEmpty(url))

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

????????????????????return?Json(new?{ isOk =?true, m = url }, JsonRequestBehavior.AllowGet);

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

????????????????return?Json(new?{ isOk =?false}, JsonRequestBehavior.AllowGet);

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

????????????return?Json(new?{ isOk =?false?}, JsonRequestBehavior.AllowGet);

????????}

?

????????public?ActionResult getkey(string?url)

????????{

????????????if?(!string.IsNullOrEmpty(url))

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

????????????????var?s =?"v"?+ Util.GetRandomLetterAndNumberString(new?Random(), 5).ToLower();

????????????????var?dt = Convert.ToDateTime(DateTime.Now.AddDays(1).ToString("yyyy-MM-dd 04:00:00"));

????????????????int?min = Convert.ToInt16((dt - DateTime.Now).TotalMinutes);

????????????????RedisHelper.Set(s, url, min);

????????????????return?Json(new?{ isOk =?true, m = s }, JsonRequestBehavior.AllowGet);

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

????????????return?Json(new?{ isOk =?false?}, JsonRequestBehavior.AllowGet);

????????}

?

????????public?ActionResult upfile()

????????{

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

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

????????????????if?(Request.Files.Count > 0)

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

????????????????????var?file = Request.Files[0];

????????????????????if?(file !=?null)

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

????????????????????????var?imgList =?new?List<string>() {?".gif",?".jpg",?".bmp",?".png"?};

????????????????????????var?videoList =?new?List<string>() {?".mp4"?};

????????????????????????FileModel fmodel =?new?FileModel();

?

????????????????????????string?name = Guid.NewGuid().ToString();

????????????????????????string?fileExt = Path.GetExtension(file.FileName).ToLower();//上傳文件擴展名

????????????????????????string?path = Server.MapPath("~/files/") + name + fileExt;

????????????????????????file.SaveAs(path);

?

????????????????????????string?extension =?new?FileInfo(path).Extension;

?

????????????????????????if?(extension ==?".mp4")

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

????????????????????????????fmodel.t = 2;

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

????????????????????????else?if?(imgList.Contains(extension))

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

????????????????????????????fmodel.t = 1;

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

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

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

????????????????????????????fmodel.t = 0;

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

????????????????????????string?url = Guid.NewGuid().ToString();

????????????????????????fmodel.url =?"http://"?+ Request.Url.Host;

????????????????????????if?(Request.Url.Port != 80)

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

????????????????????????????fmodel.url +=?":"?+ Request.Url.Port;

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

????????????????????????fmodel.url +=?"/files/"?+ name + fileExt;

????????????????????????GetImageThumb(Server.MapPath("~") +?"files\\"?+ name + fileExt, name);

????????????????????????return?Json(new?{ isOk =?true, m =?"file:"?+ JsonConvert.SerializeObject(fmodel) }, JsonRequestBehavior.AllowGet);

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

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

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

????????????catch(Exception ex)

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

????????????????Log.Info(ex);

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

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

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

????????????return?Content("");

????????}

?

????????public?string?GetImageThumb(string?localVideo,string?name)

????????{

????????????string?path = AppDomain.CurrentDomain.BaseDirectory;

????????????string?ffmpegPath = path +?"/ffmpeg.exe";

????????????string?oriVideoPath = localVideo;

????????????int?frameIndex = 5;

????????????int?_thubWidth;

????????????int?_thubHeight;

????????????GetMovWidthAndHeight(localVideo,?out?_thubWidth,?out?_thubHeight);

????????????int?thubWidth = 200;

????????????int?thubHeight = _thubWidth == 0 ? 200 : (thubWidth * _thubHeight / _thubWidth );?

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

????????????string?thubImagePath = path +??"files\\"?+ name +?".jpg";

????????????string?command =?string.Format("\"{0}\" -i \"{1}\" -ss {2} -vframes 1 -r 1 -ac 1 -ab 2 -s {3}*{4} -f image2 \"{5}\"", ffmpegPath, oriVideoPath, frameIndex, thubWidth, thubHeight, thubImagePath);

????????????Cmd.RunCmd(command);

????????????return?name;

????????}

?

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

????????/// 獲取視頻的幀寬度和幀高度

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

????????/// <param name="videoFilePath">mov文件的路徑</param>

????????/// <returns>null表示獲取寬度或高度失敗</returns>

????????public?static?void?GetMovWidthAndHeight(string?videoFilePath,?out?int?width,?out?int?height)

????????{

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

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

?

????????????????//執(zhí)行命令獲取該文件的一些信息

????????????????string?ffmpegPath = AppDomain.CurrentDomain.BaseDirectory +??"/ffmpeg.exe";

????????????????string?output;

????????????????string?error;

????????????????ExecuteCommand("\""?+ ffmpegPath +?"\""?+?" -i "?+?"\""?+ videoFilePath +?"\"",?out?output,?out?error);

????????????????if?(string.IsNullOrEmpty(error))

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

????????????????????width = 0;

????????????????????height = 0;

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

?

????????????????//通過正則表達式獲取信息里面的寬度信息

????????????????Regex regex =?new?Regex("(\\d{2,4})x(\\d{2,4})", RegexOptions.Compiled);

????????????????Match m = regex.Match(error);

????????????????if?(m.Success)

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

????????????????????width =?int.Parse(m.Groups[1].Value);

????????????????????height =?int.Parse(m.Groups[2].Value);

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

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

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

????????????????????width = 0;

????????????????????height = 0;

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

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

????????????catch?(Exception)

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

????????????????width = 0;

????????????????height = 0;

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

????????}

?

????????public?static?void?ExecuteCommand(string?command,?out?string?output,?out?string?error)

????????{

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

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

????????????????//創(chuàng)建一個進程

????????????????Process pc =?new?Process();

????????????????pc.StartInfo.FileName = command;

????????????????pc.StartInfo.UseShellExecute =?false;

????????????????pc.StartInfo.RedirectStandardOutput =?true;

????????????????pc.StartInfo.RedirectStandardError =?true;

????????????????pc.StartInfo.CreateNoWindow =?true;

?

????????????????//啟動進程

????????????????pc.Start();

?

????????????????//準(zhǔn)備讀出輸出流和錯誤流

????????????????string?outputData =?string.Empty;

????????????????string?errorData =?string.Empty;

????????????????pc.BeginOutputReadLine();

????????????????pc.BeginErrorReadLine();

?

????????????????pc.OutputDataReceived += (ss, ee) =>

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

????????????????????outputData += ee.Data;

????????????????};

?

????????????????pc.ErrorDataReceived += (ss, ee) =>

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

????????????????????errorData += ee.Data;

????????????????};

?

????????????????//等待退出

????????????????pc.WaitForExit();

?

????????????????//關(guān)閉進程

????????????????pc.Close();

?

????????????????//返回流結(jié)果

????????????????output = outputData;

????????????????error = errorData;

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

????????????catch?(Exception)

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

????????????????output =?null;

????????????????error =?null;

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

????????}

?

????}

?

????public?class?Util

????{

????????public?static?string?GetRandomLetterAndNumberString(Random random,?int?length)

????????{

????????????if?(length < 0)

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

????????????????throw?new?ArgumentOutOfRangeException("length");

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

????????????char[] pattern =?new?char[] {?'0',?'1',?'2',?'3',?'4',?'5',?'6',?'7',?'8',?'9',

????????'A',?'B',?'C',?'D',?'E',?'F',?'G',?'H',?'I',?'J',?'K',?'L',?'M',?'N',?'O',?'P',

????????'Q',?'R',?'S',?'T',?'U',?'V',?'W',?'X',?'Y',?'Z'?};

????????????string?result =?"";

????????????int?n = pattern.Length;

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

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

????????????????int?rnd = random.Next(0, n);

????????????????result += pattern[rnd];

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

????????????return?result;

????????}

????}

?

????class?Cmd

????{

????????private?static?string?CmdPath =?@"C:\Windows\System32\cmd.exe";

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

????????/// 執(zhí)行cmd命令 返回cmd窗口顯示的信息

????????/// 多命令請使用批處理命令連接符:

????????/// <![CDATA[

????????/// &:同時執(zhí)行兩個命令

????????/// |:將上一個命令的輸出,作為下一個命令的輸入

????????/// &&:當(dāng)&&前的命令成功時,才執(zhí)行&&后的命令

????????/// ||:當(dāng)||前的命令失敗時,才執(zhí)行||后的命令]]>

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

????????/// <param name="cmd">執(zhí)行的命令</param>

????????public?static?string?RunCmd(string?cmd)

????????{

????????????cmd = cmd.Trim().TrimEnd('&') +?"&exit";//說明:不管命令是否成功均執(zhí)行exit命令,否則當(dāng)調(diào)用ReadToEnd()方法時,會處于假死狀態(tài)

????????????using?(Process p =?new?Process())

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

????????????????p.StartInfo.FileName = CmdPath;

????????????????p.StartInfo.UseShellExecute =?false;????????//是否使用操作系統(tǒng)shell啟動

????????????????p.StartInfo.RedirectStandardInput =?true;???//接受來自調(diào)用程序的輸入信息

????????????????p.StartInfo.RedirectStandardOutput =?true;??//由調(diào)用程序獲取輸出信息

????????????????p.StartInfo.RedirectStandardError =?true;???//重定向標(biāo)準(zhǔn)錯誤輸出

????????????????p.StartInfo.CreateNoWindow =?true;??????????//不顯示程序窗口

????????????????p.Start();//啟動程序

?

????????????????//向cmd窗口寫入命令

????????????????p.StandardInput.WriteLine(cmd);

????????????????p.StandardInput.AutoFlush =?true;

?

????????????????//獲取cmd窗口的輸出信息

????????????????string?output = p.StandardOutput.ReadToEnd();

????????????????p.WaitForExit();//等待程序執(zhí)行完退出進程

????????????????p.Close();

?

????????????????return?output;

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

????????}

????}

}<br data-filtered="filtered"><br data-filtered="filtered">我還是都寫到一塊了,大家記得分開!

SController.cs? 這個是針對手機端單獨拎出來的,里面不需要什么內(nèi)容

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

using?System;

using?System.Collections.Generic;

using?System.Linq;

using?System.Web;

using?System.Web.Mvc;

?

namespace?SignalR.Controllers

{

????public?class?SController : Controller

????{

????????// GET: S

????????public?ActionResult Index()

????????{

????????????return?View();

????????}

????}

}

 根目錄新建一個ViewModels文件夾,里面新建FileModel.cs文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

using?System;

using?System.Collections.Generic;

using?System.Linq;

using?System.Web;

?

namespace?SignalR.ViewModels

{

????public?class?FileModel

????{

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

????????/// 1 : 圖片? 2:視頻

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

????????public?int?t {?get;?set; }

?

????????public?string?url {?get;?set; }

????}

} 

RedisHelper.cs

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

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

using?Microsoft.AspNet.SignalR.Messaging;

using?StackExchange.Redis;

using?System;

using?System.Collections.Generic;

using?System.IO;

using?System.Linq;

using?System.Net;

using?System.Runtime.Serialization.Formatters.Binary;

using?System.Threading.Tasks;

using?System.Web;

?

namespace?SignalR

{

????public?class?RedisHelper

????{

????????private?static?string?Constr =?"xxxx.cn:6379";

?

????????private?static?object?_locker =?new?Object();

????????private?static?ConnectionMultiplexer _instance =?null;

?

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

????????/// 使用一個靜態(tài)屬性來返回已連接的實例,如下列中所示。這樣,一旦 ConnectionMultiplexer 斷開連接,便可以初始化新的連接實例。

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

????????public?static?ConnectionMultiplexer Instance

????????{

????????????get

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

????????????????if?(Constr.Length == 0)

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

????????????????????throw?new?Exception("連接字符串未設(shè)置!");

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

????????????????if?(_instance ==?null)

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

????????????????????lock?(_locker)

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

????????????????????????if?(_instance ==?null?|| !_instance.IsConnected)

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

????????????????????????????_instance = ConnectionMultiplexer.Connect(Constr);

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

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

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

????????????????//注冊如下事件

????????????????_instance.ConnectionFailed += MuxerConnectionFailed;

????????????????_instance.ConnectionRestored += MuxerConnectionRestored;

????????????????_instance.ErrorMessage += MuxerErrorMessage;

????????????????_instance.ConfigurationChanged += MuxerConfigurationChanged;

????????????????_instance.HashSlotMoved += MuxerHashSlotMoved;

????????????????_instance.InternalError += MuxerInternalError;

????????????????return?_instance;

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

????????}

?

????????static?RedisHelper()

????????{

????????}

?

?

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

????????///

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

????????/// <returns></returns>

????????public?static?IDatabase GetDatabase()

????????{

????????????return?Instance.GetDatabase();

????????}

?

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

????????/// 這里的 MergeKey 用來拼接 Key 的前綴,具體不同的業(yè)務(wù)模塊使用不同的前綴。

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

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

????????/// <returns></returns>

????????private?static?string?MergeKey(string?key)

????????{

????????????return?"SignalR:"+ key;

????????????//return BaseSystemInfo.SystemCode + key;

????????}

?

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

????????/// 根據(jù)key獲取緩存對象

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

????????/// <typeparam name="T"></typeparam>

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

????????/// <returns></returns>

????????public?static?T Get<T>(string?key)

????????{

????????????key = MergeKey(key);

????????????return?Deserialize<T>(GetDatabase().StringGet(key));

????????}

?

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

????????/// 根據(jù)key獲取緩存對象

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

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

????????/// <returns></returns>

????????public?static?object?Get(string?key)

????????{

????????????key = MergeKey(key);

????????????return?Deserialize<object>(GetDatabase().StringGet(key));

????????}

?

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

????????/// 設(shè)置緩存

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

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

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

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

????????public?static?void?Set(string?key,?object?value,?int?expireMinutes = 0)

????????{

????????????key = MergeKey(key);

????????????if?(expireMinutes > 0)

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

????????????????GetDatabase().StringSet(key, Serialize(value), TimeSpan.FromMinutes(expireMinutes));

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

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

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

????????????????GetDatabase().StringSet(key, Serialize(value));

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

?

????????}

?

?

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

????????/// 判斷在緩存中是否存在該key的緩存數(shù)據(jù)

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

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

????????/// <returns></returns>

????????public?static?bool?Exists(string?key)

????????{

????????????key = MergeKey(key);

????????????return?GetDatabase().KeyExists(key);?//可直接調(diào)用

????????}

?

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

????????/// 移除指定key的緩存

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

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

????????/// <returns></returns>

????????public?static?bool?Remove(string?key)

????????{

????????????key = MergeKey(key);

????????????return?GetDatabase().KeyDelete(key);

????????}

?

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

????????/// 異步設(shè)置

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

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

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

????????public?static?async Task SetAsync(string?key,?object?value)

????????{

????????????key = MergeKey(key);

????????????await GetDatabase().StringSetAsync(key, Serialize(value));

????????}

?

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

????????/// 根據(jù)key獲取緩存對象

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

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

????????/// <returns></returns>

????????public?static?async Task<object> GetAsync(string?key)

????????{

????????????key = MergeKey(key);

????????????object?value = await GetDatabase().StringGetAsync(key);

????????????return?value;

????????}

?

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

????????/// 實現(xiàn)遞增

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

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

????????/// <returns></returns>

????????public?static?long?Increment(string?key)

????????{

????????????key = MergeKey(key);

????????????//三種命令模式

????????????//Sync,同步模式會直接阻塞調(diào)用者,但是顯然不會阻塞其他線程。

????????????//Async,異步模式直接走的是Task模型。

????????????//Fire - and - Forget,就是發(fā)送命令,然后完全不關(guān)心最終什么時候完成命令操作。

????????????//即發(fā)即棄:通過配置 CommandFlags 來實現(xiàn)即發(fā)即棄功能,在該實例中該方法會立即返回,如果是string則返回null 如果是int則返回0.這個操作將會繼續(xù)在后臺運行,一個典型的用法頁面計數(shù)器的實現(xiàn):

????????????return?GetDatabase().StringIncrement(key, flags: CommandFlags.FireAndForget);

????????}

?

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

????????/// 實現(xiàn)遞減

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

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

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

????????/// <returns></returns>

????????public?static?long?Decrement(string?key,?string?value)

????????{

????????????key = MergeKey(key);

????????????return?GetDatabase().HashDecrement(key, value, flags: CommandFlags.FireAndForget);

????????}

?

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

????????/// 序列化對象

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

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

????????/// <returns></returns>

????????private?static?byte[] Serialize(object?o)

????????{

????????????if?(o ==?null)

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

????????????????return?null;

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

????????????BinaryFormatter binaryFormatter =?new?BinaryFormatter();

????????????using?(MemoryStream memoryStream =?new?MemoryStream())

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

????????????????binaryFormatter.Serialize(memoryStream, o);

????????????????byte[] objectDataAsStream = memoryStream.ToArray();

????????????????return?objectDataAsStream;

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

????????}

?

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

????????/// 反序列化對象

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

????????/// <typeparam name="T"></typeparam>

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

????????/// <returns></returns>

????????private?static?T Deserialize<T>(byte[] stream)

????????{

????????????if?(stream ==?null)

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

????????????????return?default(T);

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

????????????BinaryFormatter binaryFormatter =?new?BinaryFormatter();

????????????using?(MemoryStream memoryStream =?new?MemoryStream(stream))

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

????????????????T result = (T)binaryFormatter.Deserialize(memoryStream);

????????????????return?result;

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

????????}

?

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

????????/// 配置更改時

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

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

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

????????private?static?void?MuxerConfigurationChanged(object?sender, EndPointEventArgs e)

????????{

????????????//LogHelper.SafeLogMessage("Configuration changed: " + e.EndPoint);

????????}

?

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

????????/// 發(fā)生錯誤時

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

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

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

????????private?static?void?MuxerErrorMessage(object?sender, RedisErrorEventArgs e)

????????{

????????????//LogHelper.SafeLogMessage("ErrorMessage: " + e.Message);

????????}

?

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

????????/// 重新建立連接之前的錯誤

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

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

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

????????private?static?void?MuxerConnectionRestored(object?sender, ConnectionFailedEventArgs e)

????????{

????????????//LogHelper.SafeLogMessage("ConnectionRestored: " + e.EndPoint);

????????}

?

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

????????/// 連接失敗 , 如果重新連接成功你將不會收到這個通知

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

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

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

????????private?static?void?MuxerConnectionFailed(object?sender, ConnectionFailedEventArgs e)

????????{

????????????//LogHelper.SafeLogMessage("重新連接:Endpoint failed: " + e.EndPoint + ", " + e.FailureType +(e.Exception == null ? "" : (", " + e.Exception.Message)));

????????}

?

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

????????/// 更改集群

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

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

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

????????private?static?void?MuxerHashSlotMoved(object?sender, HashSlotMovedEventArgs e)

????????{

????????????//LogHelper.SafeLogMessage("HashSlotMoved:NewEndPoint" + e.NewEndPoint + ", OldEndPoint" + e.OldEndPoint);

????????}

?

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

????????/// redis類庫錯誤

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

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

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

????????private?static?void?MuxerInternalError(object?sender, InternalErrorEventArgs e)

????????{

????????????//LogHelper.SafeLogMessage("InternalError:Message" + e.Exception.Message);

????????}

?

????????//場景不一樣,選擇的模式便會不一樣,大家可以按照自己系統(tǒng)架構(gòu)情況合理選擇長連接還是Lazy。

????????//建立連接后,通過調(diào)用ConnectionMultiplexer.GetDatabase 方法返回對 Redis Cache 數(shù)據(jù)庫的引用。從 GetDatabase 方法返回的對象是一個輕量級直通對象,不需要進行存儲。

?

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

????????/// 使用的是Lazy,在真正需要連接時創(chuàng)建連接。

????????/// 延遲加載技術(shù)

????????/// 微軟azure中的配置 連接模板

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

????????//private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>

????????//{

????????//??? //var options = ConfigurationOptions.Parse(constr);

????????//??? options.ClientName = GetAppName(); // only known at runtime

????????//??? //options.AllowAdmin = true;

????????//??? //return ConnectionMultiplexer.Connect(options);

????????//??? ConnectionMultiplexer muxer = ConnectionMultiplexer.Connect(Coonstr);

????????//??? muxer.ConnectionFailed += MuxerConnectionFailed;

????????//??? muxer.ConnectionRestored += MuxerConnectionRestored;

????????//??? muxer.ErrorMessage += MuxerErrorMessage;

????????//??? muxer.ConfigurationChanged += MuxerConfigurationChanged;

????????//??? muxer.HashSlotMoved += MuxerHashSlotMoved;

????????//??? muxer.InternalError += MuxerInternalError;

????????//??? return muxer;

????????//});

?

?

????????#region? 當(dāng)作消息代理中間件使用 一般使用更專業(yè)的消息隊列來處理這種業(yè)務(wù)場景

?

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

????????/// 當(dāng)作消息代理中間件使用

????????/// 消息組建中,重要的概念便是生產(chǎn)者,消費者,消息中間件。

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

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

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

????????/// <returns></returns>

????????public?static?long?Publish(string?channel,?string?message)

????????{

????????????StackExchange.Redis.ISubscriber sub = Instance.GetSubscriber();

????????????//return sub.Publish("messages", "hello");

????????????return?sub.Publish(channel, message);

????????}

?

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

????????/// 在消費者端得到該消息并輸出

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

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

????????/// <returns></returns>

????????public?static?void?Subscribe(string?channelFrom)

????????{

????????????StackExchange.Redis.ISubscriber sub = Instance.GetSubscriber();

????????????sub.Subscribe(channelFrom, (channel, message) =>

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

????????????????Console.WriteLine((string)message);

????????????});

????????}

?

????????#endregion

?

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

????????/// GetServer方法會接收一個EndPoint類或者一個唯一標(biāo)識一臺服務(wù)器的鍵值對

????????/// 有時候需要為單個服務(wù)器指定特定的命令

????????/// 使用IServer可以使用所有的shell命令,比如:

????????/// DateTime lastSave = server.LastSave();

????????/// ClientInfo[] clients = server.ClientList();

????????/// 如果報錯在連接字符串后加 ,allowAdmin=true;

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

????????/// <returns></returns>

????????public?static?IServer GetServer(string?host,?int?port)

????????{

????????????IServer server = Instance.GetServer(host, port);

????????????return?server;

????????}

?

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

????????/// 獲取全部終結(jié)點

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

????????/// <returns></returns>

????????public?static?EndPoint[] GetEndPoints()

????????{

????????????EndPoint[] endpoints = Instance.GetEndPoints();

????????????return?endpoints;

????????}

????}

}

  

 總體項目結(jié)構(gòu)是這樣的

?

?

下期我將把前端代碼列出來,這個我只是為了實現(xiàn)功能,大神勿噴

?

轉(zhuǎn)自https://www.cnblogs.com/colyn/p/11976006.html

總結(jié)

以上是生活随笔為你收集整理的仿微信 即时聊天工具 - SignalR (一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

99久久精品国 | 美女网站在线免费观看 | 91丨九色丨丝袜 | 久久久久久免费网 | 狠狠狠狠狠狠狠 | 亚洲天堂va| 久久99久久精品国产 | 国产精品一区免费在线观看 | 免费看十八岁美女 | 韩国av一区二区三区 | 欧美性免费| av中文国产 | 国产亚洲精品成人 | 久久九九九九 | 少妇bbr搡bbb搡bbb | 亚洲国产精品小视频 | 亚洲无毛专区 | 在线 视频 一区二区 | 亚洲国产丝袜在线观看 | 中文字幕在线影院 | 国产精品免费视频一区二区 | 国产成人一区三区 | 午夜精品视频福利 | 天堂网中文在线 | 视频在线观看入口黄最新永久免费国产 | 狠狠色丁香婷婷综合欧美 | 人人爱爱| 国产视频日韩视频欧美视频 | 人人爽人人爽人人片av | 欧美日韩亚洲国产一区 | 日韩激情久久 | 国产国产人免费人成免费视频 | 曰本三级在线 | 亚洲精品国产成人 | 国产在线 一区二区三区 | 国产成人综合在线观看 | 91视频a| 国产黄色免费电影 | 91激情在线视频 | 久久九九精品久久 | 亚州精品在线视频 | 国产一级大片免费看 | 天天操比 | 亚洲mv大片欧洲mv大片免费 | 成人亚洲精品久久久久 | 18国产精品福利片久久婷 | 国产精品视频免费在线观看 | 国产精品久久久久久久av大片 | 日韩欧美视频在线观看免费 | 色综合天天狠狠 | 久久精品视频网站 | 日本护士撒尿xxxx18 | 精品一区 精品二区 | 成人黄色电影在线 | 97超碰伊人| 精品一区二区视频 | 人人搞人人干 | 日韩免费视频播放 | 中文字幕 二区 | 国产精品 中文在线 | 天天射天天操天天色 | 99精品乱码国产在线观看 | 国产香蕉97碰碰久久人人 | 国产中文在线视频 | 久久综合狠狠综合久久激情 | 日韩极品在线 | 五月天久久综合 | 国产精品久久久久久欧美 | 日本乱码在线 | 激情开心| 日韩一区正在播放 | 日本特黄特色aaa大片免费 | 成年人黄色大片在线 | 成片视频免费观看 | 在线观看国产成人av片 | 特级毛片在线观看 | 视频在线一区 | 天天天天天天天操 | 精油按摩av | 激情久久一区二区三区 | 天天伊人狠狠 | 人人狠狠综合久久亚洲婷 | 在线成人免费电影 | 中文欧美字幕免费 | 在线观看网站av | 亚洲理论在线观看电影 | 成年人黄色免费视频 | 五月婷婷丁香激情 | 激情狠狠干 | 最近中文字幕在线 | 日韩免费 | 亚洲精品视频一 | 天天操天天插 | 国产精品免费不卡 | 伊人官网 | 久久国产精品99久久久久久老狼 | 美女视频免费精品 | 视频在线观看入口黄最新永久免费国产 | 九九久久久久99精品 | 国产精品久久久久久久免费观看 | 激情久久伊人 | 免费高清国产 | 一级一片免费看 | 91免费网址 | 国产精品成久久久久三级 | 久久久国产精品网站 | 三级黄色片在线观看 | 91麻豆福利| 国产亚洲精品久久久久久久久久久久 | 很黄很污的视频网站 | 97人人澡人人爽人人模亚洲 | 美女久久视频 | 奇米影视在线99精品 | 五月婷婷狠狠 | 一级片观看| 日韩最新在线 | 69精品视频 | 午夜丰满寂寞少妇精品 | 成人精品福利 | 精品一区二区免费视频 | 黄色一级大片在线免费看产 | 免费在线观看成人小视频 | 成人h视频在线播放 | 久久9999久久 | 国产专区精品视频 | 久草精品在线播放 | 久久午夜电影网 | 黄污网站在线 | 玖玖视频网 | 青青草视频精品 | 黄色av网站在线观看 | 一级片视频在线 | 一区二区三区在线电影 | 成人av电影免费观看 | 在线免费看黄网站 | 成人在线你懂得 | 欧美三级高清 | 亚洲精品中文字幕在线观看 | 中文字幕丝袜 | 国产一级h | 亚洲精品久久久久久久蜜桃 | 国产在线国偷精品产拍 | 亚洲一区二区91 | 亚洲色影爱久久精品 | 欧美日韩精品在线一区二区 | av福利网址导航大全 | 高清精品视频 | 亚洲成人影音 | 国产成人久久av免费高清密臂 | 欧美日韩在线视频免费 | 国产精品久久久久久久久久ktv | 亚洲va男人天堂 | 热re99久久精品国产66热 | 久久免费福利视频 | 天天干天天操天天入 | av免费观看高清 | 字幕网资源站中文字幕 | 精品久久久久久久久久久久久久久久久久 | 黄色av成人在线 | 国产中文字幕在线免费观看 | 日本一区二区三区免费看 | 天天操夜夜想 | 亚洲在线 | avove黑丝 | 欧美日韩视频在线播放 | 日韩免费av在线 | 中文字幕在线播放一区二区 | 日韩最新中文字幕 | 中文字幕乱码一区二区 | 国产在线观看地址 | 色激情五月 | 久久这里只有精品9 | 久草视频在线免费 | aaa日本高清在线播放免费观看 | 91私密保健 | 中文字幕乱偷在线 | 欧美十八 | 欧美日韩中文在线观看 | 九九热免费在线视频 | 亚洲精品乱码久久久久久高潮 | 欧美日韩不卡在线视频 | 色婷婷国产精品一区在线观看 | 亚洲 精品在线视频 | a视频在线观看免费 | 91精品1区 | 日本激情动作片免费看 | 日韩av不卡在线观看 | 国产精国产精品 | 97在线免费 | 综合久久久久 | 欧美日韩国产一区二区三区在线观看 | 免费不卡中文字幕视频 | 九九交易行官网 | 日本性xxxxx| 天天干,夜夜爽 | 激情视频在线观看网址 | 99国产高清| 亚洲国产大片 | 色多多污污 | 91视频大全 | 国产精品亚州 | 深爱激情综合 | 欧美在线观看禁18 | 婷婷色av | 久久综合精品一区 | 精品视频成人 | 久久久久久激情 | 免费一级片在线观看 | a视频在线 | 免费观看的黄色片 | 国产无遮挡猛进猛出免费软件 | 亚洲最大的av网站 | 国产 成人 久久 | 热99在线视频 | 国产一区精品在线观看 | 国产一区播放 | 国产又黄又爽又猛视频日本 | 五月婷婷视频 | 日韩精品中文字幕在线 | 久久99精品久久久久久清纯直播 | 国产精品h在线观看 | 久久亚洲私人国产精品 | www.久久爱.cn| 在线观看av的网站 | 18国产精品白浆在线观看免费 | 国产五月色婷婷六月丁香视频 | 中文字幕在线播放日韩 | 日日成人网 | 久久好看免费视频 | 97视频人人免费看 | 天天爽夜夜爽人人爽一区二区 | av免费观看网址 | 成人在线免费小视频 | 蜜臀久久99精品久久久久久网站 | 中文字幕在线播放一区 | 激情五月播播久久久精品 | 亚洲成av人片在线观看无 | 成全在线视频免费观看 | 国产玖玖精品视频 | 精品欧美小视频在线观看 | 欧美日韩99 | 国产香蕉97碰碰碰视频在线观看 | 国产一区二区观看 | 成人四虎 | 91高清免费 | 天堂网av 在线 | 亚洲综合小说 | 91av视频在线免费观看 | 欧美精品第一 | 国产一二三四在线视频 | 中文字幕在线观看完整 | 亚洲成人黄 | 91秒拍国产福利一区 | 国产a国产a国产a | 狠狠狠色丁香婷婷综合久久88 | 亚洲第五色综合网 | 精品国自产在线观看 | 久久这里只有精品23 | 黄色免费av | 国产97在线观看 | 日韩精品一区二区三区高清免费 | 亚洲最大成人网4388xx | 久久久综合色 | 国产小视频福利在线 | 91片黄在线观看 | 去看片 | 97免费在线观看 | 日韩毛片久久久 | 色婷婷视频网 | 18av在线视频| 亚洲精品午夜久久久久久久久久久 | 国产中文伊人 | 在线观看国产v片 | 亚洲精品一区二区三区高潮 | 久久午夜色播影院免费高清 | 国产手机视频 | 黄色免费国产 | 手机在线黄色网址 | 国产精品美女久久久久aⅴ 干干夜夜 | 亚洲天堂网视频 | 成人一级电影在线观看 | 看污网站| 日韩欧美精品在线视频 | 综合精品在线 | 摸bbb搡bbb搡bbbb| 国产视频在线一区二区 | 粉嫩一二三区 | 天天操天天射天天爽 | 国产999精品久久久久久绿帽 | 激情婷婷在线 | 日韩在线观看a | 日韩精品无 | 天天操夜夜爱 | 在线成人一区 | 久久久久国产精品www | 精品自拍sae8—视频 | 久一在线 | 日韩在线在线 | 国产高清久久 | 天堂网一区 | 久久丁香 | 中文字幕一区二区三区四区久久 | 91av大全| 九九综合久久 | 日韩啪视频| 色中射 | 中文字幕在线有码 | 国产精品福利视频 | 国产小视频在线看 | 中文字幕第一页av | 久久精品区 | 欧美天天干 | 亚洲人在线 | 日韩欧美亚洲 | 亚洲黄色激情小说 | 国产一二三四在线视频 | 婷久久 | 欧美精品一区二区在线观看 | 激情视频一区二区三区 | 888av| 在线观看精品一区 | 经典三级一区 | 九九在线国产视频 | 国产中文在线播放 | 狠狠的干狠狠的操 | 96视频在线| 日日麻批40分钟视频免费观看 | 亚洲视频在线观看免费 | 99 久久久久 | 婷婷香蕉 | 免费av网址大全 | 国产理论免费 | 欧美日韩p片| 国产永久免费观看 | 日韩电影在线观看中文字幕 | 久久久久久免费 | 中文字幕色在线视频 | 免费婷婷 | 在线观看日韩一区 | 成人高清在线 | 五月开心网 | 91精品免费看 | 精品国产1区 | 视频在线一区二区三区 | 麻豆久久久久 | 成人小视频在线观看免费 | 欧美天天射 | 国产原创av片 | 91亚·色| 亚洲成人中文在线 | 波多野结衣久久精品 | 欧美一区二区精品在线 | 欧美一区二区三区在线视频观看 | 欧美激情视频在线观看免费 | 久久久成人精品 | 午夜三级福利 | 成人免费电影 | 在线精品国产 | 丁香六月av| 成人理论在线观看 | 久久久一本精品99久久精品 | 91污在线| 在线播放精品一区二区三区 | 国产精品女人久久久久久 | 国产又粗又硬又爽视频 | 极品嫩模被强到高潮呻吟91 | 中文字幕亚洲精品日韩 | 日韩精品视频免费看 | 91在线看片| 日本久久成人中文字幕电影 | 偷拍久久久| 久久久久久久久久久免费 | av福利在线 | 丁香资源影视免费观看 | 免费黄色在线网站 | 成人免费在线视频观看 | 国产高清不卡在线 | 亚洲成人av片在线观看 | 少妇bbr搡bbb搡bbb | 九九精品毛片 | www.婷婷色| 中文字幕观看在线 | 在线观看激情av | 在线视频区 | 久久不卡免费视频 | 99热精品久久 | 在线小视频 | 国产精品久久久久久久婷婷 | 狠狠狠狠狠色综合 | 国产裸体无遮挡 | 在线观看的av网站 | 亚洲播播 | 国产精品小视频网站 | 青春草免费在线视频 | 97**国产露脸精品国产 | 亚洲精品在线视频观看 | 国产精品久久嫩一区二区免费 | 狠狠久久婷婷 | 成人久久电影 | 久久黄色片 | 2020天天干夜夜爽 | 日本aaaa级毛片在线看 | 日韩精品免费一区二区 | 国产一区二区三区免费观看视频 | 久久精品电影 | 欧美精品少妇xxxxx喷水 | 中中文字幕av | 欧美久久久久久久久久久 | 99国产在线视频 | 99久久日韩精品视频免费在线观看 | 国产自产在线视频 | 久久99在线观看 | 免费情趣视频 | 欧美日本国产在线观看 | 五月激情在线 | 久章草在线观看 | aaa毛片视频 | 成人观看视频 | 日韩欧美视频免费看 | 久久日韩精品 | 91精品国产一区二区三区 | 国产一二三区在线观看 | 欧美一级黄色视屏 | 精品免费一区 | 一区二区三区在线视频111 | 一区二区中文字幕在线播放 | 国产不卡在线视频 | 免费看黄色小说的网站 | 狠狠色综合欧美激情 | 亚洲综合一区二区精品导航 | 国产一区二区三区网站 | 美女久久久久 | 国产亚洲精品女人久久久久久 | 激情网站免费观看 | 亚洲男男gaygay无套 | 国产在线播放一区 | 久久少妇免费视频 | 久久精品免费观看 | 美女黄频网站 | 亚洲国产大片 | 国产免费叼嘿网站免费 | 国产亚洲精品精品精品 | 一区二区三区中文字幕在线 | 亚洲九九九在线观看 | 国产原创在线 | 久久免费公开视频 | av在线电影免费观看 | 日韩欧美一区二区三区在线 | 欧美在线视频a | 国产啊v在线观看 | 美女网站色在线观看 | 国产一级大片在线观看 | 日韩精品免费在线观看 | 不卡的av在线 | 欧美精品久久久久久久久老牛影院 | 亚洲伦理精品 | av综合在线观看 | av中文字幕在线观看网站 | 欧美日韩视频网站 | 色婷婷亚洲综合 | 日韩在线国产 | 久久久久久久久久久久久久av | 国产精品一区二区三区在线看 | 丁香花中文字幕 | 久草在线电影网 | 日韩电影中文 | 欧美另类z0zx | 美女福利视频一区二区 | 在线午夜av| 国产亚洲午夜高清国产拍精品 | 久久免费播放视频 | 亚洲一区免费在线 | 91在线播放国产 | 精品一区二区三区四区在线 | 亚洲免费国产视频 | 成 人 免费 黄 色 视频 | 欧美色噜噜噜 | 日韩综合在线观看 | 91亚州 | 精品影院一区二区久久久 | 99精品视频精品精品视频 | 国产亲近乱来精品 | 2018好看的中文在线观看 | 日韩一区二区三区免费视频 | 欧美日韩性生活 | 精品国产一二三四区 | 久久国产美女视频 | 精品久久久久久久久久久久久 | 国产精品美女久久久久久免费 | 国产精品麻豆欧美日韩ww | 久久综合影视 | 国产三级在线播放 | 中文av影院 | 国产精品久久久久久久婷婷 | 丁香综合 | 婷婷色婷婷 | 六月丁香激情网 | 91 中文字幕 | 国产精品免费久久久久 | 国产一区二区三区 在线 | 亚洲激情校园春色 | 国产精品9区 | 正在播放亚洲精品 | 午夜色站 | 中文字幕免费一区 | 久久人人爽爽人人爽人人片av | 久久视频国产 | 国产精品久久久 | 久久手机精品视频 | 在线观看中文字幕dvd播放 | 九九视频一区 | 日日夜夜操操操操 | 69久久99精品久久久久婷婷 | 免费黄色a级毛片 | 久久久免费观看视频 | 久久av免费观看 | 亚洲精品国产拍在线 | 国产精品久久久久久久午夜 | 久久99久久99精品中文字幕 | 亚洲国产欧美在线人成大黄瓜 | 国产91影院 | 日韩激情视频 | 亚洲天天在线日亚洲洲精 | 最近更新好看的中文字幕 | 国产一二三精品 | 国产品久精国精产拍 | 久久久伦理 | 欧美一级在线看 | 日韩乱码中文字幕 | 久久久999精品视频 国产美女免费观看 | 精品国产精品久久 | 公与妇乱理三级xxx 在线观看视频在线观看 | 久热免费 | 久久成年人视频 | 天堂麻豆| 福利在线看片 | 国产精品观看在线亚洲人成网 | 99精品久久只有精品 | 中文字幕日韩电影 | 国产99免费| 亚洲电影成人 | 日韩av伦理片 | 在线草 | 国产在线国产 | 久久不见久久见免费影院 | 91视频亚洲| 夜夜夜夜猛噜噜噜噜噜初音未来 | 婷婷丁香激情五月 | 在线观看精品一区 | 日韩毛片精品 | 国产做aⅴ在线视频播放 | 五月天av在线| 国产成人一区二区三区在线观看 | 精品免费视频 | 久久综合五月婷婷 | 日韩成人欧美 | 香蕉影院在线观看 | 亚洲区色 | 天天操夜夜看 | 成人三级网址 | 中文字幕在线免费播放 | 免费观看91视频 | 欧美特一级片 | av一级一片| 成人av电影在线 | 国内揄拍国产精品 | 欧美韩国日本在线观看 | 久久久久久久国产精品 | 国产亚洲永久域名 | 一区av在线播放 | 337p日本欧洲亚洲大胆裸体艺术 | www..com黄色片 | 国产小视频你懂的在线 | av福利在线导航 | 99久久精品国产一区 | 亚洲高清精品在线 | 婷色| 久久久久亚洲最大xxxx | 中文字幕av免费在线观看 | 91在线一区二区 | 这里只有精品视频在线 | 成人国产在线 | 免费av试看 | 人人插人人做 | 欧美性生活免费看 | 国产麻豆精品免费视频 | 久久av在线播放 | 成年性视频 | 亚洲在线网址 | 久久狠狠一本精品综合网 | 国产视频2 | 国产精品中文在线 | 69精品| 国语麻豆 | 国产精品av免费在线观看 | 久久视频这里有精品 | 亚洲日本激情 | 国产手机在线观看视频 | 99re视频在线观看 | aaa毛片视频 | 午夜色场 | 在线日韩av | 国产高清久久 | 91av在线视频播放 | 91精品啪在线观看国产线免费 | 欧美a级在线 | 日p视频| 手机色站 | 黄色免费观看网址 | 国产精品不卡一区 | 成人永久在线 | 久久久国产一区 | 不卡的av在线播放 | 国产欧美精品一区二区三区四区 | 狠狠躁夜夜躁人人爽视频 | 欧美一区二区三区在线视频观看 | 日本超碰在线 | www.香蕉视频 | 久久av中文字幕片 | 亚洲国产黄色 | 天天做天天爱天天爽综合网 | 婷婷综合久久 | 婷色在线| 国产精品video爽爽爽爽 | 操操综合| 欧产日产国产69 | 三级在线视频播放 | 在线播放视频一区 | 在线观看精品一区 | 91精品国产综合久久婷婷香蕉 | 日韩精品一区电影 | 丁香婷五月 | 婷婷在线综合 | 久草视频在线免费播放 | 国内精品久久久久久 | 综合久久婷婷 | 亚洲综合视频在线观看 | 在线观看免费福利 | 国产在线视频在线观看 | 麻豆一精品传二传媒短视频 | 亚洲片在线资源 | 久久成人国产 | 日韩欧美国产精品 | 91精品国产一区二区在线观看 | 日韩精品欧美专区 | 亚洲欧洲成人 | 国产精品久久久久久久久久久久久久 | 久久精品免费 | 黄色小说免费在线观看 | 久久久久国产一区二区三区 | 五月天激情视频 | 国产精品99在线观看 | 久香蕉| 国产亚洲精品久久久久久久久久 | 97电影院在线观看 | av中文字幕av | 久久免费视频观看 | 美女黄频 | 久久伊人婷婷 | 久久九九国产视频 | 五月激情丁香图片 | 91精品啪| 久久久久国产精品厨房 | 天天天天色射综合 | 久久久久久久久久久国产精品 | 97国产大学生情侣酒店的特点 | 成人亚洲精品久久久久 | 在线观看亚洲视频 | 国产一区二区视频在线 | 久久伊人免费视频 | 免费a级毛片在线看 | 国产69精品久久久久9999apgf | 九草在线观看 | 国产午夜精品久久久久久久久久 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 操操操综合 | 中文字幕日韩伦理 | av中文字幕在线免费观看 | 亚洲精品综合久久 | 欧美性网站 | 国产一区二区高清 | 91精品黄色 | 超碰免费久久 | 免费看的视频 | 日日爱网站| 一二三久久久 | 国产我不卡 | 亚洲va欧美 | 狠狠色丁香婷婷综合久小说久 | 日韩福利在线观看 | 亚洲黄色网络 | 在线观看免费成人av | 狠狠激情中文字幕 | 日韩精品免费在线播放 | 国产一二区免费视频 | 91精品亚洲影视在线观看 | 婷婷射五月 | 免费在线观看的av网站 | 欧美日韩网址 | 日本一区二区高清不卡 | 欧美日韩在线播放一区 | 精品国精品自拍自在线 | 成人免费视频播放 | 亚洲免费高清视频 | 五月婷婷激情五月 | 欧美午夜一区二区福利视频 | 久久成人午夜 | 欧美a√大片 | 久久精品99国产精品亚洲最刺激 | 极品中文字幕 | 国产手机免费视频 | 中文字幕视频播放 | 97夜夜澡人人双人人人喊 | 日韩美在线 | 久久国产网 | 久久精品国产99国产 | 97超碰人| 国产一区二区成人 | 中文字幕观看av | 成人a视频片观看免费 | 日本中文字幕网站 | 深爱婷婷 | 成人在线免费视频 | 欧美三级高清 | 激情黄色一级片 | 久青草视频在线观看 | 丁香六月中文字幕 | 国产糖心vlog在线观看 | 97在线免费 | 久久激情视频 久久 | 国产区av在线 | 天天操天天操天天操天天操天天操天天操 | 成人av中文字幕在线观看 | 香蕉视频亚洲 | 中文字幕在线看视频国产中文版 | 成人在线超碰 | v片在线看| 在线观看中文字幕第一页 | 啪啪午夜免费 | 91精品亚洲影视在线观看 | 韩日色视频 | 少妇性色午夜淫片aaaze | 亚洲在线视频免费 | 综合网中文字幕 | 在线观看精品国产 | 国产日韩精品一区二区三区在线 | 日韩精品免费一区二区在线观看 | 久久久久北条麻妃免费看 | 欧美精品久久久久久久 | 视频一区在线播放 | 国内小视频在线观看 | 欧美日韩伦理在线 | 欧美成人按摩 | 欧美一区免费观看 | 丁香在线观看完整电影视频 | 亚洲免费不卡 | 亚洲午夜久久久久久久久久久 | 一区二区三区精品在线视频 | 日韩色在线观看 | 国产精品成人自产拍在线观看 | 99久久99热这里只有精品 | 国产中年夫妇高潮精品视频 | 久久se视频 | 成人久久毛片 | 六月色婷婷 | 国产 在线 日韩 | 日韩视频中文 | 久久久96 | 久操视频在线观看 | 久久精品高清 | 四虎国产精品永久在线国在线 | 国产专区在线 | 中文字幕一区二区三区乱码在线 | 日韩成人精品一区二区 | 亚洲美女在线国产 | 99热这里有精品 | 欧美激情视频一二区 | 狠狠狠色丁香综合久久天下网 | 91精品在线免费观看视频 | 中文字幕久久精品亚洲乱码 | 91精品人成在线观看 | 欧美亚洲国产一卡 | 国产一区二区三精品久久久无广告 | 天堂av网址 | 午夜视频在线观看一区二区三区 | 香蕉日日 | 久久在线精品视频 | 黄色三级网站 | 国产福利一区二区三区在线观看 | 免费网站在线观看人 | 免费看特级毛片 | 国产日韩欧美在线一区 | 视频一区二区三区视频 | 欧美日韩视频在线播放 | 91亚洲精品国偷拍 | 国产成人av网站 | 日韩午夜电影 | 亚洲黄色av网址 | 欧美成亚洲 | 免费日韩 精品中文字幕视频在线 | 欧美激情视频在线观看免费 | 色综合久久精品 | 日韩在线视频播放 | 97精产国品一二三产区在线 | 亚洲精品在线观看免费 | 97色在线 | 天天综合人人 | 在线成人国产 | 中文字幕一二三区 | 一区二区不卡在线观看 | 在线中文字幕观看 | 岛国av在线不卡 | 久久99亚洲精品久久久久 | 国产精品嫩草影院123 | 日本中文字幕久久 | 亚洲一区 影院 | 天堂av在线7 | 美女视频久久 | 亚洲妇女av | 鲁一鲁影院 | 69精品视频 | 91视频 - x99av| 久久这里有 | 久久精品久久综合 | 六月丁香激情综合色啪小说 | 国产拍在线| 人人看人人做人人澡 | 国产极品尤物在线 | 久久久久国产精品一区二区 | 亚洲在线免费视频 | av一级一片 | 在线 视频 一区二区 | 久久久久夜色 | 99视频在线观看免费 | 六月天综合网 | 在线观看 国产 | 美女福利视频一区二区 | 午夜少妇一区二区三区 | 91精品国产高清自在线观看 | 亚洲国产大片 | 亚州日韩中文字幕 | 中文字幕你懂的 | 五月婷激情 | 色综合天天综合网国产成人网 | 成人黄色电影在线 | av片在线观看 | 久久一区二区三区超碰国产精品 | 久久久免费 | 欧美 激情在线 | 日韩精品久久中文字幕 | 五月婷婷丁香六月 | 欧美日韩免费看 | 欧美性大战久久久久 | 久草在线视频网站 | 欧美色操| 91一区二区三区在线观看 | 国产日韩精品一区二区 | 久久久久久久久久久久久久免费看 | 狠狠干电影| 在线综合 亚洲 欧美在线视频 | 久久婷婷国产色一区二区三区 | 成人午夜毛片 | 色香蕉视频 | 狠狠躁18三区二区一区ai明星 | 在线一二三四区 | 人人爱天天操 | 九九综合久久 | 免费看一级特黄a大片 | 精品久久久久国产 | 美女视频永久黄网站免费观看国产 | 欧美性做爰猛烈叫床潮 | 免费日韩视 | 精品久久精品 | www免费黄色 | 日韩精品一区二区三区外面 | 亚洲精品美女在线 | 成人免费观看网址 | 日日摸日日添日日躁av | 最近中文字幕免费av | 久久综合色天天久久综合图片 | 日韩一区二区三区高清在线观看 | 色综合天天做天天爱 | 午夜精品一区二区三区在线播放 | 中文字幕色在线视频 | 国偷自产中文字幕亚洲手机在线 | 中文视频在线 | 开心色婷婷 | 69热国产视频 | 亚洲国内精品 | 欧美激情视频在线观看免费 | 91久久国产综合精品女同国语 | 在线观看亚洲精品 | 午夜美女福利 | 亚洲视频电影在线 | av在线播放一区二区三区 | 国内揄拍国内精品 | 区一区二区三区中文字幕 | 国产破处在线视频 | 九九九视频在线 | 国产精品久久久久久久久久新婚 | 亚洲精品免费观看 | 天天爽天天碰狠狠添 | 久久免费国产电影 | 97免费在线观看 | 国产一二三区av | 99色免费 | 国产成人精品一区二区三区福利 | 99精品在线免费在线观看 | 色欧美成人精品a∨在线观看 | 国产精品国产毛片 | 免费av视屏| 午夜三级理论 | 天天操综 | 97精品久久 | 中文字幕在线观看三区 | 欧美激情另类文学 | 国产69精品久久99的直播节目 | 欧美日韩免费在线观看视频 | 国产高清视频免费在线观看 | 国产最新在线视频 | 日韩成年视频 | 欧美做受高潮 | 97超碰伊人| 最近中文字幕高清字幕免费mv | av日韩不卡 | 国产精品免费视频网站 | 伊人中文在线 | 国产日韩视频在线观看 | 日韩精品一区二区在线观看 | 日韩xxxx视频 | 精品国产a | 亚洲成人资源在线观看 | 久久久久久久久久久影院 | 久久久久久久国产精品影院 | 午夜在线免费观看视频 | 国产成人精品一二三区 | 毛片一二区| a视频免费在线观看 | 中文字幕在线观看免费观看 | 婷婷六月综合网 | 97色在线观看免费视频 | 日韩精品一区二区在线 | 日本丰满少妇免费一区 | 91女子私密保健养生少妇 | 国内精品国产三级国产aⅴ久 | 日韩高清无线码2023 | 国产又粗又猛又色又黄视频 | 超碰大片 | 91中文字幕网 | 国产一区二区高清视频 | 国产网站色 | 免费一级片在线观看 | 欧美日韩伦理在线 | 亚洲精品乱码久久久一二三 | 日韩欧美精品在线视频 | 欧美调教网站 | 91丨九色丨国产丨porny精品 | 日韩中文幕 | 黄色在线免费观看网站 | 丁香资源影视免费观看 | 中文字幕视频观看 | 亚洲男女精品 | 九色porny真实丨国产18 | 国产美女精品人人做人人爽 | 免费三级a | 六月丁香激情综合色啪小说 | 欧美成a人片在线观看久 | 久久撸在线视频 | 欧美在线1区 | 亚洲午夜av电影 | 91在线资源 | 亚洲成人av在线 | 国产 字幕 制服 中文 在线 | 成人久久久久久久久久 | 久久午夜精品影院一区 | 香蕉久久久久久久 | 欧美一区二区日韩一区二区 | 亚洲综合在线观看视频 | 国产精品综合久久久久 | 久久久国产在线视频 | 不卡av在线免费观看 | 天天爱天天草 | 国产在线视频资源 | 久久久久久久久久久久99 | 欧美日韩国产一区二区在线观看 | 免费观看91 | 国产精品美女久久久久久久 | 久久99精品久久久久久秒播蜜臀 | 亚洲乱亚洲乱妇 | 97在线精品 | 不卡的av中文字幕 | 婷婷在线免费视频 | 欧美日本不卡视频 | 伊色综合久久之综合久久 | 国产精品久久精品 | 国产在线视频不卡 | 国产久草在线观看 | 国产原创在线观看 |