allHandlers var for at serveren kunne holde styr på sine forbindelser og lukke dem hvis det blev nødvendigt.
Hmm det virker fint her.
Serveren står blot for at acceptere forbindelserne, den delegerer kommunikationen til ConnectionHandlers.
Server.cs:
- using System.IO;
- using System.Net;
- using System.Net.Sockets;
- using System.Threading;
-
- namespace TestServer
- {
- class Server
- {
- private string ipAddress = "127.0.0.1";
- private int port = 8085;
-
- NetworkStream networkStream;
- StreamWriter streamWriter;
- StreamReader streamReader;
-
- int clientsHaveConnected = 0;
-
- public void start()
- {
- TcpListener tcpListener = new TcpListener(IPAddress.Parse(ipAddress), port);
- tcpListener.Start();
-
- while (true)
- {
- Socket socketForClient = tcpListener.AcceptSocket();
- ConnectionHandler handler = new ConnectionHandler(socketForClient, ++clientsHaveConnected);
-
- Thread newThread = new Thread(new ThreadStart(handler.HandleClient));
- newThread.Start();
- }
- }
-
- }
- }
ConnectionHandler får en socket som er klienten den skal snakke med og så begynder at kommunikere:
ConnectionHandler.cs:
- using System;
- using System.Net.Sockets;
- using System.IO;
-
- namespace TestServer
- {
- class ConnectionHandler
- {
- Socket socket;
- StreamReader reader;
- StreamWriter writer;
- int client;
- public ConnectionHandler(Socket socket, int clientNumber)
- {
- this.socket = socket;
- NetworkStream stream = new NetworkStream(socket);
- reader = new StreamReader(stream);
- writer = new StreamWriter(stream);
- client = clientNumber;
- }
-
- public void HandleClient()
- {
- if (socket.Connected)
- {
- Console.WriteLine("Thred startede ");
-
- while (true)
- {
- sendAndReseaveMessage("Hello Client" + client);
- }
- }
- else
- {
- Console.WriteLine("Not Connected");
- }
- }
-
- private void sendAndReseaveMessage(string message)
- {
- writer.Flush();
-
- string messeageFromClient = reader.ReadLine();
- Console.WriteLine(messeageFromClient);
-
- writer.WriteLine(message);
- writer.Flush();
- }
- }
- }
Der er nok et par ændringer i IP og namespaces som du lige skal rette tilbage, men ellers er der ikke meget andet. I stedet for at opretty nye stream objects gemmes de på ConnectionHandleren.
Med dette var jeg i stand til at starte serveren, forbinde 3 klienter, og de kunne alle skriv og modtage hver for sig.
Når din applikation bliver mere udviklet bør du tilføje fejlhåndtering. F.eks. går det ikke godt hvis en klient lige pludselig lukker forbindelsen.
Indlæg senest redigeret d. 02.02.2014 16:55 af Bruger #14645