Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[C#]NetworkStream i socketi

[es] :: .NET :: [C#]NetworkStream i socketi

[ Pregleda: 982 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Marko Medojević
Team leader
Digital ST
Beograd

Član broj: 93659
Poruke: 776
*.adsl-a-1.sezampro.yu.

Sajt: www.digitalst.rs


+99 Profil

icon [C#]NetworkStream i socketi21.01.2009. u 16:28 - pre 187 meseci
Ćao!

Imam jednu klijent i server aplikaciju. Klijent ima dugme za konektovanje, dugme za slanje i tekst boks. On se povezuje na server i šalje mu string. Server ima rich tekst boks i u njega prihvata string.
Slanje stringova radi kako treba, međutim javlja se problem kada hoću da diskonektujem klijent sa servera. Ne znam kako zatvorim soket na strani klijenta a da server detektuje da sam to u radio! Probao sam u okviru klijenta da pozovem metode "glavniSoket.Disconnect(false);" ili "glavniSoket.Close();", ali kada u okviru servera izvrsim "komunikacioniSoket.Connected;" dobijam i dalje "true". Jedino sto mi se prilikom diskonektovanja na strani klijenta procesor zakuca na 100%.

Kod klijenta:
Code:

Socket glavniSoket;

public Form1()
{
     InitializeComponent();
}

private void btnConnect_Click(object sender, EventArgs e)
{
     IPEndPoint destinacija = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8221);
     glavniSoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     glavniSoket.Connect(destinacija);
}

private void btnSalji_Click(object sender, EventArgs e)
{
     NetworkStream ns = new NetworkStream(glavniSoket);
     byte[] komandaBuffer = Encoding.Unicode.GetBytes(textBox1.Text);
     byte[] buffer = new byte[4];
     buffer = BitConverter.GetBytes(komandaBuffer.Length);
     ns.Write(buffer, 0, 4);
     ns.Flush();
     ns.Write(komandaBuffer, 0, komandaBuffer.Length);
     ns.Flush();
     ns.Close();
}


private void btnDisconnect_Click(object sender, EventArgs e)
{
     glavniSoket.Disconnect(false);
}


Kod servera:
Code:

int readBytes;
int senderNameSize;
string senderName;
byte[] buffer;
Socket glavniSoket;
Socket komunikacioniSoket;

public Form1()
{
     InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
     IPEndPoint destinacija = new IPEndPoint(IPAddress.Any, 8221);
     glavniSoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     glavniSoket.Bind(destinacija);
     glavniSoket.Listen(10);
     komunikacioniSoket = glavniSoket.Accept();

     primanje();
}

public void primanje()
{
     richTextBox1.Text += komunikacioniSoket.Connected;
     NetworkStream networkStream = new NetworkStream(komunikacioniSoket);
     buffer = new byte[4];
     IAsyncResult rezultat = networkStream.BeginRead(buffer, 0, 4, new AsyncCallback(completeReadLength), networkStream);
}

public void completeReadLength(IAsyncResult rezultat)
{
     NetworkStream networkStream = (NetworkStream)rezultat.AsyncState;
     readBytes = networkStream.EndRead(rezultat);
     senderNameSize = BitConverter.ToInt32(buffer, 0);


     buffer = new byte[senderNameSize];
     rezultat = networkStream.BeginRead(buffer, 0, senderNameSize, new AsyncCallback(completeReadString), networkStream);
}

public void completeReadString(IAsyncResult rezultat)
{
     NetworkStream networkStream = (NetworkStream)rezultat.AsyncState;

     readBytes = networkStream.EndRead(rezultat);
     senderName = System.Text.Encoding.Unicode.GetString(buffer);
     richTextBox1.Text = senderName;

     networkStream.Close();

     primanje();
}


 
Odgovor na temu

[es] :: .NET :: [C#]NetworkStream i socketi

[ Pregleda: 982 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.