2013-02-12 42 views
6

मैं सॉकेट प्रोग्रामिंग के बारे में थोड़ा जानने के लिए कोशिश कर रहा हूँ पर संवाद करने के लिए एक टीसीपी/आईपी क्लाइंट और सर्वर की स्थापना और हिस्सों में उन्हें मैंने पढ़ा है कि वे शुरुआती के लिए थोड़ा आसान है TcpListener और TcpClient उपयोग करने के लिए मैं ठोकर खाई है। मैं क्या हासिल करना चाहते हैं के बुनियादी jist कि अपने लैपटॉप और एक ही नेटवर्क पर एक और लैपटॉप पर चलाया जा सकता है एक छोटा सा रूप है और उन्हें अर्थात संवाद एक दूसरे के पाठ की एक स्ट्रिंग भेजने के लिए सक्षम होने के लिए के लिए है। एक बार जब मैं इस मैं उम्मीद है कि यह आगे का विकास होगा :)एक नेटवर्क

अब तक मैं बनाया है दोनों एक ग्राहक और एक सर्वर कार्यक्रम MSDN और इंटरनेट पर पाए विभिन्न गाइड का उपयोग। जब मैं एक लैपटॉप पर चल रहा हूं तो मैं उन्हें संवाद करने के लिए प्राप्त कर सकता हूं, हालांकि जब मैं क्लाइंट को दूसरे लैपटॉप पर ले जाता हूं तो मुझे कहीं भी नहीं मिलता है। मुझे लगता है कि मेरा मुख्य मुद्दा यह है कि मुझे समझ में नहीं आता कि क्लाइंट को सर्वर आईपी कैसे मिलती है क्योंकि मुझे लगता है कि मैं इसे कड़ी मेहनत कर सकता हूं लेकिन जब मैं दूसरी बार वापस आ जाता हूं तो मुझे यकीन है कि आईपी बदल जाएगा। बदलते आईपी को शामिल करने के लिए दोनों को गतिशील तरीके से कनेक्ट करने का कोई तरीका है? मेरे वर्तमान क्लाइंट कोड:

public void msg(string mesg) 
    { 
     lstProgress.Items.Add(">> " + mesg); 
    } 

    private void btnConnect_Click(object sender, EventArgs e) 
    { 
     string message = "Test"; 
     try 
     { 
      // Create a TcpClient. 
      // Note, for this client to work you need to have a TcpServer 
      // connected to the same address as specified by the server, port 
      // combination. 
      Int32 port = 1333; 
      TcpClient client = new TcpClient(<not sure>, port); //Unsure of IP to use. 

      // Translate the passed message into ASCII and store it as a Byte array. 
      Byte[] data = System.Text.Encoding.ASCII.GetBytes(message); 

      // Get a client stream for reading and writing. 
      // Stream stream = client.GetStream(); 

      NetworkStream stream = client.GetStream(); 

      // Send the message to the connected TcpServer. 
      stream.Write(data, 0, data.Length); 

      lstProgress.Items.Add(String.Format("Sent: {0}", message)); 

      // Receive the TcpServer.response. 

      // Buffer to store the response bytes. 
      data = new Byte[256]; 

      // String to store the response ASCII representation. 
      String responseData = String.Empty; 

      // Read the first batch of the TcpServer response bytes. 
      Int32 bytes = stream.Read(data, 0, data.Length); 
      responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); 
      lstProgress.Items.Add(String.Format("Received: {0}", responseData)); 

      // Close everything. 
      stream.Close(); 
      client.Close(); 
     } 
     catch (ArgumentNullException an) 
     { 
      lstProgress.Items.Add(String.Format("ArgumentNullException: {0}", an)); 
     } 
     catch (SocketException se) 
     { 
      lstProgress.Items.Add(String.Format("SocketException: {0}", se)); 
     } 
    } 

मेरे वर्तमान सर्वर कोड:

private void Prog_Load(object sender, EventArgs e) 
    { 
     bw.WorkerSupportsCancellation = true; 
     bw.WorkerReportsProgress = true; 
     bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
     bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 

     if (bw.IsBusy != true) 
     { 
      bw.RunWorkerAsync(); 
     } 
    } 

    private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     lstProgress.Items.Add(e.UserState); 
    } 

    private void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 

     if ((worker.CancellationPending == true)) 
     { 
      e.Cancel = true; 
     } 
     else 
     { 
      try 
      { 
       // Set the TcpListener on port 1333. 
       Int32 port = 1333; 
       //IPAddress localAddr = IPAddress.Parse("127.0.0.1"); 
       TcpListener server = new TcpListener(IPAddress.Any, port); 

       // Start listening for client requests. 
       server.Start(); 

       // Buffer for reading data 
       Byte[] bytes = new Byte[256]; 
       String data = null; 

       // Enter the listening loop. 
       while (true) 
       { 
        bw.ReportProgress(0, "Waiting for a connection... "); 
        // Perform a blocking call to accept requests. 
        // You could also user server.AcceptSocket() here. 
        TcpClient client = server.AcceptTcpClient(); 
        bw.ReportProgress(0, "Connected!"); 

        data = null; 

        // Get a stream object for reading and writing 
        NetworkStream stream = client.GetStream(); 

        int i; 

        // Loop to receive all the data sent by the client. 
        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) 
        { 
         // Translate data bytes to a ASCII string. 
         data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
         bw.ReportProgress(0, String.Format("Received: {0}", data)); 

         // Process the data sent by the client. 
         data = String.Format("I Have Received Your Message: {0}", data); 

         byte[] mssg = System.Text.Encoding.ASCII.GetBytes(data); 

         // Send back a response. 
         stream.Write(mssg, 0, mssg.Length); 
         bw.ReportProgress(0, String.Format("Sent: {0}", data)); 
        } 

        // Shutdown and end connection 
        client.Close(); 
       } 
      } 
      catch (SocketException se) 
      { 
       bw.ReportProgress(0, String.Format("SocketException: {0}", se)); 
      } 
     } 
    } 

