socket 异步接收连接和接收数据

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using Newtonsoft.Json;
namespace WindowsSocket
{
	public class Msg
	{
		public int Flag { get; set; }
		public string Message { get; set; }
	}
	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}
		//如果一次接收不了,会多次进入OnMessage方法解析
		byte[] buffer = new byte[1024];
		public void OnMessage(IAsyncResult result)
		{
			//result.AsyncState 为调用BeginReceive 传递过来的参数
			Socket ts = (Socket)result.AsyncState;
			//获取接收到信息的长度
			//int count = ts.EndReceive(result);
			//result.AsyncWaitHandle.Close();
			this.textBox1.Invoke(new EventHandler(delegate
			{
				var msg = Encoding.ASCII.GetString(buffer);
				MessageBox.Show(msg);
				//var objects = JsonConvert.DeserializeObject<Msg>(msg);
				//MessageBox.Show(objects.Flag.ToString());
				//MessageBox.Show(objects.Message.ToString());
				//textBox1.Text += ts.RemoteEndPoint.ToString() + "客户端信息" + Encoding.ASCII.GetString(buffer) + "\r\n";
			}));
			ts.Send(Encoding.ASCII.GetBytes("How are you? I got a message"));
			//清空数据,重新开始异步接收
			//buffer = new byte[buffer.Length];

			ts.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnMessage), ts);
		}

		/// 异步连接客户端
		/// </summary>
		/// <param name="tcpServer"></param>
		private void AsynAccept(Socket tcpServer)
		{
			tcpServer.BeginAccept(asyncResult =>
			{
				//取得终端Socket
				Socket socketAccept = tcpServer.EndAccept(asyncResult);
				//获取客户端地址信息
				if (socketAccept.RemoteEndPoint is IPEndPoint)
				{

					//var ss = tcpClient.Receive(buffer);
					//异步获取数据
					socketAccept.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnMessage), socketAccept);

					//byte[] msg = new byte[tcpServer.ReceiveBufferSize];
					//tcpServer.Receive(msg);
					//textBox1.Invoke(new EventHandler(delegate
					//{
					//	textBox1.Text += "客户端信息" + tcpClient.RemoteEndPoint.ToString() + "\r\n";
					//}));

				}
				//持续监听终端连接
				AsynAccept(tcpServer);

			}, null);
		}
		//开启socket服务端
		private void button1_Click(object sender, EventArgs e)
		{
			Task task = new Task(() =>
			{
				Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
				socket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8877));
				socket.Listen(1111);
				AsynAccept(socket);
			});
			task.Start();

		}
	}
}

  

原文地址:https://www.cnblogs.com/wlzhang/p/10917237.html

时间: 2024-08-03 05:49:29

socket 异步接收连接和接收数据的相关文章

关于完成端口IOCP异步接收连接函数AcceptEx注意事项

AcceptEx方法有一个参数dwReceiveDataLength,指明了在收到连接后是否需要收到第一包数据才返回.需要注意的是,如果 dwReceiveDataLength=0,则当接收到一个连接后立即返回,如果dwReceiveDataLength不等于0,则在接收到连接后,必须 等到客户端发来第一包数据才返回.可根据实际需要设定此参数.这就是有人说明明我已经建立连接,为何服务端收不到ACCEPT事件的原因. 特别要注意,当dwReceiveDataLength设置为0后,在使用m_lpf

vlc-android对于通过Live555接收到音视频数据包后的处理分析

通过ndk-gdb跟踪调试vlc-android来分析从连接到RTSP服务器并接收到音视频数据包后的处理过程. 首先,从前面的文章有分析过vlc-android的处理过程通过线程函数Run()(Src/input/input.c)来处理的,代码如下: [cpp] view plaincopy static void *Run( void *obj ) { input_thread_t *p_input = (input_thread_t *)obj; const int canc = vlc_s

c#网络通信框架networkcomms内核解析之六 处理接收到的二进制数据

在networkcomms通信系统中,服务器端收到某连接上的数据后,数据会暂时存放在"数据包创建器"(PacketBuilder)中,PacketBuilder类似一个流动的容器,收到的数据被服务器处理完成后,相应在二进制数据,会从存储他的PacketBuilder中删除. 我们知道在networkcomms的消息体系中,传送的数据的第一个字节用来存储数据包包头长度,解析出数据包包头后,包头中包含数据包长度.所以在读入进入PacketBuilder中的数据,会根据第一个字节中存储的数据

【04】AJAX接收服务器返回的数据

AJAX接收服务器返回的数据 readyState 和 status 属性 readyState 属性保存有 XMLHttpRequest 对象的交互状态,从 0 到 4 变化: 0 :未初始化(还没有调用send()方法): 1:载入(已调用send()方法,正在发送请求): 2:载入完成(send()方法执行完成,已经接收到全部响应数据): 3:交互(正在解析响应数据): 4:完成(响应数据解析完成,可以在客户端调用了). status 属性保存有 XMLHttpRequest 对象与后台交

jQuery提交Json数据到Webservice,并接收返回的Json数据

jQuery ajax webservice:get 和 post 一.GET 方式 客户端 复制代码 代码如下: var data = { classCode: "0001"}; // 这里要直接使用JOSN对象 $.ajax({ type: "GET", contentType: "application/json; charset=utf-8", url: "/WebServices/ProductPropertyWebServi

接收请求参数及数据回显

接收请求参数及数据回显 接收一个参数 //http://localhost:8080/r/user/t1?username=julia @GetMapping("/user/t1") public String test1(@RequestParam("username") String name, Model model) { return "test"; } 接受一个对象 //http://localhost:8080/r/user/t2?i

使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)

原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图.下面就来看看本文实现的功能: Silverlight 与服务器利用Socket通讯,实时从服务器获取数据(本文中的数据是地理坐标),由于没有GPS,所以本文在服务器写了一个构造新坐标的函数(本文是一个三角函数),然后利用Timer组件,实时调用,得到新的坐标,并将新的坐标发送给客户端,客户端接收到发

【转载】http和socket之长连接和短连接

TCP/IP TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. 在应用层有:TCP包括FTP.HTTP.TELNET.SMTP等协议                  UDP包括DNS.TFTP等协议 短连接 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接. 也可以这样说:短连接是指SO

TCP/IP,http,socket,长连接,短连接

TCP/IP TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. 在应用层有:TCP包括FTP.HTTP.TELNET.SMTP等协议                  UDP包括DNS.TFTP等协议 短连接 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接. 也可以这样说:短连接是指SO