Sorry für die späte Antwort Jungs,
Hier ist der Code. Es gibt 2 Projekte. Einer von ihnen ist Server und der andere ist Client. Es gibt 2 Klassen im Serverprojekt.
Klassen;
class Listener
{
private Socket _socket;
public bool Listening { get; private set; }
public int Port { get; private set; }
public Listener(int port)
{
Port = port;
_socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
}
public void Start()
{
if (Listening)
{
return;
}
_socket.Bind(new IPEndPoint(0,Port));
_socket.Listen(0);
_socket.BeginAccept(callback, null);
Listening = true;
}
public void Stop()
{
if (!Listening)
{
return;
}
_socket.Close();
_socket.Dispose();
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
void callback(IAsyncResult ar)
{
try
{
Socket socket = this._socket.EndAccept(ar);
if (SocketAccepted!=null)
{
SocketAccepted(socket);
}
this._socket.BeginAccept(callback, null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public delegate void SocketAcceptedHandler(Socket e);
public event SocketAcceptedHandler SocketAccepted;
}
class Client
{
public string ID { get; private set; }
public IPEndPoint EndPoint { get; private set; }
private 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)
{
//MessageBox.Show(ex.Message);
sck.Close();
if (Disconnected!=null)
{
Disconnected(this);
}
}
}
public void Close()
{
sck.Close();
sck.Dispose();
}
public delegate void ClientReceivedHandler(Client sender, byte[] data);
public delegate void ClientDiscconnectedHandler(Client sender);
public event ClientReceivedHandler Received;
public event ClientDiscconnectedHandler Disconnected;
}
Server Projekt Haupt Form:
Server Application
public partial class Main : Form
{
private static Listener _listener;
public Main()
{
InitializeComponent();
_listener = new Listener(8);
_listener.SocketAccepted += new Listener.SocketAcceptedHandler(_listenerSocketAccepted);
_listener.Start();
}
private void _listenerSocketAccepted(Socket e)
{
Client client = new Client(e);
client.Received += new Client.ClientReceivedHandler(client_Received);
client.Disconnected += new Client.ClientDiscconnectedHandler(client_Disconnected);
Invoke((MethodInvoker)delegate
{
ListViewItem i=new ListViewItem();
i.Text = client.EndPoint.ToString();
i.SubItems.Add(client.ID);
i.SubItems.Add("XXX");
i.SubItems.Add("XXX");
i.Tag = client;
listViewClients.Items.Add(i);
//textBox1.Text = "New Connection : " + e.RemoteEndPoint + " Time : " + DateTime.Now;
});
}
private void client_Disconnected(Client sender)
{
Invoke((MethodInvoker)delegate
{
for (int i = 0; i < listViewClients.Items.Count; i++)
{
Client client=listViewClients.Items[i].Tag as Client;
if (client.ID==sender.ID)
{
listViewClients.Items.RemoveAt(i);
break;
}
}
});
}
private void client_Received(Client sender, byte[] data)
{
Invoke((MethodInvoker)delegate
{
for (int i = 0; i < listViewClients.Items.Count; i++)
{
Client client = listViewClients.Items[i].Tag as Client;
if (client.ID == sender.ID)
{
listViewClients.Items[i].SubItems[2].Text = Encoding.Default.GetString(data);
listViewClients.Items[i].SubItems[3].Text = DateTime.Now.ToString();
break;
}
}
});
}
private void Main_Load(object sender, EventArgs e)
{
}
}
Client Side Haupt Form:
Client Application
public partial class Main : Form
{
Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public Main()
{
InitializeComponent();
}
private void btnConnect_Click(object sender, EventArgs e)
{
sck.Connect("127.0.0.1", 8);
MessageBox.Show("Connected");
}
private void btnSend_Click(object sender, EventArgs e)
{
int s = sck.Send(Encoding.Default.GetBytes(txtMsg.Text));
if (s>0)
{
MessageBox.Show("Message Sent..");
}
}
private void btnClose_Click(object sender, EventArgs e)
{
sck.Close();
sck.Dispose();
Close();
}
private void Main_Load(object sender, EventArgs e)
{
//lis
}
}
Ich habe 2 Fragen.
1- Wie kann ich Daten in sql vom Client eingeben?
2- Der Listeneintrag flackert und verschwindet nicht, wenn ich meine Client-App mit btnClose schließe.
TCP-Sockets haben eine maximale Datagramgröße von etwa 1500 Byte. Größere Nachrichten werden in mehrere Datagramme aufgeteilt. Um also Daten in der Datenbank zu speichern, muss das Byte-Array vom Client Blöcke enthalten, damit Sie die Daten in kleinere Teile zerlegen können. Zum Beispiel, wenn Sie vom Kunden 100 Bankkonten erhielten, würde am Ende jedes Bankkontos ein Unterbrechungszeichen haben. Dann könnte der Server jedes Bankkonto einzeln auf dem SQL Server speichern. Oder Sie senden einfach nur ein Bankkonto, sodass der Kunde die 100 Bankkonten nicht in einzelne Konten aufteilen muss. – jdweng
Okan, bitte Code Beispiel hinzufügen. Es ist momentan nicht klar, wie du das machst und was du eigentlich willst. – cassandrad