- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想通过 tcp 将数据发送到特定的 ip\port我写了一个示例,应该向那里发送一些字符串:
internal class TcpSender : BaseDataSender
{
public TcpSender(Settings settings) : base(settings)
{
}
public async override Task SendDataAsync(string data)
{
Guard.ArgumentNotNullOrEmptyString(data, nameof(data));
byte[] sendData = Encoding.UTF8.GetBytes(data);
using (var client = new TcpClient(Settings.IpAddress, Settings.Port))
using (var stream = client.GetStream())
{
await stream.WriteAsync(sendData, 0, sendData.Length);
}
}
}
这里的问题是我的流在 tcp 客户端发送所有数据之前就被处理掉了。我应该如何重写我的代码以等待所有数据被写入,然后才处理所有资源?谢谢
UPD:从控制台调用:
static void Main(string[] args)
{
// here settings and date are gotten from args
try
{
GenerateAndSendData(settings, date)
.GetAwaiter()
.GetResult();
}
catch (Exception e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(e);
}
}
public static async Task GenerateAndSendData(Settings settings, DateTime date)
{
var sender = new TcpSender(settings);
await sender.SendDataAsync("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.");
}
Upd2:Echo 服务器代码(从一些 stackoverflow 问题中窃取):
class TcpEchoServer
{
static TcpListener listen;
static Thread serverthread;
public static void Start()
{
listen = new TcpListener(System.Net.IPAddress.Parse("127.0.0.1"), 514);
serverthread = new Thread(new ThreadStart(DoListen));
serverthread.Start();
}
private static void DoListen()
{
// Listen
listen.Start();
Console.WriteLine("Server: Started server");
while (true)
{
Console.WriteLine("Server: Waiting...");
TcpClient client = listen.AcceptTcpClient();
Console.WriteLine("Server: Waited");
// New thread with client
Thread clientThread = new Thread(new ParameterizedThreadStart(DoClient));
clientThread.Start(client);
}
}
private static void DoClient(object client)
{
// Read data
TcpClient tClient = (TcpClient)client;
Console.WriteLine("Client (Thread: {0}): Connected!", Thread.CurrentThread.ManagedThreadId);
do
{
if (!tClient.Connected)
{
tClient.Close();
Thread.CurrentThread.Abort(); // Kill thread.
}
if (tClient.Available > 0)
{
byte pByte = (byte)tClient.GetStream().ReadByte();
Console.WriteLine("Client (Thread: {0}): Data {1}", Thread.CurrentThread.ManagedThreadId, pByte);
tClient.GetStream().WriteByte(pByte);
}
// Pause
Thread.Sleep(100);
} while (true);
}
}
最佳答案
最简单的部分是回显服务器运行缓慢,因为它在每次读取后暂停 100 毫秒。我想这是为了让您有机会看到发生了什么。
为什么你看不到所有数据,我不太确定,但我认为可能发生的情况是:
using
block 时,流将被释放(感谢 Craig.Feied 在他的 answer 中指出执行在底层套接字完成物理传输之前继续进行数据)NetworkStream
会导致它向底层 Socket
发出关闭命令>Socket
有机会在它最终关闭之前完成所有缓冲数据的发送。引用:Graceful Shutdown, Linger Options, and Socket Closure NetworkStream
本身没有缓冲数据,因为它将所有写入直接传递到套接字。因此,即使在传输完成之前处理 NetworkStream,也不会丢失任何数据因此,您的回显服务器从已经在进行的传输中接收数据(好的),但随后在连接上发出新的写入请求(不正常。)我怀疑此写入导致回显服务器提前退出而没有读取所有数据。要么:
tClient.GetStream().WriteByte(pByte);
检查它是否确实是上述任何一种应该很容易。
关于c# - 让 HTTPClient 等待数据写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52815825/
我有这个代码 var myChart = new FusionCharts("../themes/clean/charts/hbullet.swf", "myChartId", "400", "75
既然写入是立即进行的(复制到内核缓冲区并返回),那么使用 io_submit 进行写入有什么好处? 事实上,它 (aio/io_submit) 看起来更糟,因为您必须在堆上分配写入缓冲区并且不能使用基
我正在使用 mootool 的 Request.JSON 从 Twitter 检索推文。收到它后,我将写入目标 div 的 .innerHTML 属性。当我在本地将其作为文件进行测试时,即 file:
最终,我想将 Vertica DB 中的数据抓取到 Spark 中,训练机器学习模型,进行预测,并将这些预测存储到另一个 Vertica DB 中。 当前的问题是确定流程最后部分的瓶颈:将 Spark
我使用 WEKA 库编写了一个 Java 程序, 训练分类算法 使用经过训练的算法对未标记的数据集运行预测 将结果写入 .csv 文件 问题在于它当前写出离散分类结果(即算法猜测一行属于哪个类别)。我
背景 - 我正在考虑使用 clickonce 通过 clickonce(通过网站)部署 WinForms 应用程序。相对简单的应用程序的要素是: - 它是一个可执行文件和一个数据库文件(sqlite)
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
我正在读取 JSON 文件,取出值并进行一些更改。 基本上我向数组添加了一些值。之后我想将其写回到文件中。当我将 JSONArray 写回文件时,会被写入字符串而不是 JSONArray 对象。怎样才
我为两个应用程序使用嵌入式数据库,其中一个是服务器,另一个是客户端。客户端应用程序。可以向服务器端发送获取数据请求以检索数据并显示在表格(或其他)中。问题是这样的:如何将获取的数据保存(写入)到页面文
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
从问题得出问题:找到所有 result = new ArrayList(); for (int i = 2; i >(i%8) & 0x1) == 0) { result.add(i
由于某种原因,它没有写入 CSV。谁能明白为什么它不写吗? def main(): list_of_emails = read_email_csv() #read input file, cr
关闭。 这个问题是 not reproducible or was caused by typos 。它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能在这里出现,
我目前正在开发一个保存和加载程序,但我无法获得正确的结果。 编写程序: #include #include #define FILENAME "Save" #define COUNT 6 type
import java.io.*; public class Main2 { public static void main(String[] args) throws Exception {
我需要使用预定义位置字符串“Office”从所有日历中检索所有 iOS 事件,然后将结果写入 NSLog 和 UITextView。 到目前为止,这是我的代码: #import "ViewCo
我正在尝试将 BOOL 值写入 PFInstallation 中的列,但会不停地崩溃: - (IBAction)pushSwitch:(id)sender { NSUserDefaults *push
我以前在学校学过一些简单的数据库编程,但现在我正在尝试学习最佳实践,因为我正在编写更复杂的应用程序。写入 MySQL 数据库并不难,但我想知道让分布式应用程序写入 Amazon EC2 上的远程数据库
是否可以写回到ResourceBundle?目前我正在使用 ResourceBundle 来存储信息,在运行时使用以下内容读取信息 while(ResourceBundle.getBundle("bu
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!