C# client - server crash

Status
Niet open voor verdere reacties.

henkjan111

Gebruiker
Lid geworden
9 jan 2011
Berichten
221
Hallo,

Voor mijn ontwikkeling in het programmeren ben ik bezig met een C# client-server applicatie. De server is een console applicatie, de client een Windows form.
Als ik vanuit de client een verzoek naar de server verstuur, dan ziet de server applicatie dit gewoon. Het is de bedoeling dat de server applicatie dan een antwoord verstuurd naar de client, ook dit gebeurd, echter: Na het ontvangen van het antwoord kun je niks meer met de applicatie/hangt de applicatie vast.

Wat gaat er nou fout?

En zijn er misschien overige verbeter tips voor de code?

Client:

Code:
...
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;

namespace GlobbicConnect_Client
{
    public partial class Frm_Main : Form
    {
        private static readonly Socket ClientSocket = new Socket
           (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        private const int PORT = 55555;

        public Frm_Main()
        {
            InitializeComponent();
        }

        private void Btn_Close_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void Btn_Login_Click(object sender, EventArgs e)
        {
            SendString("login," + Txt_Username.Text);
            RequestLoop();

        }

        private static void ConnectToServer()
        {
            while (!ClientSocket.Connected)
            {
                try
                {
                    ClientSocket.Connect(IPAddress.Loopback, PORT);
                }
                catch (SocketException)
                {

                }
            }
        }

        private static void SendString(string text)
        {
            byte[] buffer = Encoding.ASCII.GetBytes(text);
            ClientSocket.Send(buffer, 0, buffer.Length, SocketFlags.None);
        }

        private static void ReceiveResponse()
        {
            var 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);
            MessageBox.Show(text);
        }

        private static void RequestLoop()
        {
            while (true)
            {
                ReceiveResponse();
            }
        }

        private void Frm_Main_Load(object sender, EventArgs e)
        {
            ConnectToServer();
        }
    }
}

Server:

Code:
...
using System.Net;
using System.Net.Sockets;
using System.Threading;


namespace GlobbicConnect_Server
{
    class Program
    {

        private static readonly Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        private static readonly List<Socket> clientSockets = new List<Socket>();
        private const int BUFFER_SIZE = 2048;
        private const int PORT = 55555; 
        private static readonly byte[] buffer = new byte[BUFFER_SIZE];

        static void Main()
        {
            Console.Title = "GlobbicConnect Server";
            SetupServer();
            Console.ReadLine();
            CloseAllSockets();
        }

        private static void SetupServer()
        {
            try
            {
                string GetPublicIPAddress = new WebClient().DownloadString(@"http://icanhazip.com").Trim();
                Console.WriteLine("Booting server server...");
                serverSocket.Bind(new IPEndPoint(IPAddress.Any, PORT));
                serverSocket.Listen(0);
                serverSocket.BeginAccept(AcceptCallback, null);
                Console.WriteLine("Server booted succesfully!");
                Console.WriteLine("Server IP address and port: " + GetPublicIPAddress + ":" + PORT);
            }
            catch(Exception)
            {
                Console.WriteLine("Error, press return to exit...");
            }
        }

        private static void CloseAllSockets()
        {
            foreach (Socket socket in clientSockets)
            {
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }

            serverSocket.Close();
        }

        private static void AcceptCallback(IAsyncResult AR)
        {
            Socket socket;

            try
            {
                socket = serverSocket.EndAccept(AR);
            }
            catch (ObjectDisposedException)
            {
                return;
            }

            clientSockets.Add(socket);
            socket.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, socket);
            Console.WriteLine("New client application connected, waiting for input.");
            serverSocket.BeginAccept(AcceptCallback, null);
        }

        private static void ReceiveCallback(IAsyncResult AR)
        {
            Socket current = (Socket)AR.AsyncState;
            int received;

            try
            {
                received = current.EndReceive(AR);
            }
            catch (SocketException)
            {
                Console.WriteLine("Client disconnected...");
                current.Close();
                clientSockets.Remove(current);
                return;
            }

            byte[] recBuf = new byte[received];
            Array.Copy(buffer, recBuf, received);
            string text = Encoding.ASCII.GetString(recBuf);
            Console.WriteLine("Received: " + text);
            if (text.ToLower().Trim().StartsWith("login"))
            {
                Console.WriteLine("Login request");
                byte[] data = Encoding.ASCII.GetBytes("antwoord");
                current.Send(data);
            }

            else if (text.ToLower() == "exit")
            {
                // Always Shutdown before closing
                current.Shutdown(SocketShutdown.Both);
                current.Close();
                clientSockets.Remove(current);
                Console.WriteLine("Client disconnected");
                return;
            }

            current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current);
        }

    }
}

Bij voorbaat dank... :)
 
volgens mij alleen

using System.Net;
using System.Net.Sockets;
using System.Threading;

maar zou ik even op moeten zoeken
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan