Socket problem...

Otianer

Mitglied
Hallo,

ich habe folgendes Problem, ich stelle eine Verbindung zwischen einem Server und einem bzw. es können auch mehrere Clients sein. Es handelt sich um einen einfachen Chat über Sockets nun die Verbindungen und sowas habe ich hinbekommen und es werden auch Nachrichten über den Server an alle Clients weitergekeitet nur nach ca. 20 Sekunden empfängt der Server zwar noch die Nachrichten aber leitet diese nicht weiter und ich habe keine idee warum hab auch schon nachgeforscht hänge jetzt seit 3 Tagen an dem Problem ich hoffe ihr könnt mir helfen.
Gruß Otianer.

P.S.
der Quellcode meiner Forms sowie der Klassen:

Server.cs:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace ClientServer
{
    public partial class frmServer : Form
    {
        public frmServer ( )
        {
            InitializeComponent ( );           

            mainThread = new Thread ( new ThreadStart ( this.mainListener ) );
            Form.CheckForIllegalCrossThreadCalls = false;
        }

        public const int listenPort = 10000;
        public const int sleepTime = 200;
        public IPAddress ipAdress = IPAddress.Any;
        private Thread mainThread;
        public const int maxServerConnections = 100;       
        public List<Socket> clients2 = new List<Socket> ( );        

        private void mainListener ( )
        {
            TcpListener listener = new TcpListener ( ipAdress, listenPort );
            
            lbxMessages.Items.Add ( "Horche auf Port : " + listenPort.ToString ( ) );
            
                try
                {
                    listener.Start ( );
                    while ( true )
                    {
                        while ( !listener.Pending ( ) )
                        {
                            Thread.Sleep ( sleepTime );
                        }

                        Socket socket = listener.AcceptSocket ( );
                        lbxClents.Items.Add ( socket.RemoteEndPoint );
                        lbxMessages.Items.Add ( "Neue Client-Verbindung (" +
                                    "IP: " + socket.RemoteEndPoint + ", " +
                                    "Port " + ( ( IPEndPoint ) socket.LocalEndPoint ).Port.ToString ( ) + ")" );
                        
                        ServerInstanz newConn = new ServerInstanz ( socket, this);

                        clients2.Add ( socket );                        
                    }
                }
                catch ( Exception ex )
                {
                    throw new Exception ( "Fehler be Verbindung", ex );
                }
            
        }

        private void cmdStart_Click ( object sender, EventArgs e )
        {
            if ( mainThread.ThreadState != ThreadState.Running)
            {
                mainThread.Start ( );
            }            
        }

        private void cmdStoppen_Click ( object sender, EventArgs e )
        {
            if ( mainThread.ThreadState == ThreadState.Running )
            {
                mainThread.Suspend();
                
            }
        }
    }
}

ServerInstanz.cs:
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace ClientServer
{
    class ServerInstanz
    {
        const int SleepTime = 200;
        public Thread serverThread;
        public Socket socket;
        private int BufferSize = 10240;
        frmServer serv;

        public ServerInstanz(Socket socket, frmServer serv)
        {
            this.socket = socket;
            this.serv = serv;
            serverThread = new Thread ( new ThreadStart ( Process ) );
            serverThread.Start ( );
        }

        public void Process ( )
        {
            try
            {
                
                MemoryStream mem = new MemoryStream ( );// Empfangspuffer
                byte [ ] buffer = new byte [ BufferSize ];

                while ( true )
                {
                    mem.Seek ( 0, SeekOrigin.Begin );
                    mem.SetLength ( 0 );                    
                    while ( socket.Available > 0 )
                    {
                        //Byte[] buffer = new byte[bytesAvailable];
                        int bytesRead = socket.Receive ( buffer, buffer.Length, SocketFlags.None );
                        if ( bytesRead <= 0 ) continue;
                        mem.Write ( buffer, 0, bytesRead );
                        // Alles zurücksetzen                        
                    }
                    
                    if ( mem.Length > 0 )
                    {
                        if ( mem.Length == 4 )
                            if ( System.Text.Encoding.ASCII.GetString ( mem.ToArray ( ), 0, 4 ) == "quit" )
                            {
                                for ( int i = 0; i < serv.lbxClents.Items.Count; i++ )
                                {
                                    if ( serv.lbxClents.Items [ i ].ToString ( ) == socket.RemoteEndPoint.ToString ( ) )
                                    {
                                        serv.lbxClents.Items.RemoveAt ( i );
                                    }
                                }

                                for ( int i = 0; i < serv.clients2.Count; i++ )
                                {
                                    if ( serv.clients2 [ i ] == socket )
                                    {
                                        serv.clients2.RemoveAt ( i );
                                    }
                                }

                                serv.lbxMessages.Items.Add ( "Client-Verbindung getrennt(" +
                                    "IP: " + socket.RemoteEndPoint + ", " +
                                    "Port " + ( ( IPEndPoint ) socket.LocalEndPoint ).Port.ToString ( ) + ")" );
                                socket.Close ( );
                                socket = null;
                                serverThread.Abort ( );
                            }
                        serv.lbxMessages.Items.Add ( System.Text.Encoding.ASCII.GetString ( mem.ToArray ( ) ) );
                        
                            Socket [ ] array = serv.clients2.ToArray ( );                            
                            for ( int i = 0; i < serv.clients2.Count; i++ )
                            {                                
                                array [ i ].Send ( mem.ToArray ( ), SocketFlags.None );
                                serv.clients2 [ i ].Send ( mem.ToArray ( ) );
                            }
                      
                        mem.Seek ( 0, SeekOrigin.Begin );
                        mem.SetLength ( 0 );
                    }
                }


            }
            catch
            {
                System.Console.WriteLine ( "Verbindung zum Client beendet" );
            }
        }
    }
}

