Tag: tcpclient

如何“刷新”TCP客户端缓冲区?

我从几个示例中提取了一个连接到服务器的全双工C#TCP客户端。 基本概念是客户端和服务器都发送/接收消息(命令和事件)。 因此,我开发了一个FullDuplexSocket类,它公开了一个Send方法来向服务器发送消息,以及一个事件处理程序来接收来自服务器的消息。 一切正常,除了我似乎无法刷新从服务器收到的消息的缓冲区。 每次服务器发送新消息时,套接字中的缓冲区都包含所有旧消息(已读取) 和新消息。 我可以通过已知的分隔符(/ r / n)拆分消息并跟踪它们,但这可能是长时间运行通信时内存问题的根源。 [编辑:将代码更新为不再存在缓冲区问题并且工作正常的解决方案]。 有没有人有什么建议。 总重写??? 代码如下,希望它能帮助他人。 这是FullDuplexSocket类: using System; using System.Text; using System.Net.Sockets; namespace Utilities { public class StateObject{ public Socket workSocket = null; public const int BUFFER_SIZE = 1024; public byte[] buffer = new byte[BUFFER_SIZE]; } public class FullDuplexSocket : IDisposable { public event NewMessageHandler OnMessageReceived; […]

同时从同一个SslStream中读取?

