C# Socket verzenden en ontvangen sluit probleem

Status
Niet open voor verdere reacties.

cuperus

Gebruiker
Lid geworden
2 nov 2010
Berichten
43
Hallo,

Ik heb een TCP Socket op internet gevonden die verzend en ontvangt!
Het probleem is als ik de client sluit krijg ik deze error:
CsharpError.png


Dit is de server:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Collections;
using System.Threading;
using System.Net;

namespace Fun_House_Server.Packets
{
    class Packets
    {
        public void Start()
        {
            TcpListener serverSocket = new TcpListener(3167);
            TcpClient clientSocket = default(TcpClient);
            int counter = 0;

            serverSocket.Start();

            counter = 0;
            while (true)
            {
                string sts = "[Server == Server] - ";
                string ctc = "[Client == Client] - ";
                string stc = "[Server -> Client] - ";
                string cts = "[Server <- Client] - ";
                string sto = "[Server -> Output] - ";

                counter += 1;
                clientSocket = serverSocket.AcceptTcpClient();
                Console.WriteLine(cts + "Accepted Connection Nr. " + Convert.ToString(counter));
                handleClinet client = new handleClinet();
                client.startClient(clientSocket, Convert.ToString(counter));
            }
            clientSocket.Close();
            serverSocket.Stop();
        }

        public class handleClinet
        {
            TcpClient clientSocket;
            string clNo;
            public void startClient(TcpClient inClientSocket, string clineNo)
            {
                this.clientSocket = inClientSocket;
                this.clNo = clineNo;
                Thread ctThread = new Thread(doChat);
                ctThread.Start();
            }
            private void doChat()
            {
                int requestCount = 0;
                byte[] bytesFrom = new byte[10025];
                string dataFromClient = null;
                Byte[] sendBytes = null;
                string serverResponse = null;
                string rCount = null;
                requestCount = 0;

                while ((true))
                {
                    try
                    {
                        string sts = "[Server == Server] - ";
                        string ctc = "[Client == Client] - ";
                        string stc = "[Server -> Client] - ";
                        string cts = "[Server <- Client] - ";
                        string sto = "[Server -> Output] - ";

                        requestCount = requestCount + 1;
                        NetworkStream networkStream = clientSocket.GetStream();
                        networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                        dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                        dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
                        Console.WriteLine(cts + clNo + dataFromClient);

                        Thread.Sleep(1000);

                        rCount = Convert.ToString(requestCount);
                        // clNo = Client Number
                        // rCount = Packet send number
                        serverResponse = "Test Packet sent";
                        sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                        networkStream.Write(sendBytes, 0, sendBytes.Length);
                        networkStream.Flush();
                        Console.WriteLine(stc + serverResponse);
                    }
                    catch(Exception e)
                    {
                    }
                }
            }
        }
    }
}

En dit is de client:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace Fun_House
{
    public partial class Login : Form
    {
        TcpClient clientSocket = new System.Net.Sockets.TcpClient();

        public Login()
        {
            InitializeComponent();
        }

        private void Login_Load(object sender, EventArgs e)
        {
            clientSocket.Connect("127.0.0.1", 3167);
        }

        private void loginBtn_Click(object sender, EventArgs e)
        {
            NetworkStream serverStream = clientSocket.GetStream();
            byte[] outStream = System.Text.Encoding.ASCII.GetBytes("Message from Client$");
            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();

            byte[] inStream = new byte[10025];
            serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
            string returndata = System.Text.Encoding.ASCII.GetString(inStream);
            MessageBox.Show("Data from Server : " + returndata);
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            clientSocket.Close();
        }
    }
}

Kan iemand mij hier AUB mee helpen! ik zit hier nu al dagen mee:(
 
Laatst bewerkt:
Ik neem aan dat de rest dus werkt? Behalve het afsluiten?

In principe doet het programma precies wat je verwacht. Het geeft je een exception zodra je van de lege socket probeert te lezen. Deze exception kun je netjes in je "catch" afvangen om het object te sluiten en op te ruimen.
 
Zou u aub de catch code kunen maken want ik heb dit geprobeerd maar dat werkt niet

Code:
try
                    {
                        string sts = "[Server == Server] - ";
                        string ctc = "[Client == Client] - ";
                        string stc = "[Server -> Client] - ";
                        string cts = "[Server <- Client] - ";
                        string sto = "[Server -> Output] - ";

                        requestCount = requestCount + 1;
                        NetworkStream networkStream = clientSocket.GetStream();
                        networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                        dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                        dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
                        Console.WriteLine(cts + clNo + dataFromClient);

                        Thread.Sleep(1000);

                        rCount = Convert.ToString(requestCount);
                        // clNo = Client Number
                        // rCount = Packet send number
                        serverResponse = "Test Packet sent";
                        sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                        networkStream.Write(sendBytes, 0, sendBytes.Length);
                        networkStream.Flush();
                        Console.WriteLine(stc + serverResponse);
                    }
                    catch(Exception e)
                    {
                        NetworkStream networkStream = clientSocket.GetStream();
                        networkStream.Close();
                    }

Dan staat er iets van Non-connected sockets ofzoiets!
 
Klopt. In de catch moet je niet proberen verder te gaan. Op het moment dat je in de catch komt moet je er van uitgaan dat er ergens iets fout is gelopen in je client-thread. In je catch moet je dus je objecten opruimen en je thread stoppen.

NetworkStream.Close() gaat mogelijk wel goed, maar misschien wordt die al opgeruimd op het moment dat de client "ophangt"

dus:

Code:
catch(Exception e)
{
      NetworkStream.Close(); //mogelijk niet nodig, maar wel even proberen
      Return; //je subroutine afsluiten
      //break; kan denk ik ook in dit geval
}

overigens kun je ook meerdere catch statements gebruiken. 1 specifiek voor de "nette" situatie van een client die afsluit, en een algemene voor andere onvoorziene problemen
 
Het is gelukt:)

Ik heb dit gedaan:

Code:
catch
{
return;
}

En het werkt perfect. Heel erg bedankt:)
 
catch { return; } zou ik nooit doen.
Mocht er iets mis gaan. dan kan je dus niet achterhalen wat er nou precies gebeurd is.
je kan ook meerdere catches maken bijv. :

catch (SocketBindException) { }
catch (IndexOutOfBoundsException) { }

verzin ze nu uit me hoofd maar zo zou je dus veilig je errors kunnen afvangen zodat je het kan fixen als het mis gaat.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan