DBLWizard Ответов: 0

C# несколько сообщений socket/TCPIP на одном соединении?


Хорошо,

поэтому я пытаюсь найти "правильный" и наиболее эффективный способ отправки нескольких сообщений по сокет-соединению. Я прочитал и протестировал все примеры кода здесь: Примеры Кода Сокета Но все они делают единую отправку и прием . Я также читал некоторые сообщения, которые дают подсказки, как делать несколько сообщений, а именно(асинхронный серверный сокет C# продолжить отправку сообщений) но когда я удаляю обработчик.Выключение и обработчик.Закройте клиент никогда не заканчивает прием.

Поэтому мне интересно, действительно ли это то, что не должно быть сделано на одном соединении. Может ли кто-нибудь дать направление на этот счет или просто лучше открыть соединение, отправить/получить, закрыть соединение, повторить.

Спасибо

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Xml;
using System.Xml.Serialization;

namespace AsyncTestServer
{
	//https://docs.microsoft.com/en-us/dotnet/framework/network-programming/asynchronous-server-socket-example
	public class AsynchronousSocketListener
	{
		// Thread signal.  
		public static ManualResetEvent allDone = new ManualResetEvent(false);

		public AsynchronousSocketListener()
		{
		}

		public static void StartListening()
		{
			// Establish the local endpoint for the socket.  
			// The DNS name of the computer  
			// running the listener is "host.contoso.com".  
			//IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
			//IPAddress ipAddress = ipHostInfo.AddressList[0];
			IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
			IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 8765);

			// Create a TCP/IP socket.  
			Socket listener = new Socket(ipAddress.AddressFamily,
				SocketType.Stream, ProtocolType.Tcp);

			// Bind the socket to the local endpoint and listen for incoming connections.  
			try
			{
				listener.Bind(localEndPoint);				
				listener.Listen(100);

				while (true)
				{
					// Set the event to nonsignaled state.  
					allDone.Reset();

					// Start an asynchronous socket to listen for connections.  
					Console.WriteLine("Waiting for a connection...");
					listener.BeginAccept(
						new AsyncCallback(AcceptCallback),
						listener);

					// Wait until a connection is made before continuing.  
					allDone.WaitOne();
				}

			}
			catch (Exception e)
			{
				Console.WriteLine(e.ToString());
			}

			Console.WriteLine("\nPress ENTER to continue...");
			Console.Read();

		}

		public static void AcceptCallback(IAsyncResult ar)
		{
			// Signal the main thread to continue.  
			allDone.Set();

			// Get the socket that handles the client request.  
			Socket listener = (Socket)ar.AsyncState;
			Socket handler = listener.EndAccept(ar);

			// Create the state object.  
			StateObject state = new StateObject();
			state.workSocket = handler;
			handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
				new AsyncCallback(ReadCallback), state);
		}

		public static void ReadCallback(IAsyncResult ar)
		{
			String content = String.Empty;

			// Retrieve the state object and the handler socket  
			// from the asynchronous state object.  
			StateObject state = (StateObject)ar.AsyncState;
			Socket handler = state.workSocket;

			// Read data from the client socket.   
			int bytesRead = handler.EndReceive(ar);

			if (bytesRead > 0)
			{
				// There  might be more data, so store the data received so far.  
				state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));

				// Check for end-of-file tag. If it is not there, read   
				// more data.  
				content = state.sb.ToString();
				if (content.IndexOf("</request>") > -1)
				{
					// All the data has been read from the   
					// client. Display it on the console.  
					Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
						content.Length, content);

					// Echo the data back to the client.  
					Send(handler, content + "-received");

					// All data received. Get next message. 
					state.sb.Clear();
					handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
				}
				else
				{
					// Not all data received. Get more.  
					handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
				}
			}
		}

		private static void Send(Socket handler, String data)
		{
			// Convert the string data to byte data using ASCII encoding.  
			byte[] byteData = Encoding.ASCII.GetBytes(data);

			// Begin sending the data to the remote device.  
			handler.BeginSend(byteData, 0, byteData.Length, 0,
				new AsyncCallback(SendCallback), handler);
		}

		private static void SendCallback(IAsyncResult ar)
		{
			try
			{
				// Retrieve the socket from the state object.  
				Socket handler = (Socket)ar.AsyncState;

				// Complete sending the data to the remote device.  
				int bytesSent = handler.EndSend(ar);
				Console.WriteLine("Sent {0} bytes to client.", bytesSent);

				//handler.Shutdown(SocketShutdown.Both);
				//handler.Close();
			}
			catch (Exception e)
			{
				Console.WriteLine(e.ToString());
			}
		}

		public static int Main(String[] args)
		{
			StartListening();
			return 0;
		}
	}
}

Kevin Marois

Я предлагаю вам взглянуть на SignalR. https://www.asp.net/signalr.. Он автоматически использует различные методы, включая веб-сокеты, но он прекрасно завершает всю работу за вас. И вы можете отправить любое сообщение, которое вы хотите. И, чтобы добавить к этому, он действительно прост в настройке и использовании.

DBLWizard

Это не ответ на мой вопрос, хотя спасибо.

0 Ответов