Я хотел написать свою первую программу клиент-сервер. Поэтому я искал учебники / советы. Я нашел этот урок: https://www.youtube.com/watch?v=xgLRe7QV6QI Моя проблема сейчас в том, что сервер вызывает метод accept вместо метода receive, как в видео, когда я отправляю сообщение с клиентом.
Без Try-Catch Visual Studio сообщает: System.ArgumentException: «Объект IAsyncResult не был возвращен из соответствующего асинхронного метода в этом классе.
Arg_ParamName_Name "
С Try-Catch: System.ArgumentException: объект IAsyncResult не был возвращен из соответствующего асинхронного метода в этом классе.
Имя параметра: asyncResult
в System.Net.Sockets.Socket.EndAccept (Byte [] & buffer, Int32 & bytesTransferred, IAsyncResult asyncResult)
в System.Net.Sockets.Socket.EndAccept (IAsyncResult asyncResult)
в Client_Server.Program.AcceptCallback (IAsyncResult AR) в F: \ Programmierung \ C # \ workspace \ Client-Server \ Client-Server \ Program.cs: строка 33
Последнее «в» говорит, что проблема в строке 33
Сервер:
class Program {
private static Thread mainThread;
private static byte[] _buffer = new byte[1024];
private static List<Socket> _clientSockets = new List<Socket>();
private static Socket _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
static void Main(string[] args) {
Console.Title = "Server";
SetupServer();
Console.ReadLine();
}
private static void SetupServer() {
Console.WriteLine("Starting server");
_serverSocket.Bind(new IPEndPoint(IPAddress.Any, 100));
_serverSocket.Listen(5);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
private static void AcceptCallback(IAsyncResult AR) {
Console.WriteLine("Accept");
try {
Socket socket = _serverSocket.EndAccept(AR);
_clientSockets.Add(socket);
Console.WriteLine("A client has connected to the server");
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(AcceptCallback), socket);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
catch(Exception e) {
Console.WriteLine(e);
}
}
private static void ReceiveCallback(IAsyncResult AR) {
Console.WriteLine("Received");
Socket socket = (Socket)AR.AsyncState;
int received = socket.EndReceive(AR);
byte[] dataBuf = new byte[received];
Array.Copy(_buffer, dataBuf, received);
String text = Encoding.ASCII.GetString(dataBuf);
Console.WriteLine("Message received: " + text);
String response = String.Empty;
if (!text.ToLower().Equals("/time")) {
response = "Invalid Request";
}
else {
response = DateTime.Now.ToLongTimeString();
}
byte[] data = Encoding.ASCII.GetBytes(response);
socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket);
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket);
}
private static void SendCallback(IAsyncResult AR) {
Socket socket = (Socket)AR.AsyncState;
socket.EndSend(AR);
}
}
Клиент:
class FirstClient{
private static Socket _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
static void Main(String[] args) {
Console.Title = "Client";
LoopConnect();
SendLoop();
Console.ReadLine();
}
private static void SendLoop() {
while(true){
Console.Write("Enter a request: ");
String requests = Console.ReadLine();
byte[] buffer = Encoding.ASCII.GetBytes(requests);
_clientSocket.Send(buffer);
byte[] receivedBuffer = new byte[1024];
int rec = _clientSocket.Receive(receivedBuffer);
byte[] data = new byte[rec];
Array.Copy(receivedBuffer, data, rec);
Console.WriteLine("Received: " + Encoding.ASCII.GetString(data));
}
}
private static void LoopConnect() {
int attemps = 0;
while (!_clientSocket.Connected) {
try {
attemps++;
_clientSocket.Connect(IPAddress.Loopback, 100);
}
catch (SocketException) {
Console.Clear();
Console.WriteLine("Connection attemps: " + attemps);
}
}
Console.Clear();
Console.WriteLine("Connected to server");
}
}
}
Надеюсь, кто-нибудь может мне помочь.
Спасибо всем, кто хочет мне помочь!