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

		}
	}
}
相關文章
相關標籤/搜索