I am trying the a demo project from:
http://code.msdn.microsoft.com/Communication-through-91a2582b
I have made some small change in VS 2008. The server code is following:
using System;
using System.Drawing;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;
namespace TCP_Socket_Server
{
public partial class TCPSocketServer : Form
{
SocketPermission permission;
Socket sListener;
IPEndPoint ipEndPoint;
Socket handler;
private TextBox tbAux = new TextBox();
public TCPSocketServer()
{
InitializeComponent();
tbAux.TextChanged += tbAux_SelectionChanged;
button_ServerStart.Enabled = true;
button_Send.Enabled = false;
button_Disconnect.Enabled = false;
textBox_MessageReceived.Enabled = false;
textBox_Message2Client.Enabled = false;
}
private void tbAux_SelectionChanged(object sender, EventArgs e)
{
BeginInvoke((ThreadStart)delegate()
{
textBox_MessageReceived.Text = tbAux.Text;
label_MessageReceived.Text = "Received Message(" + (2*tbAux.Text.Length).ToString() +"Byte)";
}
);
}
private void button_ServerStart_Click(object sender, EventArgs e)
{
int servPort = (textBox_Port.Text.Length != 0) ? Int32.Parse(textBox_Port.Text) : 8821;
try
{
permission = new SocketPermission(NetworkAccess.Accept, TransportType.Tcp, "", servPort );
sListener = null;
permission.Demand();
IPHostEntry ipHost = Dns.GetHostEntry("");
IPAddress ipAddr = ipHost.AddressList[0];
ipEndPoint = new IPEndPoint(ipAddr, servPort);
sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp );
sListener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
sListener.Bind(ipEndPoint);
label_ServerState.Text = "Server Started:" + ipEndPoint.Address + ":" + ipEndPoint.Port;;
label_ServerState.ForeColor = Color.Blue;
button_Send.Enabled = true;
button_Disconnect.Enabled = true;
textBox_MessageReceived.Enabled = true;
textBox_Message2Client.Enabled = true;
sListener.Listen(10);
AsyncCallback aCallback = new AsyncCallback(AcceptCallback);
sListener.BeginAccept(aCallback, sListener);
button_ServerStart.Enabled = false;
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
public void AcceptCallback(IAsyncResult ar)
{
Socket listener = null;
Socket handler = null;
try
{
byte[] buffer = new byte[1024];
listener = (Socket)ar.AsyncState;
handler = listener.EndAccept(ar);
handler.NoDelay = false;
object[] obj = new object[2];
obj[0] = buffer;
obj[1] = handler;
handler.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), obj);
AsyncCallback aCallback = new AsyncCallback(AcceptCallback);
listener.BeginAccept(aCallback, listener);
}
catch (Exception exc) { MessageBox.Show(exc.ToString()); }
}
public void ReceiveCallback(IAsyncResult ar)
{
try
{
object[] obj = new object[2];
obj = (object[]) ar.AsyncState;
byte[] buffer = (byte[]) obj[0];
handler = (Socket) obj[1];
string content = string.Empty;
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
content += Encoding.Unicode.GetString(buffer, 0, bytesRead);
if (content.IndexOf("<Client Quit>") > -1)
{
string str = content.Substring(0, content.LastIndexOf("<Client Quit>"));
}
else
{
byte[] buffernew = new byte[1024];
obj[0] = buffernew;
obj[1] = handler;
handler.BeginReceive(buffernew, 0, buffernew.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), obj);
}
BeginInvoke((ThreadStart)delegate()
{
tbAux.Text = content.Replace(@"<Client Quit>", "");
});
}
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
private void button_Send_Click(object sender, EventArgs e)
{
try
{
string str = textBox_Message2Client.Text + @"<Server Quit>";
byte[] byteData =Encoding.Unicode.GetBytes(str);
handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler);
label_Message2Client.Text = "Message Sent by Server(" + (byteData.Length - 26).ToString() + "Byte)";
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
public void SendCallback(IAsyncResult ar)
{
try
{
Socket handler = (Socket)ar.AsyncState;
}
catch (Exception exc) { MessageBox.Show(exc.ToString()); }
}
private void button_Disconnect_Click(object sender, EventArgs e)
{
try
{
if (sListener.Connected)
{
sListener.Shutdown(SocketShutdown.Both);
sListener.Close();
}
button_ServerStart.Enabled = true;
button_Send.Enabled = false;
button_Disconnect.Enabled = false;
label_Message2Client.Text = "Message to Client" ;
label_MessageReceived.Text = "Received Message";
textBox_MessageReceived.Text = string.Empty;
textBox_MessageReceived.Enabled = false;
textBox_Message2Client.Text = string.Empty;
textBox_Message2Client.Enabled = false;
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
}
}
The client code is:
using System;
using System.Drawing;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;
namespace TCP_Socket_Client
{
public partial class TCPSocketClient : Form
{
byte[] bytes = new byte[1024];
Socket senderSock;
private TextBox tbAux = new TextBox();
public TCPSocketClient()
{
InitializeComponent();
tbAux.TextChanged += tbAux_SelectionChanged;
ipAddressControl_Server.Focus();
button_Send.Enabled = false;
button_Disconnect.Enabled = false;
textBox_Message2Send.Enabled = false;
textBox_MessageReceived.Enabled = false;
}
private void tbAux_SelectionChanged(object sender, EventArgs e)
{
BeginInvoke((ThreadStart)delegate()
{
textBox_MessageReceived.Text = tbAux.Text;
label_MessageReceived.Text = "Message from Server(" + (2 * tbAux.Text.Length).ToString() + "Byte)";
}
);
}
private void button_Connect2Server_Click(object sender, EventArgs e)
{
int servPort = (textBox_Port.Text.Length != 0) ? Int32.Parse(textBox_Port.Text) : 8821;
try
{
SocketPermission permission = new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, ipAddressControl_Server.Text, servPort);
permission.Demand();
IPAddress ipAddr = IPAddress.Parse(ipAddressControl_Server.Text);
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, servPort);
senderSock = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
senderSock.NoDelay = false;
senderSock.Connect(ipEndPoint);
label_ConnectionState.Text = "Already Connectted to" + senderSock.RemoteEndPoint;
label_ConnectionState.ForeColor = Color.Blue;
button_Connect2Server.Enabled = false;
button_Send.Enabled = true;
button_Disconnect.Enabled = true;
textBox_Message2Send.Enabled = true;
textBox_MessageReceived.Enabled = true;
new Thread(new ThreadStart(delegate{ReceiveDataFromServer();})).Start();
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
private void button_Send_Click(object sender, EventArgs e)
{
try
{
string theMessageToSend = textBox_Message2Send.Text;
byte[] msg = Encoding.Unicode.GetBytes(theMessageToSend + @"<Client Quit>");
int bytesSend = senderSock.Send(msg) - 26;
label_Message2Server.Text = "Message to Server(" + bytesSend.ToString() + "Byte)";
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
private void ReceiveDataFromServer()
{
try
{
int bytesRec = senderSock.Receive(bytes);
String theMessageToReceive = Encoding.Unicode.GetString(bytes, 0, bytesRec);
while (senderSock.Available > 0)
{
bytesRec = senderSock.Receive(bytes);
theMessageToReceive += Encoding.Unicode.GetString(bytes, 0, bytesRec);
}
tbAux.Text = theMessageToReceive.Replace(@"<Server Quit>", "");
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
private void button_Disconnect_Click(object sender, EventArgs e)
{
try
{
senderSock.Shutdown(SocketShutdown.Both);
senderSock.Close();
button_Connect2Server.Enabled = true;
button_Send.Enabled = false;
button_Disconnect.Enabled = false;
label_ConnectionState.Text = "No Connection to Server";
label_ConnectionState.ForeColor = Color.Red;
textBox_Message2Send.Enabled = false;
textBox_Message2Send.Text = string.Empty;
textBox_MessageReceived.Enabled = false;
textBox_MessageReceived.Text = string.Empty;
label_Message2Server.Text = "Message to Server";
label_MessageReceived.Text = "Message from Server";
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
}
}
Now, I have two problems. One is that each time after it's start and a first message was sent from the client, the server shows it, but if aniother message was sent then, the server shows the first not the second message. So does the client. The other is that when the server close the connection, the client still shows a connectted already state. Thanks for any suggestion。