2 computers cross-over cable connection
start client 1
get server @ from server screen
client 1 connect to server
client 1 send to server
client 1 get reply from server
while client 1 still alive, client 2 talk to server
client 2 gets no reply
while client 1,2 online, client 3 connects to server
client 4 joins with other clients
client 4 doesn't get reply immediately
client 1 disconnected
server reply to client 2
client 2 finishes
client 3 receive from server and leaves
client 4 gets message
client 4 quit
server show local addresses
server receive call from 4 client, handle them 1 by 1.
client 1 gone, server has time with 2nd client
client 2 gone, server tackle with client 3
most clients are gone, deal with the last one
everybody left, waiting for new client
computers connect via router by cable or wifi
start client
ping server
no data lose
start server
server call back
communication successful, next client
//tcpserver async
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace server_async
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
string strHostName = System.Net.Dns.GetHostName();
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
richTextBox1.AppendText("local server address\n");
foreach (IPAddress x in ipHostInfo.AddressList)
{
richTextBox1.AppendText(x.ToString()+"\n");
}
server = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
server.Bind(iep);
server.Listen(5);
server.BeginAccept(new AsyncCallback(AcceptConn), server);
}
public delegate void callrichtext(String ss);
public callrichtext myDelegate;
public void richtextappend(String s)
{
richTextBox1.AppendText(s);
}
public delegate void callrichtext1(String ss);
public callrichtext1 myDelegate1;
public void richtextappend1(String s)
{
richTextBox2.AppendText(s);
}
private Socket server, oldclient;
private byte[] data = new byte[1024];
private int size = 1024;
private void AcceptConn(IAsyncResult iar)
{
Socket oldserver = (Socket)iar.AsyncState;
oldclient = oldserver.EndAccept(iar);
richTextBox1.Invoke(this.myDelegate, new Object[] { "Connected to: " + oldclient.RemoteEndPoint.ToString() + "\n" });
string stringData = "Welcome to my server";
byte[] message1 = Encoding.ASCII.GetBytes(stringData);
oldclient.BeginSend(message1, 0, message1.Length, SocketFlags.None,
new AsyncCallback(SendData), oldclient);
}
private void SendData(IAsyncResult iar)
{
Socket client = (Socket)iar.AsyncState;
int sent = client.EndSend(iar);
client.BeginReceive(data, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), client);
}
private void ReceiveData(IAsyncResult iar)
{
Socket client = (Socket)iar.AsyncState;
int recv = client.EndReceive(iar);
//MessageBox.Show(recv.ToString());
if (recv == 0)
{
client.Close();
richTextBox1.Invoke(this.myDelegate, new Object[]{ "Waiting for client..."+"\n"});
server.BeginAccept(new AsyncCallback(AcceptConn), server);
return;
}
string receivedData = Encoding.ASCII.GetString(data, 0, recv);
richTextBox2.Invoke(this.myDelegate1, new Object[] {receivedData + "\n"});
byte[] message2 = Encoding.ASCII.GetBytes(receivedData);
client.BeginSend(message2, 0, message2.Length, SocketFlags.None,
new AsyncCallback(SendData), client);
}
private void Form1_Load(object sender, EventArgs e)
{
this.myDelegate = new callrichtext(richtextappend);
this.myDelegate1 = new callrichtext1(richtextappend1);
}
}
}
----------------------------------------------------------------------------
//tcpclient async
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace tcpclient_async
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
string strHostName = System.Net.Dns.GetHostName();
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress x in ipHostInfo.AddressList)
{
comboBox1.Items.Add (x.ToString());
}
}
public delegate void callrichtext(String ss);
public callrichtext myDelegate;
public void richtextappend(String s)
{
richTextBox1.AppendText(s);
}
public delegate void callrichtext1(String ss);
public callrichtext1 myDelegate1;
public void richtextappend1(String s)
{
richTextBox2.AppendText(s);
}
public delegate void callrichtext2(String ss);
public callrichtext2 myDelegate2;
public void richtextappend2(String s)
{
richTextBox3.AppendText(s);
}
public delegate void buttonenable();
public buttonenable myDelegate3;
public void button()
{
button2.Enabled=true;
}
private Socket client;
private byte[] data = new byte[1024];
private int size = 1024;
private void Form1_Load(object sender, EventArgs e)
{
this.myDelegate = new callrichtext(richtextappend);
this.myDelegate1 = new callrichtext1(richtextappend1);
this.myDelegate2 = new callrichtext2(richtextappend2);
this.myDelegate3 = new buttonenable(button);
}
private void button1_Click(object sender, EventArgs e)
{
richTextBox3.AppendText( "Connecting... \n");
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(textBox1.Text), 9050);
newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
}
private void button2_Click(object sender, EventArgs e)
{
byte[] message = Encoding.ASCII.GetBytes(richTextBox2.Text);
richTextBox2.Clear();
client.BeginSend(message, 0, message.Length, SocketFlags.None,
new AsyncCallback(SendData), client);
}
private void button3_Click(object sender, EventArgs e)
{
client.Close();
richTextBox3.AppendText ("Disconnected \n");
}
private void Connected(IAsyncResult iar)
{
client = (Socket)iar.AsyncState;
try
{
client.EndConnect(iar);
richTextBox3.Invoke(this.myDelegate2, new Object[] { "Connected to: " + client.RemoteEndPoint.ToString() +"\n"});
client.BeginReceive(data, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), client);
button2.Invoke(this.myDelegate3, new Object[] { });
}
catch (SocketException)
{
richTextBox3.Invoke(this.myDelegate2, new Object[] { "Error connecting \n"});
}
}
private void ReceiveData(IAsyncResult iar)
{
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceive(iar);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
richTextBox1.Invoke(this.myDelegate, new Object[]{stringData+"\n"});
}
private void SendData(IAsyncResult iar)
{
Socket remote = (Socket)iar.AsyncState;
int sent = remote.EndSend(iar);
remote.BeginReceive(data, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), remote);
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
textBox1.Text = comboBox1.SelectedItem.ToString();
}
}
}
Async Tcp background:
http://www.codeguru.com/csharp/csharp/cs_misc/sampleprograms/article.php/c7695/Asynchronous-Socket-Programming-in-C-Part-I.htm
reference:
http://forums.codeguru.com/showthread.php?509248-How-to-run-a-very-long-SQL-statement
http://msdn.microsoft.com/en-us/library/5w7b7x5f(v=vs.110).aspx
http://www.java2s.com/Code/CSharp/Network/AsyncTcpServer.htm
http://www.java2s.com/Code/CSharp/Network/AsyncTcpClient.htm