2012-03-26 8 views
1

Ich muss ein Programm schreiben, um zu überprüfen, ob eine zufällige Zeichenfolge in einer Datei vorhanden ist. Und ich tat es .. Aber jetzt wurde ich gebeten, sockets.send zu verwenden und Methode zu empfangen. Ich habe eine Verbindung erstellt und den Code bis hierher geschrieben. Wie gehe ich weiter? Ich bin nicht in der Lage, es herauszufinden .. Das erste Programm ist mein Versuch am serverseitigen Programm. Und das zweite ist mein tatsächliches Programm, um nach einer Zeichenkette aus der Datei zu suchen. Könnte mir jemand mit dem Code helfen, wie man die Sockets in meinem Programm benutzt? Danke viel .. :)Socket.Send und Receive .. Wie gehe ich weiter?

class Program 
{ 
    static void Main(string[] args) 
    { 
     TcpListener serversocket = new TcpListener(8888); 
     int requestcount = 0; 
     TcpClient clientsocket = default(TcpClient); 
     serversocket.Start(); 
     Console.WriteLine(">> Server Started"); 
     clientsocket = serversocket.AcceptTcpClient(); 
     Console.WriteLine("Accept Connection From Client"); 
     requestcount = 0; 


     while ((true)) 
     { 
      try 
      { 
       requestcount = requestcount + 1; 
       NetworkStream networkstream = clientsocket.GetStream(); 
       byte[] bytesFrom = new byte[10025]; 
       networkstream.Read(bytesFrom, 0, (int)clientsocket.ReceiveBufferSize); 
       string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
       dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 
       Console.WriteLine(" >> Data from client - " + dataFromClient); 
       string serverResponse = "Server response " + Convert.ToString(requestcount); 
       Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse); 
       networkstream.Write(sendBytes, 0, sendBytes.Length); 
       networkstream.Flush(); 
       Console.WriteLine(" >> " + serverResponse); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
      } 
     } 
     clientsocket.Close(); 
     serversocket.Stop(); 
     Console.WriteLine(" >> exit"); 
     Console.ReadLine(); 
     } 
    } 

Dies ist das Programm, das ich in dem oben genannten Programm verwenden möchte.

class Program {

static void Main(string[] args) 
    { 
     if (File.Exists("C://myfile2.txt")) 
     { 
      var text = File.ReadAllText("C://myfile2.txt"); 


      foreach (var word in new[] { "and", "so", "not", "c", "to", "by", "has", "do", "behavior", "dance", "france", "ok","thast", "please","hello","system","possible","impossible","absolutely","sachin","bradman","schumacher","http","console","application" }) 
      { 
       var w = word; 

       new Thread(() => Console.WriteLine("{0}: {1}", w, text.Contains(w) ? "Present" : "Not Present")).Start(); 
      } 

     } 
     else 
      Console.WriteLine("File Does not exist"); 
     Console.ReadLine(); 
    } 

} 
+0

Wie hängen die beiden Codeblöcke zusammen? – Alex

+0

bitte als Hausaufgabe markieren, sonst erhalten Sie nicht hilfreiche Antworten (sagen: das Rad nicht neu erfinden, zum Beispiel) – sehe

+0

@sehe Es ist keine Hausaufgabe. Habe gerade meinen ersten Job gemacht. Ich bin ein Neuling. – 3692

Antwort

2

Hier ist eine schnelle und schmutzige Idee, dass ich ohne eine IDE geschrieben (--- Ich habe es nicht getestet --- bearbeiten gerade getestet es mit netcat, und es funktioniert gut):

  • Beachten Sie, dass es einen regulären Ausdruck verwendet. Wenn die Nachschlagetabelle für Wörter ausreichend groß wird, sollten Sie die Wörter besser in einem HashSet<string> speichern und die Eingabe in Wörter aufteilen. Sie können dann effizient einen .IntersectWith tun, um zu sehen, ob eines der Wörter übereinstimmt.

  • Beachten Sie, dass die Konstrukteurs-Buchse ist veraltet (Sie sollen explizit angeben und IPAddress binden)

  • Ihr Original-Code keine Übereinstimmungen erfordern separate Wörter zu sein (candy Matches sowohl c und and) . Sie könnten beheben möchten, dass

  • Die Teile, die in der ursprünglichen 'grep' ineffizient waren Snippet:

    • ReadAllText (wird nicht für große Dateien maßstäblich)
    • Doing mehrere .Contains Anrufe in einer Schleife ist weit weniger effizient als die Verwendung eines (vorkompilierten) regulären Ausdrucks
    • Warum in aller Welt werden dort Threads erzeugt? Dies fügt buchstäblich nur den Laufzeit-Overhead hinzu und führt möglicherweise zu Problemen aufgrund des unsynchronisierten Zugriffs auf Console.Out.

.

using System; 
using System.IO; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.Net.Sockets; 

class Program 
{ 
    private static Regex _regex = new Regex("and|so|not|c|to|by|has|do|behavior|dance|france|ok|thast|please|hello|system|possible|impossible|absolutely|sachin|bradman|schumacher|http|console|application", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); 

    static void Main(string[] args) 
    { 
     TcpListener serversocket = new TcpListener(8888); 
     TcpClient clientsocket = default(TcpClient); 
     serversocket.Start(); 
     Console.WriteLine(">> Server Started"); 
     clientsocket = serversocket.AcceptTcpClient(); 
     Console.WriteLine("Accept Connection From Client"); 

     try 
     { 
      using (var reader = new StreamReader(clientsocket.GetStream())) 
      { 
       string line; 
       int lineNumber = 0; 
       while (null != (line = reader.ReadLine())) 
       { 
        lineNumber += 1; 
        foreach (Match match in _regex.Matches(line)) 
        { 
         Console.WriteLine("Line {0} matches {1}", lineNumber, match.Value); 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.Error.WriteLine(ex.ToString()); 
     } 

     clientsocket.Close(); 
     serversocket.Stop(); 
     Console.WriteLine(" >> exit"); 
     Console.ReadLine(); 
    } 
} 
+0

Ich schätze deine Hilfe wirklich .. :) Danke eine Tonne. :) Ich werde sicherstellen, dass alles, was du vorgeschlagen hast, impliziert wird und das Programm effizienter macht. :) – 3692

+0

Hatte nur einen kleinen Zweifel, wo und wie lese ich die Datei hier? Die Datei, in der die Zeichenfolgen überprüft werden sollten. – 3692

+0

@ 3692 mein Beispiel liest das vom Socket, wie pro Ihre Frage: "Aber jetzt wurde ich gebeten, sockets.send zu verwenden und Methode zu empfangen". Ich habe es mit einem Kommandozeilen-Client mit 'netcat localhost 8888 sehe