2016-04-01 16 views
0

Ich mache etwas für mein Projekt für die Schule, es erfordert, dass ich eine C# -Anwendung erstelle, die sowohl die Kommunikation vom Server (dem Listener) als auch vom Client ermöglicht. Das Problem ist, ich habe das getan, aber es funktioniert überhaupt nicht, es wirft zu viele Fehler zu korrigieren und ist definitiv schlecht codiert, ich habe noch nie etwas so schlampig zuvor getan.Kommunikation zwischen Server- und Client-Verbindung C#

Ich möchte auch, dass viele Clients auf den Server zur gleichen Zeit zugreifen können, also eine Kundenliste von aktiven Personen. Ich sah ein Beispiel online, aber es war zu kompliziert für die Aufgabe, die ich erreichen wollte. Ich möchte nur eine einfache Textkommunikation sowohl mit dem Client als auch mit dem Server durchführen und bei Bedarf Informationen senden. Ich will nicht, dass es in einer While-Schleife feststeckt und darauf wartet, dass Informationen gesendet werden. & whatnot.

Tut mir leid, wenn ich es schlecht erklärt habe. Vielen Dank.

bearbeiten

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using System.Windows.Forms; 
using System.Threading; 
using System.Net; 
using System.Net.Sockets; 

namespace CentralHubGUI 
{ 
    class chCon 
    { 



    static TcpClient clientCon; 
    static NetworkStream stream; 
    public static bool currentlyConnected; 

    static string buffer; 

    string ip = ""; 
    int port = 0; 

    Thread thread1 = new Thread(receiveData_Stage1); 
    //Thread thread2 = new Thread(); 
    //Thread thread3 = new Thread(); 

    public chCon(string ipAddress, int portNumber) 
    { 
     ip = ipAddress; 
     port = portNumber; 

     connectToConsole(); 
    } 

    public void connectToConsole()//mitigates the connection 
    { 
     if (ip.Trim() == "") 
      ip = "127.0.0.1"; 

     if (port == 0) 
      port = 2647; 

     try 
     { 
      clientCon = new TcpClient(ip, port); 
      stream = clientCon.GetStream(); 

      sendData("#101" + (char)13); //first bit of data is sent on accepted client 

      Thread retrieveData = new Thread(receiveData_Stage1); 
      retrieveData.Start(); 
      currentlyConnected = true; 

      thread1.Start(); //starting to read the server for information 
     } 

     catch(Exception e) // if the connection being naughty ;) 
     { 
      currentlyConnected = false; 
      MessageBox.Show("Exception caught:\n" + e); 
     } 

    } 

    public void disconnectFromConsole() 
    { 
     try 
     { 
      if (clientCon.Connected || clientCon.Connected == null) 
      { 
       thread1.Abort(); 

       byte[] msg = System.Text.Encoding.ASCII.GetBytes("#103"); 
       stream.Write(msg, 0, msg.Length); 
       stream.Close(); 
       clientCon.Close(); 

       currentlyConnected = false; 
      } 
      else 
      { 
       MessageBox.Show("Cannot disconnect from a connection that has not started."); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error thrown during disconnection - UNKNOWN"); 
     } 
    } 

    internal void sendData(string data)//sends data to the server 
    { 
     Byte[] dataConv = System.Text.Encoding.ASCII.GetBytes(data); 

     stream.Write(dataConv, 0, dataConv.Length); 

    } 

    public static void receiveData_Stage1() //builds a buffer through a loop 
    { 
     while (true) 
     { 
      Byte[] response = new Byte[256]; 
      string responseData = String.Empty; 

      // Read the first batch of the TcpServer response bytes. 
      Int32 bytes = stream.Read(response, 0, response.Length); 
      responseData = System.Text.Encoding.ASCII.GetString(response); 

      if(responseData.Trim() != "") 
       buffer = buffer + responseData; 
     } 
    } 

    public static string receiveData_Stage2() //requests the buffer through a return value string 
    { 
     string bufferTemp; 
     bufferTemp = buffer; 

     buffer = string.Empty; 

     return bufferTemp; 
    } 

    public void closeConnection() 
    { 
     stream.Close(); 
     clientCon.Close(); 
     thread1.Abort(); 
    } 

    } 
    /* 
    while (true) 
     { 
      if (Program.currentlyConnected == true) 
      { 
       Thread.Sleep(100); 
       buffer = Program.receiveData_Stage2(); 
       if (buffer != "") 
        richTxtBoxConsole.AppendText(buffer + "\n"); 
      } 
      else 
      { 
       guiConsoleWriteLine("Connection is not active."); 
       break; 
      } 

     } 
    */ 
} 
+0

Post finden, was Sie versucht haben. Ansonsten ist es eine zu weite Frage. – Divisadero

+0

Diese Frage braucht ernsthafte Arbeit. Bitte zeigen Sie genau, was Sie versucht haben und welche Fehler/Probleme aufgetreten sind, die Sie nicht lösen können. – nodots

+0

** A) ** Warum verwenden Sie zwei Threads zum Lesen der Daten? Dies könnte schwerwiegende Probleme verursachen. Entweder "Thread1" oder "retrieveData" loswerden. ** B) ** Die Überprüfung von 'clientCon.Connected == null' ist nutzlos, da ein' Boolean'-Wert nicht null sein kann. –

Antwort

0

Von dem, was Sie erklärt i ausrechnen kann nicht wirklich, was Sie wollen, aber aus meiner erraten lassen Sie uns sagen, dass es auf der Technologie ab, die Sie gehen wollen. Ich würde empfehlen, WCF Windows Communication Foundation zu verwenden. Sie können einige gute Artikel auf .NET Foundation, Tutorial to get started

Verwandte Themen