我目前正在从SslStream中读取XML数据。 该流来自TcpClient对象。 using (XmlReader r = XmlReader.Create(sslStream, new XmlReaderSettings() { Async = true })) { while (await r.ReadAsync()) { ResetStream = false; switch (r.NodeType) { case XmlNodeType.XmlDeclaration: … break; case XmlNodeType.Element: … 另外,我想直接从TcpClient读取每个位和字节,无论它是否是XML数据。 如何两次读取相同的流? 是否可以使用XmlReader读取它并以某种方式转储流内容? 我想看看来自流的内容以及如何通过XmlReader解析它以进行调试。 更新: 我想保持一个流运行,而不是有两个独立的流。 由于我已经拥有了数据,因此在我的应用程序中将它再次存储在内存中是没有意义的。

C#从TcpClient读取流

我正在使用TcpClient和服务器制作服务器 – 客户端程序。 要从服务器发送我使用: static void send(string data) { sw.WriteLine(data + Environment.NewLine); } 当客户端连接时,我发送一些文本: client = listener.AcceptTcpClient(); sr = new StreamReader(client.GetStream()); sw = new StreamWriter(client.GetStream()); string line; try { send(“Hello world”); } //More code 并从客户端阅读: string data; data = sr.ReadLine(); if(data != string.Empty || data != null) { MessageBox.Show(data); } 我尝试放入内部(真实)并且它冻结了,我尝试放入计时器滴答圈并冻结… 我该如何解决? PS:客户端和服务器是2个不同的项目。

使用TCP的C#Mutlti-threading文件传输

我正在设计用于从客户端接收文件的TCP服务器。 它为一个客户工作。 但Server需要响应多个客户端。 我不知道如何同时从客户端接收多个文件。 请帮我。 服务器代码: public partial class Form1 : Form { Thread t1; int flag = 0; string receivedPath = “yok”; public delegate void MyDelegate(); private string fileName; public Form1() { t1 = new Thread(new ThreadStart(StartListening)); t1.Start(); InitializeComponent(); } public class StateObject { // Client socket. public Socket workSocket = null; public const […]

在TcpClient BeginConnect之后,应用程序在退出时挂起20秒

我有TcpClient.BeginConnect()和TcpClient.EndConnect()方法的奇怪行为的问题。 我使用BeginConnect()为Connect()方法添加超时(请参阅下面的扩展方法代码)。 如果我连接,我调用EndConnect()并且一切正常,但是如果我超时我不能调用EndConnect(),因为它会阻塞大约20秒,所以我只是调用这个非阻塞代码: result.AsyncWaitHandle.Close(); result.AsyncWaitHandle.Dispose(); client.Close(); 问题是当我在超时后关闭表单(在运行代码之后)我的应用程序将“挂起”大约20秒。 有什么方法可以阻止这种悬挂吗? 这只是在应用程序退出时很不愉快,所以,如果没有其他可能的话,它可能是一些肮脏的杀戮;] 一些说明: 只有在我无法连接到服务器时才会挂起。 退出时,表单将关闭,只有一些进程仍在后台运行。 如果我按下VS2013中的暂停按钮,应用程序挂起,我没有接受任何代码,所以我想这是一些自动创建的线程,其中挂起代码(EndConnect()?)被调用。 当我在超时后等待大约20秒(应用程序响应)然后我关闭表单时没有挂起 – 所以这个阻塞代码(EndConnect()?)会自动从其他一些线程调用。 如果我调用方法TcpClient.Connect()(没有超时)我被阻止大约20秒,但退出时没有挂起。 如果我在超时时运行此非阻塞代码: client.Client.Close(); client.Client.Dispose(); client.Close(); 它仍会在退出时挂起。 即使我将BeginConnect(ip,port,null,null)更改为BeginConnect(ip,port,new AsyncCallback(ConnectCallback),null)并在ConnectCallback中调用客户端上的EndConnect()和Close(),应用程序仍会挂起(ConnectCallback)在退出之前被调用并且其代码没有挂起)。 我写了大约20秒,但它更像是(20 – 超时)秒。 在我的代码II中有超时= 1秒,所以在这种情况下应用程序挂起大约20秒。 以下是我的连接代码: public bool Connect(string localMachineName) { // Get ips for local machine IPAddress[] ips; try { ips = Dns.GetHostEntry(localMachineName).AddressList.Where( o => o.AddressFamily == AddressFamily.InterNetwork).ToArray(); } catch […]

即使数据可用,从端口读取信息也会等待

我在向套接字发送信息并收到响应时遇到问题。 我有一个正确执行的演示程序,所以我知道它不是另一端客户端的问题。 发送requestData并且客户端正常运行并响应,但我的代码永远不会退出读取响应中的循环。 在我倾听之前,客户能否做出回应? 如何确保我不会错过传入的消息? networkStream = tcpClient.GetStream(); StreamWriter clientStreamWriter = new StreamWriter(); clientStreamWriter.WriteLine(requestData); clientStreamWriter.Flush(); // Continuously read data on the socket and if it is more than just a ping, read the response. StringBuilder sbReadBuffer = new StringBuilder(); while (true) { String response = readresponse(timeoutOn30Seconds); if (response.Length > 1 && (!response.Contains(“\r\n”) || response.Contains(“,”))) { […]

C#TcpClient通过持久连接读取多条消息

我正在尝试创建一个具有持久连接的TCP服务器和客户端,以便服务器和客户端可以在任何时间点相互通知某些“事件”(因此推送而不是轮询)。 我几乎一切正常,客户端可以连接,连接保持打开,客户端和服务器都可以从tcp流写入和读取。 问题在于读取,我通过首先发送包含消息长度的8个字节来定义消息边界。 一旦我收到它,就会读取长度为x的消息并引发一个事件。 这一切都工作正常,但一旦消息被读取,我希望“await stream.ReadAsync”等待新的传入数据,但它保持循环(并返回0数据)而不是等待导致100%的CPU使用率。 有没有办法对流说’重置’,以便它像原来一样开始再次等待。 这是我的tcpclient的代码(用于发送和接收),你可以跳到RunListener方法,我不认为其余的事情。 public class SSLTcpClient : IDisposable { /** * Public fields */ public SslStream SslStream { get; private set; } /** * Events */ public ConnectionHandler connected; public ConnectionHandler disconnected; public DataTransfer dataReceived; /** * Constructors */ public SSLTcpClient() { } public SSLTcpClient(TcpClient pClient, X509Certificate2 pCert) { SslStream […]

当我已经将它作为字符串时,我如何发送电子邮件?

实际上,我正在尝试发送一些模板电子邮件,以便我可以测试一些处理邮箱阅读的组件。 我可以加载Outlook并发送几封电子邮件,但我希望找到一个可以一次读取数千封电子邮件的解决方案,所以我需要批量发送这些模板来测试阅读代码。 当我说批量发送…我有大约10到15个模板(不同),我想发送大约1,000个副本到给定的邮箱。 现在这里是关键点…… 我可以启动SMTP客户端的实例并声明一个新的MailMessage对象然后使用SMTP客户端发送…问题是我的电子邮件模板包含自定义标头信息所以它不仅仅是msg.Body = someText然后设置“收件人”和“从”和“主题”字段。 我不想花时间手动解析这些电子邮件,因为标题很长,并且包含很多自定义值,我将在稍后处理。 因此,如果我有一个txt或eml文件,如何将原始文本发送到我的邮箱,以便我可以执行我提到的测试?

如何通过TcpClient获取页面?

我正在尝试通过TCP流向页面发送GET请求。 这是我的代码的样子: public class SocketLevelWebClient { public string SendWebRequest(string url, string request) { using(TcpClient tc = new TcpClient()) { tc.Connect(url, 80); using (NetworkStream ns = tc.GetStream()) { using (System.IO.StreamWriter sw = new System.IO.StreamWriter(ns)) { using (System.IO.StreamReader sr = new System.IO.StreamReader(ns)) { sw.Write(request); sw.Flush(); return sr.ReadToEnd(); } } } } } 请求本身: SocketLevelWebClient wc = new […]

c#NetworkStream write()和read()

我想知道如何阻止Networkstream.Read()阻止线程。 我有单独的线程,其中NetworkStream.Read()正在等待来自服务器的数据。 假设用户按下一些向服务器发送一些数据的按钮。 但是,当其他线程中有NetworkStream.Read()等待数据时,我无法调用NetworkStream.Write() 。 我可以每次锁定NetworkStream但NetworkStream.Read()将阻塞线程,所以在读取至少1个字节之前我不能发送数据。