Gå til innhold

Anbefalte innlegg

Har nå sett på en artikkel som forklarer litt om hvordan du lager et instant messenger program(som du forøvrig kan finne her: http://www.informit.com/articles/article.a...2&seqNum=1), men støter på et uventet problem.

Dette er eksempelkoden som forfatteren bruker(har gjort noen minimale forandringer, men tror ikke det vil ha noe å si):

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.ComponentModel;

namespace ChatExample
{
   public partial class Form1 : Form
   {
       public delegate void Invoker(String t);
       private Thread thdListener;
       private TcpListener objListener;
       private TcpClient objClient;

       private Button btSend = new Button();
       private RichTextBox rtbMessage = new RichTextBox();
       private RichTextBox rtbType = new RichTextBox();
       private string strFriend;
       private string strMe;
       public Form1()
       {
           InitializeComponent();
           strFriend = "192.168.0.2";//IP addressen til min laptop
           strMe = "Velena";
           thdListener = new Thread(new ThreadStart(this.Listen));
           thdListener.Start();
           rtbMessage.Dock = DockStyle.Top;
           rtbMessage.Size = new Size(300, 200);
           rtbType.Location = new Point(0, 205);
           rtbType.Size = new Size(240, 65);
           btSend.Text = "Send";
           btSend.Click += new EventHandler(this.SendText);
           btSend.Size = new Size(50, 50);
           btSend.Location = new Point(240, 205);
           this.Text = ".NET IM";
           this.Size = new Size(300, 300);
           this.Closing += new CancelEventHandler(this.CloseMe);
           this.Controls.Add(btSend);
           this.Controls.Add(rtbMessage);
           this.Controls.Add(rtbType);
       }
       private void SendText(Object Sender, EventArgs e)
       {
           rtbMessage.Text += strMe + ": " + rtbType.Text +
      "\n";
           objClient = new TcpClient(strFriend, 1000);
           StreamWriter w = new StreamWriter(objClient.GetStream());
           w.Write(rtbType.Text + "\n");
           w.Flush();
           objClient.Close();
           rtbType.Text = "";
       }
       private void Listen()
       {
           string strTemp = "";
           objListener = new TcpListener(1000);
           objListener.Start();
           do
           {
               TcpClient objClient = objListener.AcceptTcpClient();
               StreamReader objReader = new StreamReader(objClient.GetStream());
               while (objReader.Peek() != -1)
               {
                   strTemp += Convert.ToChar(objReader.Read()).ToString();
               }
               object[] objParams = new object[] { strTemp };
               strTemp = "";
               this.Invoke(new Invoker(this.ShowMessage), objParams);
           } while (true != false);
       }
       private void ShowMessage(String t)
       {
           rtbMessage.Text += strFriend + ": " + t + "\n";
       }
       private void CloseMe(Object Sender, CancelEventArgs e)
       {
           objListener.Stop();
       }
   }
}

//fant forresten IPen min med denne koden:
String hostName = Dns.GetHostName();
IPHostEntry ipEntry = Dns.GetHostByName(hostName); 
IPAddress[] addr = ipEntry.AddressList;
string theIP= addr[0].ToString();

Det som skjer når jeg bruker denne koden til å sende en melding til laptoppen min (laptoppen er selvsagt på, med det samme programmet kjørende) er helt enkelt at programmet låser seg. Artikkelen nevnte at dette kunne skje hvis AcceptTcpClient aldri mottar noen melding, men sa at dette ikke ville være noe problem hvis denne delen av koden kjørte i en annen thread enn mainthreaden, noe som får meg til å utelukke at det er det som skjer. Er det noen som kan hjelpe?

Edit: En ting som kan være interressant er at programmet fungerer helt fint hvis jeg endrer IPen til min egen og sender meldinger til den samme datamskinen som programmet kjører på.

Endret av Velena
Lenke til kommentar
Videoannonse
Annonse

Kanskje jeg bare forvirrer deg mer nå, men jeg synes denne koden gjør ting litt feil, så jeg skrev en annen IM klient.

 

Skriv /connect [iP addresse eller navn] for å koble til en maskin, /name setter et navn foran teksten din.

 

Koden bruker to tråder, en som lytter etter tilkoblinger, og en som lytter etter om noen sier noe.

 

IM.zip

IM_bin.zip

Lenke til kommentar

Takker så mye GeirGrusom, skal se hva jeg kan lære fra koden ^^.

Edit: Når jeg prøver å skape en forbindelse mellom datamskinene, får jeg en SocketException =/.

Feilmelding lyder: Unable to connect to 192.168.0.2: Et tilkoblingsforsøk mislyktes fordi den tilkoblede parten ikke svarte på riktig måte etter en tidsperiode, eller den etablerte tilkoblingen mislyktes fordi den tilkoblede verten ikke svarte 192.168.0.2:4321

Hva kommer dette av? Har det noe å si at laptoppen er tilkoblet via router?

Endret av Velena
Lenke til kommentar

Bruker Avast On-Access protection, har prøvd å skru den av mens jeg prøver å koble til. Fikk akkurat det samme resultatet.

Edit: Har nå prøvd med Windows brannmuren av også, noe som ikke hjalp.

Endret av Velena
Lenke til kommentar

Kan det ha noe å si at laptoppen min bruker Vista? (Har opplevd noen problemer ang. kompabilitet med vista tidligere).

 

 

Edit: Tror jeg fant det ut, min laptop bruker et trådløst nettverk, må jeg ikke da forwarde porten som programmet bruker for at den skal kunne kommunisere?

Endret av Velena
Lenke til kommentar

Nei, du skal ikke trenge å forewarde porter innenfor eget nettverk; det er kun dersom noen prøver å nå deg fra et annet nettverk (for eksempel internett)

 

Du må bare passe på at programmets port er åpen på maskinen din, og at ingen andre programmer bruker den samme porten.

Lenke til kommentar

Er det mulig for meg å forwarde en port til en router som jeg ikke har eierskap til? (Bruker naboens nettverk). Dette burde vel ikke skape problemer for naboen så lenge jeg velger en usannsynlig port?

Endret av Velena
Lenke til kommentar

Har tenkt over dette litt, og det virker upraktisk å måtte forwarde en port for hvert nettverk dette programmet skal kobles til. MSN fungerer jo uten at du må forwarde noe som helst på forhånd, hvordan har de som programmerte det programmet løst det?

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...