MultitThread Server

WorldRacer

Erfahrenes Mitglied
Hallo zusammen,

habe mir folgendes Tutorial angeschaut: http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server

Funktioniert soweit sehr gut. Wenn ich folgenden Code (beim Client)

Code:
            TcpClient client = new TcpClient();

            IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12597);

            client.Connect(serverEndPoint);

            NetworkStream clientStream = client.GetStream();

            ASCIIEncoding encoder = new ASCIIEncoding();
            byte[] buffer = encoder.GetBytes("Hello Server!");

            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();

um folgendes erweitere:

Code:
            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();

Kommt bei der Ausgabe folgendes (benutze eine MessageBox) heraus "Hello Server!Hello Server!". Ich möchte aber, dass beim Server zwei MessageBoxen erscheinen. Wie stell ich das an?
Hier noch der Code vom Server:

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

namespace TCPServerTutorial
{
    class Server
    {
        private TcpListener tcpListener;
        private Thread listenThread;

        public Server()
        {
            this.tcpListener = new TcpListener(IPAddress.Any, 12597);
            this.listenThread = new Thread(new ThreadStart(ListenForClients));
            this.listenThread.Start();
        }
        private void ListenForClients()
        {
            this.tcpListener.Start();

            while (true)
            {
                //blocks until a client has connected to the server
                TcpClient client = this.tcpListener.AcceptTcpClient();

                //create a thread to handle communication
                //with connected client
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);
            }
        }
        private void HandleClientComm(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();

            byte[] message = new byte[4096];
            int bytesRead;

            while (true)
            {
                message = new byte[4096];
                bytesRead = 0;

                try
                {
                    //blocks until a client sends a message
                    bytesRead = clientStream.Read(message, 0, 4096);
                }
                catch
                {
                    //a socket error has occured
                    break;
                }

                if (bytesRead == 0)
                {
                    //the client has disconnected from the server
                    break;
                }

                //message has successfully been received
                ASCIIEncoding encoder = new ASCIIEncoding();
                System.Windows.Forms.MessageBox.Show(encoder.GetString(message, 0, bytesRead));
            }

            tcpClient.Close();
        }
    }
}

Danke im Voraus!

Einen Guten Rutsch wünsch' ich euch!!
 
Zuletzt bearbeitet:
Hi,

Ich würde am Anfang der Nachricht noch ein Byte setzten welches die Länge der Nachricht symbolisiert. Dann kannst du sie dir nachher wieder auseinander puzzeln.

Viele Grüße und auch nen guten Rutsch
Erik
 
Hallo,

danke für die Idee, so simpel, da kommt man von allein nicht drauf xDD

Habs jetzt in eine Client-Klasse gepackt und die Server-Klasse ein wenig erweitert:

Server-Klasse:
Code:
using System;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;

namespace TCPServerTutorial
{
    class Server
    {
        private TcpListener tcpListener;
        private Thread listenThread;

        public Server()
        {
            this.tcpListener = new TcpListener(IPAddress.Any, 12597);
            this.listenThread = new Thread(new ThreadStart(ListenForClients));
            this.listenThread.Start();
        }
        private void ListenForClients()
        {
            this.tcpListener.Start();

            while (true)
            {
                //blocks until a client has connected to the server
                TcpClient client = this.tcpListener.AcceptTcpClient();

                //create a thread to handle communication
                //with connected client
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);
            }
        }
        private void HandleClientComm(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();

            byte[] message = new byte[4096];
            int bytesRead;

            while (true)
            {
                message = new byte[4096];
                bytesRead = 0;

                try
                {
                    //blocks until a client sends a message
                    bytesRead = clientStream.Read(message, 0, 4096);
                }
                catch
                {
                    //a socket error has occured
                    break;
                }

                if (bytesRead == 0)
                {
                    //the client has disconnected from the server
                    break;
                }

                //message has successfully been received
                ASCIIEncoding encoder = new ASCIIEncoding();
                processMessages(encoder.GetString(message, 0, bytesRead));
            }

            tcpClient.Close();
        }
        private void processMessages(string Message)
        {
            string[] commands = Message.Split(new char[] { '\n' });
            foreach (string command in commands)
            {
                if (command != string.Empty)
                {
                    handleMessage(command);
                }
            }
        }
        public virtual void handleMessage(string command){
            System.Windows.Forms.MessageBox.Show(command);
        }
    }
}

Client-Klasse:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace devConnector
{
    class devClient
    {
        private TcpClient client = null;
        private IPEndPoint serverEndPoint = null;
        private int gate = 0;
        private string ipaddr = "";
        NetworkStream clientStream = null;
        public devClient(string IP, int port){
            
            gate = port;
            ipaddr = IP;
            
        }
        
        public void Connect(){
            if(client == null){
                client = new TcpClient(ipaddr, gate);
                clientStream = client.GetStream();
            }
        }
        public void Disconnect(){
            if(client != null){
                if(client.Connected){
                    client.Close();
                    client = null;
                }
            }
        }
            
        public void SendCommand(string Command){
            ASCIIEncoding encoder = new ASCIIEncoding();
            byte[] buffer = encoder.GetBytes(Command + "\n");
            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();            
        }
    }
}

Code in der Anwendung der Client-Klasse:
Code:
 static void Main(string[] args)
        {
            devClient clt = new devClient("10.0.100.137", 12597);
            clt.Connect();
            clt.SendCommand("Blah"); 
            clt.SendCommand("Blah");
            clt.Disconnect();
        }

Hoffe ich kann damit jemandem weiterhelfen.

Frohes neues
 
Zurück