आप शायद बता सकते हैं जैसा कि मैंने इस तो यह मैं की तुलना में अधिक रहा हूँ लागू करने के लिए एक बेहतर तरीका है तो करने के लिए एकदम नया हूँ सीखने में खुशी हुई! अग्रिम :) में किसी भी मदद के लिए धन्यवाद

नीचे जवाब मेरे समाधान धन्यवाद:

private String IPAddressCheck() 
    { 
     var IPAddr = Dns.GetHostEntry("HostName"); 
     IPAddress ipString = null; 

     foreach (var IP in IPAddr.AddressList) 
     { 
      if(IPAddress.TryParse(IP.ToString(), out ipString) && IP.AddressFamily == AddressFamily.InterNetwork) 
      { 
       break; 
      } 
     } 
     return ipString.ToString(); 
    } 

    private void btnConnect_Click(object sender, EventArgs e) 
    { 
     string message = "Test"; 
     try 
     { 
      Int32 port = 1337; 
      string IPAddr = IPAddressCheck(); 
      TcpClient client = new TcpClient(IPAddr, port); 

मुझे यकीन है कि अगर यह neatest समाधान है नहीं कर रहा हूँ, लेकिन यह अच्छी तरह से काम कर रहा है तो जवाब के लिए धन्यवाद :)

+1

यदि आप सामान्य कोड समीक्षा की तलाश में हैं, तो मैं इसके बजाय [CodeReview.SE] (http://codereview.stackexchange.com/) पर पोस्ट करने का सुझाव दूंगा।यदि आप किसी विशिष्ट प्रश्न का उत्तर ढूंढ रहे हैं ("क्या बदलते आईपी को शामिल करने के लिए दोनों को गतिशील तरीके से जोड़ने के लिए कोई तरीका है?"), आपको उस क्षेत्र को कोड को कम करना चाहिए जो आप हैं समस्याएं हैं – Bobson

+0

माफी बॉबसन मैं अपने कोड स्निपेट को भविष्य में कम और अधिक प्रासंगिक रखूंगा! सलाह के लिए धन्यवाद :) –

उत्तर

1

काफी सुनिश्चित नहीं हैं कि 'बदलते आईपी समाहित करने के लिए और अधिक गतिशील रास्ता' से क्या मतलब है।

TcpClient client = new TcpClient(<not sure>, port); //Unsure of IP to use. 

आप एक ही मशीन पर दोनों ग्राहक & सर्वर स्थानीय लूपबैक IP एड्रेस चलाने के लिए और उपयोग कर सकते हैं:

IPAddress.Parse("127.0.0.1") 

वे विभिन्न मशीनों पर चल रहे हैं शुरुआत जहां आप वर्तमान में है के लिए एक अनुमान ले रहा है सर्वर का उपयोग कर रहे किसी भी आईपी पते के साथ 127.0.0.1 को प्रतिस्थापित करें (यह रास्ते में कोई एनएटी या फ़ायरवॉल नहीं मानता है)।

आप IP पते का उपयोग करने के लिए आप हमेशा होस्ट नामों इस्तेमाल कर सकते हैं (ये माना जा सकता है और अधिक 'गतिशील'), लेकिन यह एक उपयुक्त कॉन्फ़िगर किया गया DNS सेटअप (स्थानीय सिस्टम के लिए) की आवश्यकता होगी नहीं करना चाहते हैं:

TcpClient client = new TcpClient("testMachine1", 1333); 

सॉकेट प्रोग्रामिंग सीखना बहुत अच्छा है। मैं एक नेटवर्क पुस्तकालय, networkcomms.net डेवलपर हूं, तो आप भी सीख अपने आप को इस wpf chat example चेकआउट कृपया के रूप में एक ही समय में एक काम उदाहरण से पीछे की ओर काम करना चाहते हैं चाहिए।

+0

बहुत धन्यवाद, जैसा कि मेरे संपादन में देखा गया है मैंने मेजबाननाम का उपयोग आईपी प्राप्त करने और उस पर इंगित करने के लिए किया है। सही दिशा में मुझे इंगित करने के लिए चीयर्स और मैं कुछ और सीखने के लिए निश्चित रूप से आपके कामकाजी उदाहरण पर एक नज़र डालेगा! –

1

आप कंप्यूटर आप तो आप System.Net.DNS साथ काफी आसानी से अपने आईपी पा सकते हैं कनेक्ट करना चाहते हैं का नाम जानते हैं।

var ip = System.Net.Dns.GetHostEntry("JacksLaptop"); 
string ipString = ip.AddressList[0].ToString(); 

आईपी आप उपयोग कर रहे हैं कि सरणी के स्थान 0 में एक नहीं हो सकता है इतना है कि के लिए बाहर देखने लगता है।

+0

आपकी मदद के लिए धन्यवाद मैंने आपके समाधान में भी आपकी सलाह का उपयोग किया, मुझे लगता है कि मैंने यह सुनिश्चित करने के लिए एक तरीका लागू किया है कि मुझे पता सूची से सही आईपी मिल जाए, आप मेरे संपादन में अपना प्रयास देख सकते हैं :) –