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();

		}
	}
}

  

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

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

    通过ndk-gdb跟踪调试vlc-android来分析从连接到RTSP服务器并接收到音视频数据包后的处理过程. 首先,从前面的文章有分析过vlc-android的处理过程通过线程函数Run()(Src ...

  2. 接收连接basic_socket_acceptor

    概述 TCP有一处和UDP不同的地方是TCP是面向连接的,TCP有建立连接.通信.关闭连接的操作,Boost.Asio提供了ip::tcp::acceptor用来接收新的TCP连接,底层由socket ...

  3. boost的asio接收单路大数据量udp包的方法

    开发windows客户端接收RTP视频流,当h264视频达到1080P 60fps的时候,按包来调用recvfrom的函数压力比较大,存在丢包的问题,windows的完成端口的性能效果当然可以解决这个 ...

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

    本文基于networkcomms2.3.1开源版本  gplv3协议 在networkcomms通信系统中,服务器端收到某连接上的数据后,数据会暂时存放在"数据包创建器"(Pack ...

  5. Request.Form接收不到post数据.

    Request.Form接收不到post数据. https://q.cnblogs.com/q/62635/ Content-Type 有没有设置为 application/x-www-form-ur ...

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

    jQuery ajax webservice:get 和 post 一.GET 方式 客户端 复制代码 代码如下: var data = { classCode: "0001"}; ...

  7. SpringBoot后台接收前台的字符串数据

    需求 将前台传入的字符串数据转为int类型. 操作 在pom.xml中添加引用. <dependency> <groupId>org.apache.commons</gr ...

  8. Spring Boot之 Controller 接收参数和返回数据总结(包括上传、下载文件)

            一.接收参数(postman发送) 1.form表单 @RequestParam("name") String name 会把传递过来的Form表单中的name对应 ...

  9. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十九):推送avro格式数据到topic,并使用spark structured streaming接收topic解析avro数据

    推送avro格式数据到topic 源代码:https://github.com/Neuw84/structured-streaming-avro-demo/blob/master/src/main/j ...

随机推荐

  1. 2019-2020-1 20199312《Linux内核原理与分析》第四周作业

    计算机和操作系统的法宝 计算机三个法宝 存储程序计算机.函数调用堆栈机制.中断 操作系统:中断中断上下文的切换--保护和恢复现场 进程上下文的切换. Linux源代码目录分析 arch目录:代码量庞大 ...

  2. python中的_xx, __xx, __xx__

    一.从模块分析 ########  bb.py (一个用来导入的模块) ########## var = 0_var = 1__var = 2__var__ = 3 1. from module im ...

  3. Meeting Rooms II

    Description Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2, ...

  4. Java 重要知识点,踩过的坑

    (1),关于 LinkedHashMap  TreeMap HashMap 之间的区别: HashMap 是无序的,LinkedHashMap 由于内部维护了一个记录的链表,数据操作的前后顺序都会在链 ...

  5. Color Highlight 鼠标放在 #f3f 上面其背景会变成相应的颜色的插件 DocBlockr自动补全注释

    不是  Color Highlighter    而是 Color Highlight  少了 er  颜色功能还是很爽的,找了好久 鼠标放在 #f3f 上面其背景会变成相应的颜色的插件 DocBlo ...

  6. redis登录及设置密码

    redis服务开启 : ./redis-server /opt/redisConf/redis.conf 1,查询默认密码 127.0.0.1:6379> config get requirep ...

  7. 均匀量化(lena图)

    #include<stdio.h> #include<math.h> #define ROW 512 #define COL 512 typedef unsigned char ...

  8. 找不到编译器:wepy-compiler-less

    npm install less 后再 npm install wepy-compiler-less 解决

  9. PCIe - 周扒皮,扒扒TLP层

    来来来,南来的,北往的,看一看,瞧一瞧,不好用不要钱,快来看呐. 来,客观,摘抄几篇PCIe文章给您看看, 1. http://xillybus.com/tutorials/pci-express-d ...

  10. Maven项目打包时指定配置策略

    以数据库连接池的配置文件(db.properties)为例,一般的项目会有开发用数据库,测试用数据库,正式环境数据库三种配置. 以前的做法是拷贝成三份,注释掉其他了两份 # 开发用 jdbc.url ...