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);
}
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();
}
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();
}