Skip to content

Commit 82d7b44

Browse files
committed
QpChannel remove send queue, send package immediately now.
1 parent 4491e2e commit 82d7b44

File tree

9 files changed

+39
-101
lines changed

9 files changed

+39
-101
lines changed

QpTestClient/Controls/ConnectionInfoControl.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ private void timerNetstat_Tick(object sender, EventArgs e)
4141
showNetStat(@$"发送的字节数:{channel.BytesSent.ToString("N0")}
4242
接收的字节数:{channel.BytesReceived.ToString("N0")}
4343
每秒发送字节数:{channel.BytesSentPerSec.ToString("N0")}
44-
每秒接收字节数:{channel.BytesSentPerSec.ToString("N0")}
44+
每秒接收字节数:{channel.BytesReceivedPerSec.ToString("N0")}
4545
包发送队列数量:{channel.PackageSendQueueCount}");
4646
}
4747

QpTestClient/Forms/CommandTestForm.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,20 @@ public CommandTestForm(ConnectionContext connectionContext, QpCommandInfo qpComm
3333

3434
private async void btnSend_Click(object sender, EventArgs e)
3535
{
36+
txtTestRequest.Focus();
37+
txtTestResponse.Clear();
38+
3639
var commandRequestTypeName = txtCommandRequestTypeName.Text.Trim();
3740
if (string.IsNullOrEmpty(commandRequestTypeName))
3841
{
39-
txtCommandRequestTypeName.Focus();
42+
txtTestResponse.AppendText($"{DateTime.Now.ToLongTimeString()}: 请输入命令请求类型!");
43+
txtCommandRequestTypeName.Focus();
4044
return;
4145
}
4246
var requestContent = txtTestRequest.Text.Trim();
4347
if (string.IsNullOrEmpty(requestContent))
4448
{
49+
txtTestResponse.AppendText($"{DateTime.Now.ToLongTimeString()}: 请输入请求内容!");
4550
txtTestRequest.Focus();
4651
return;
4752
}
@@ -54,8 +59,6 @@ private async void btnSend_Click(object sender, EventArgs e)
5459
}
5560

5661
btnSend.Enabled = false;
57-
txtTestRequest.Focus();
58-
txtTestResponse.Clear();
5962
txtTestResponse.AppendText($"{DateTime.Now.ToLongTimeString()}: 开始执行...{Environment.NewLine}");
6063
try
6164
{

QpTestClient/QpTestClient.csproj

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
<Version>2.2.3</Version>
1212
<ApplicationIcon>logo.ico</ApplicationIcon>
1313
<Description>用于测试连接到[QuickProtocol]服务端的客户端。
14-
项目地址:https://github.com/QuickProtocol
15-
</Description>
14+
项目地址:https://github.com/QuickProtocol</Description>
1615
<Copyright>Apache License</Copyright>
1716
<PackageProjectUrl>https://github.com/QuickProtocol</PackageProjectUrl>
1817
<RepositoryUrl>https://github.com/QuickProtocol/QuickProtocol_CSharp</RepositoryUrl>

Quick.Protocol/QpChannel.cs

Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ public abstract class QpChannel
4949
private ICryptoTransform enc;
5050
private ICryptoTransform dec;
5151
private Encoding encoding = Encoding.UTF8;
52-
52+
53+
private Task sendPackageTask = Task.CompletedTask;
54+
//发送包锁对象
55+
private object SEND_PACKAGE_LOCK_OBJ = new object();
5356
//断开连接锁对象
5457
private object DISCONNECT_LOCK_OBJ = new object();
5558

@@ -103,13 +106,9 @@ protected set
103106
/// </summary>
104107
public long BytesSentPerSec { get; private set; }
105108
/// <summary>
106-
/// 包发送队列
107-
/// </summary>
108-
private ConcurrentQueue<QpPackageSendQueueItem> packageSendQueue = new ConcurrentQueue<QpPackageSendQueueItem>();
109-
/// <summary>
110109
/// 包发送队列数量
111110
/// </summary>
112-
public int PackageSendQueueCount => packageSendQueue.Count;
111+
public int PackageSendQueueCount = 0;
113112

114113
/// <summary>
115114
/// 最后一次连接的时间
@@ -129,16 +128,18 @@ protected set
129128
/// </summary>
130129
public virtual void Disconnect()
131130
{
131+
var shouldRaiseDisconnectedEvent = false;
132132
lock (DISCONNECT_LOCK_OBJ)
133133
{
134-
packageSendQueue.Clear();
135134
if (IsConnected)
136135
{
137-
IsConnected = false;
138-
Disconnected?.Invoke(this, QpEventArgs.Empty);
136+
IsConnected = false;
137+
shouldRaiseDisconnectedEvent = true;
139138
}
140139
}
141140
InitQpPackageHandler_Stream(null);
141+
if (shouldRaiseDisconnectedEvent)
142+
Disconnected?.Invoke(this, EventArgs.Empty);
142143
}
143144

144145
/// <summary>
@@ -366,9 +367,19 @@ private void writePackageTotalLengthToBuffer(byte[] buffer, int offset, int pack
366367

367368
private Task writePackageAsync(Func<byte[], ArraySegment<byte>> getPackagePayloadFunc, Action afterSendHandler)
368369
{
369-
var item = new QpPackageSendQueueItem(getPackagePayloadFunc, afterSendHandler);
370-
packageSendQueue.Enqueue(item);
371-
return item.SendTask;
370+
Interlocked.Increment(ref PackageSendQueueCount);
371+
lock (SEND_PACKAGE_LOCK_OBJ)
372+
{
373+
sendPackageTask = sendPackageTask.ContinueWith(t =>
374+
{
375+
var stream = QpPackageHandler_Stream;
376+
if (stream == null)
377+
throw new IOException("Connection is disconnected.");
378+
writePackage(getPackagePayloadFunc, afterSendHandler).Wait();
379+
});
380+
sendPackageTask.ContinueWith(t => Interlocked.Decrement(ref PackageSendQueueCount));
381+
return sendPackageTask;
382+
}
372383
}
373384

374385
private async Task writePackage(Func<byte[], ArraySegment<byte>> getPackagePayloadFunc, Action afterSendHandler)
@@ -782,37 +793,6 @@ protected async Task<ArraySegment<byte>> ReadPackageAsync(CancellationToken toke
782793
finalPackageBuffer.Count);
783794
}
784795

785-
protected void BeginSendPackage(CancellationToken cancellationToken)
786-
{
787-
Task.Delay(options.CheckSendQueueInterval, cancellationToken).ContinueWith(async t =>
788-
{
789-
if (t.IsCanceled)
790-
return;
791-
//开始发送数据包
792-
QpPackageSendQueueItem item = null;
793-
while (packageSendQueue.Count > 0)
794-
{
795-
if (cancellationToken.IsCancellationRequested)
796-
return;
797-
var stream = QpPackageHandler_Stream;
798-
if (stream == null)
799-
return;
800-
if (!packageSendQueue.TryDequeue(out item))
801-
continue;
802-
try
803-
{
804-
await writePackage(item.GetPackagePayloadFunc, item.AfterSendHandler);
805-
item.SetResult(null);
806-
}
807-
catch (Exception ex)
808-
{
809-
item.SetResult(ex);
810-
}
811-
}
812-
BeginSendPackage(cancellationToken);
813-
});
814-
}
815-
816796
protected void BeginHeartBeat(CancellationToken cancellationToken)
817797
{
818798
if (options.HeartBeatInterval > 0)

Quick.Protocol/QpChannelOptions.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,6 @@ public abstract class QpChannelOptions
2929
[DisplayName("心跳间隔")]
3030
public int HeartBeatInterval => InternalTransportTimeout / 3;
3131

32-
/// <summary>
33-
/// 检查发送队列间隔
34-
/// </summary>
35-
[Category("高级")]
36-
[DisplayName("检查发送队列间隔")]
37-
public int CheckSendQueueInterval => 100;
38-
3932
/// <summary>
4033
/// 密码
4134
/// </summary>

Quick.Protocol/QpClient.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ public async Task ConnectAsync()
3939

4040
//开始读取其他数据包
4141
BeginReadPackage(token);
42-
//开始发送数据包
43-
BeginSendPackage(token);
4442
//开始统计网络数据
4543
BeginNetstat(token);
4644

Quick.Protocol/QpPackageSendQueueItem.cs

Lines changed: 0 additions & 37 deletions
This file was deleted.

Quick.Protocol/QpServerChannel.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,6 @@ public QpServerChannel(Stream stream, string channelName, CancellationToken canc
5959
var token = cts.Token;
6060
//开始读取其他数据包
6161
BeginReadPackage(token);
62-
//开始发送数据包
63-
BeginSendPackage(token);
6462
//开始统计网络数据
6563
BeginNetstat(token);
6664

Test/Tcp/TcpServer/Program.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,15 @@ private static void Server_ChannelConnected(object sender, QpServerChannel e)
7575
while (true)
7676
{
7777
Thread.Sleep(1000);
78-
e.SendNoticePackage(new Quick.Protocol.Notices.PrivateNotice()
78+
try
7979
{
80-
Action = "NowTime",
81-
Content = DateTime.Now.ToString()
82-
});
80+
e.SendNoticePackage(new Quick.Protocol.Notices.PrivateNotice()
81+
{
82+
Action = "NowTime",
83+
Content = DateTime.Now.ToString()
84+
}).Wait();
85+
}
86+
catch { break; }
8387
}
8488
});
8589
}

0 commit comments

Comments
 (0)