Client.cs:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Security;
using System.Security.Permissions;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace Client
{
    public partial class frmClient : Form
    {
        public frmClient ( )
        {
            InitializeComponent ( );
            
            Form.CheckForIllegalCrossThreadCalls = false;
                        
        }

        Thread recive;
        private int SleepTime = 100;
        private int TimeOut = 5000;
        byte [ ] bytes;
        private bool receiving = false;
        public Socket socket = null;
        private int BufferSize = 10240;

        public void receive ( )
        {
            try
            {
                int cnt = 0;
                receiving = true;
                MemoryStream mem = new MemoryStream ( );// Empfangspuffer
                byte [ ] buffer = new byte [ BufferSize ];
                while ( cnt < ( TimeOut / SleepTime ) )
                {
                    while ( socket.Available > 0 )
                    {
                        int bytesRead = socket.Receive ( buffer, buffer.Length, SocketFlags.None );
                        if ( bytesRead <= 0 ) continue;
                        mem.Write ( buffer, 0, bytesRead );
                    }
                    Thread.Sleep ( SleepTime );
                    if ( mem.Length > 0 && socket.Available == 0 )
                    {
                        //Console.WriteLine("Client: {0} bytes received",mem.Length);
                        receiving = false;
                        bytes = mem.ToArray ( );
                        lbxEingang.Items.Add ( System.Text.Encoding.ASCII.GetString ( mem.ToArray ( ) ) );
                        
                    }
                    else
                    {
                        cnt++;
                    }
                    mem.Seek ( 0, SeekOrigin.Begin );
                    mem.SetLength ( 0 );
                }
                receiving = false;
                bytes = null;
            }
            catch
            {
                receiving = false;
                bytes =  null;
            }
        }

        public void client(String Address,int port)
        {
            try
            {
                IPHostEntry hostInfo = Dns.GetHostByName(Address);
                System.Net.IPEndPoint ep = new System.Net.IPEndPoint(hostInfo.AddressList[0],port);
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
                socket.Connect(ep);
            }
            catch (SecurityException ex)
            {
                throw new Exception("Fehler beim Herstellen der Verbindung zum Server, evtl. verursacht durch eine Firewall oder ähnliche Schutzmechanismen",ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Fehler beim Herstellen der Verbindung zum Server",ex);
            }
        }

        private void frmClient_Load ( object sender, EventArgs e )
        {
            
        }

        private void cmdVerbinden_Click ( object sender, EventArgs e )
        {
            if ( txbIP.Text != "" && txbPort.Text != "" )
            {
                client ( txbIP.Text, Convert.ToInt32 ( txbPort.Text ) );
                recive = new Thread ( new ThreadStart ( receive ) );
                recive.Start ( );
                txbPort.Visible = false;
                txbIP.Visible = false;
                cmdVerbinden.Visible = false;
                cmdSenden.Visible = true;
                txbText.Visible = true;
                cmdTrennen.Visible = true;
                lbxEingang.Visible = true;
            }
        }

        private void cmdSenden_Click ( object sender, EventArgs e )
        {
            if ( socket != null && txbText.Text != "" )
            {
                socket.Send ( System.Text.Encoding.ASCII.GetBytes ( txbText.Text ) );
                txbText.Text = "";
            }
        }

        private void cmdTrennen_Click ( object sender, EventArgs e )
        {
            if ( socket != null )
            {
                socket.Send ( System.Text.Encoding.ASCII.GetBytes ( "quit" ) );
                socket.Close ( );
                recive.Join ( 10000 );                
                recive.Interrupt ( );                
                recive = null;
                socket = null;
                txbPort.Visible = true;
                txbIP.Visible = true;
                cmdVerbinden.Visible = true;
                cmdSenden.Visible = false;
                txbText.Visible = false;
                cmdTrennen.Visible = false;
                lbxEingang.Visible = false;                
            }
        }
    }
}
 
Zuletzt bearbeitet:
Zurück