【问题标题】:send server to client C#将服务器发送到客户端 C#
【发布时间】:2017-11-24 12:59:29
【问题描述】:

我从网络编程开始。我做的第一件事是将字符串从客户端传输到服务器,它可以工作。现在我想让服务器发送一个问题(2 + 2 =?)并且客户端响应。如果服务器读取的答案是正确的,则返回 true,否则返回 false。我不知道如何等待服务器应答。

//SERVER
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace ServerConnessione
{
    class Program
    {
        static Socket serverSocket;
        static List<Socket> clientList;
        const int BUFFER_SIZE = 2048;
        static byte[] buffer;
        static void Main(string[] args)
        {
            buffer = new byte[BUFFER_SIZE];
            clientList = new List<Socket>(); //client connessi
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //creo il socket server - 1) IP 2)comunica con un peer insieme di byte 3)tipo di protocollo
            SetupServer();

        }

        static void SetupServer()
        {
            Console.Title = "Server";
            Console.WriteLine("Setup server ...");
            serverSocket.Bind(new IPEndPoint(IPAddress.Any, 100));//tutti i tipi di ip, porta 100
            serverSocket.Listen(1); //metto il socket in stato di attesa
            serverSocket.BeginAccept(AcceptCallBack, null);//verifico se qualcuno si collega
            Console.ReadLine();

        }

        static void AcceptCallBack(IAsyncResult ar)
        {
            Socket socket;

            try
            {
                socket = serverSocket.EndAccept(ar);

            }
            catch (Exception)
            {

                return;
            }
            clientList.Add(socket);//si è collegato un client e lo aggiungo in lista
            serverSocket.BeginAccept(AcceptCallBack, null);
            byte[] data = new byte[2048];
            data = Encoding.ASCII.GetBytes("Quanto fa 2 + 2 ?");
            socket.BeginSend(data, 0, BUFFER_SIZE, SocketFlags.None, SendCallBack, socket);

        }

        private static void SendCallBack(IAsyncResult AR)
        {
            Socket current = (Socket)AR.AsyncState;
            current.EndSend(AR);
        }
        private static void ReceiveCallback(IAsyncResult AR)
        {
            Socket current = (Socket)AR.AsyncState;
            int received;
            try
            {
                received = current.EndReceive(AR);
            }
            catch (SocketException)
            {

                Console.WriteLine("Client scollegato");
                current.Close();//chiudo la connessione
                clientList.Remove(current);//elimino dalla lista utenti la connessione corrente
                return;
            }


                Console.WriteLine("Domanda mandata al client");

                //current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current);//inizio a ricevere i dati               
                //byte[] recBuf = new byte[received];
                //Array.Copy(buffer, recBuf, received);
                //string text = Encoding.ASCII.GetString(recBuf);
                //int result = int.Parse(text);
                //if (result == Sum(2, 2))
                //    data = Encoding.ASCII.GetBytes("Risposta esatta");

                //else

                //    data = Encoding.ASCII.GetBytes("Somaro!! HAI SBAGLIATO!");

                //current.Send(data);

                //byte[] recBuf = new byte[received];
                //Array.Copy(buffer, recBuf, received); //copio dentro buffer quello che ricevo
                //string text = Encoding.ASCII.GetString(recBuf);
                //Console.WriteLine("Il client si chiama " + text);
                ////spedisco il messaggio di benvenuto
                //byte[] data = Encoding.ASCII.GetBytes("Benvenuto " + text);
                //current.Send(data);
                //Console.WriteLine("Messaggio inviato al client");
                //current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current);
        }

        static int Sum(int a, int b)
        {
            return a + b;
        }
    }


}


//CLIENT

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace ClientConnessione
{
    class Program
    {
        private static Socket ClientSocket;
        private const int PORT = 100;
        static void Main(string[] args)
        {
            ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Console.Title = "Client";
            ConnectToServer();
            RequestLoop();
        }

        private static void ConnectToServer()
        {
            int attempts = 0;
            while (!ClientSocket.Connected)
            {
                try
                {
                    attempts += 1;
                    Console.WriteLine("Tentativo di connessione " + attempts);
                    ClientSocket.Connect(IPAddress.Loopback, PORT);
                }
                catch (SocketException)
                {

                    Console.Clear();
                }

            }
            Console.Clear();
            Console.WriteLine("Connesso!");
        }

        private static void RequestLoop()
        {

            while(true)
            {
                ReceiverResponse();
                //SendRequest();
            }
        }

        private static void SendRequest()
        {
            string request = Console.ReadLine();
            byte[] buffer = Encoding.ASCII.GetBytes(request);
            ClientSocket.Send(buffer, 0, buffer.Length, SocketFlags.None);

        }

        private static void ReceiverResponse()
        {
            byte[] buffer = new byte[2048];
            int received = ClientSocket.Receive(buffer, SocketFlags.None);
            if (received == 0) return;
            var data = new byte[received];
            Array.Copy(buffer, data, received);
            string text = Encoding.ASCII.GetString(data);
           // Console.Clear();
            Console.WriteLine(text);
        }
    }
}

【问题讨论】:

    标签: c# sockets server client console-application


    【解决方案1】:

    如果您的目标是实现这个 scnerio,您可以为此构建一个协议。

    客户 -> 我准备好了
    服务器 -> 2+2 = ?
    客户端 -> 4
    服务器 -> 真

    但是,如果您需要服务器开始通信并且客户端在服务器发送请求时响应,那么最好打开另一个角色更改的连接(客户端打开服务器套接字,服务器打开客户端套接字)。因此,客户端和服务器中的每一个都可以独立地发送消息并接受响应。

    你可以查看这个
    Use one Socket to send and recieve data

    【讨论】:

    • 对我来说这不是丑闻,但我必须从某个地方开始。还是谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多