z pewną pomocą stworzyłem program serwer-klient mogący obslugiwać kilka połączeń. Teraz próbując dodać do niego opcję wysyłania wiadomości z serwera wciąż coś sie sypie/ie gra... jak to obsłużyc? Czas mnie goni coraz bardziej, a wciąż nie mogę sobie z tym niby banalnym problemem poradzić. Jest źle, pomocy!;)
mój działający jeszcze kod:
main:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace SilentMultiConnectionS
{
public partial class Main1 : Form
{
listener listener;
public Main1()
{
InitializeComponent();
listener = new listener(8);
listener.SocketAccepted += new SilentMultiConnectionS.listener.SocketAcceptedHanler(listener_SocketAccepted);
Load += new EventHandler(Main1_Load);
}
void Main1_Load(object sender, EventArgs e)
{
listener.Start();
}
void listener_SocketAccepted(System.Net.Sockets.Socket e)
{
Client client = new Client(e);
client.Received += new Client.ClientReceivedHandler(client_Received);
client.Disconnected += new Client.ClientDisconnectedHandler(client_Disconnected);
Invoke((MethodInvoker)delegate
{
ListViewItem i = new ListViewItem();
i.Text = client.EndPoint.ToString();
i.SubItems.Add(client.ID);
i.SubItems.Add("XX");
i.SubItems.Add("CC");
i.Tag = client;
listView1.Items.Add(i);
});
}
void client_Disconnected(Client sender)
{
Invoke((MethodInvoker)delegate
{
for (int i = 0; i < listView1.Items.Count; i++)
{
Client client = listView1.Items[i].Tag as Client;
if (client.ID == sender.ID)
{
listView1.Items.RemoveAt(i);
break;
}
}
});
}
void client_Received(Client sender, byte[] data)
{
Invoke((MethodInvoker)delegate
{
for (int i = 0; i < listView1.Items.Count; i++)
{
Client client = listView1.Items[i].Tag as Client;
if (client.ID == sender.ID)
{
listView1.Items[i].SubItems[2].Text = Encoding.Default.GetString(data);
listView1.Items[i].SubItems[3].Text = DateTime.Now.ToString();
break;
}
}
});
}
private void btnWyslij_Click(object sender, EventArgs e)
{
}
}
}
klasa client:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SilentMultiConnectionS
{
class Client
{
public string ID
{
get;
private set;
}
public IPEndPoint EndPoint
{
get;
private set;
}
Socket sck;
public Client(Socket accepted)
{
sck = accepted;
ID = Guid.NewGuid().ToString();
EndPoint = (IPEndPoint)sck.RemoteEndPoint;
sck.BeginReceive(new byte[] {0}, 0, 0, 0, callback, null);
}
void callback(IAsyncResult ar)
{
try
{
sck.EndReceive(ar);
byte[] buf= new byte[8192];
int rec = sck.Receive(buf, buf.Length, 0);
if (rec < buf.Length)
{
Array.Resize<byte>(ref buf, rec);
}
if (Received != null)
{
Received(this, buf);
}
sck.BeginReceive(new byte[] { 0 }, 0, 0, 0, callback, null);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Close();
if (Disconnected != null)
{
Disconnected(this);
}
}
}
public void Close()
{
sck.Close();
sck.Dispose();
}
public delegate void ClientReceivedHandler(Client sender, byte[] data);
public delegate void ClientDisconnectedHandler(Client sender);
public event ClientReceivedHandler Received;
public event ClientDisconnectedHandler Disconnected;
}
}
klasa listener:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SilentMultiConnectionS
{
class listener
{
Socket s;
public bool Listening
{
get;
private set;
}
public int Port
{
get;
private set;
}
public listener(int port)
{
Port = port;
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
public void Start()
{
if(Listening)
return;
s.Bind(new IPEndPoint(0,Port));
s.Listen(0);
s.BeginAccept(callback, null);
Listening = true;
}
public void Stop()
{
if(!Listening)
return;
s.Close();
s.Dispose();
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
void callback(IAsyncResult ar)
{
try
{
Socket s = this.s.EndAccept(ar);
if (SocketAccepted != null)
{
SocketAccepted(s);
}
this.s.BeginAccept(callback, null);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public delegate void SocketAcceptedHanler(Socket e);
public event SocketAcceptedHanler SocketAccepted;
}
}