用C#写的一个简单的Socket 在.net中的应用程序:实现效果如上:客户端发送一条消息,服务器端回应一条消息。这样更能随时知道消息发送出去是否被接收到.
实现的方法主要是用的.net同步Socket ,和线程技术。
服务器:
1) 定义一个Socket 用于监听:
private Socket Listener;
Listener
=
new
Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint BindIp = new IPEndPoint(IPAddress.Parse(IP), int .Parse(txtPort.Text));
Listener.Bind(BindIp);
Listener.Listen( 100 );
btnListen.Text = " Listening " ;
staticTool.Text = " 正在监听 " ;
IsListen = true ;
2) 启动一个线程用于接受客户端Socket的连接
IPEndPoint BindIp = new IPEndPoint(IPAddress.Parse(IP), int .Parse(txtPort.Text));
Listener.Bind(BindIp);
Listener.Listen( 100 );
btnListen.Text = " Listening " ;
staticTool.Text = " 正在监听 " ;
IsListen = true ;
Thread acceptThread
=
new
Thread(
new
ThreadStart(AcceptWorkThread));
acceptThread.Start();
acceptThread.Start();
private void AcceptWorkThread()
{
try
{
Thread.CurrentThread.IsBackground = true;
while (IsListen)
{
Socket accept = Listener.Accept();
IPEndPoint remoEP = (IPEndPoint)accept.RemoteEndPoint;
recString = "接收到来自" + remoEP.Address.ToString() + "的连接。";
accept.Send(Encoding.Default.GetBytes("服务器收到连接"));
this.Invoke(new EventHandler(ReceiveData), new string[] { recString });
Thread receiveThread = new Thread(new ParameterizedThreadStart(ReceiveWorkThread));
receiveThread.Start(accept);
}
}
catch (SocketException ex)
{
MessageBox.Show(ex.Message);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private
void
ReceiveWorkThread(
object
obj)
{
Socket socket = (Socket)obj ;
byte[] buffer = new byte[1024];
string strSend;
while (IsListen)
{
int receiveCount = socket.Receive(buffer);
if (receiveCount > 0)
{
IPEndPoint remoEP = (IPEndPoint)socket.RemoteEndPoint;
recString = "来自客户端" + remoEP.Address.ToString() + "的消息:" + Encoding.Default.GetString(buffer, 0, receiveCount);
this.Invoke(new EventHandler(ReceiveData), new string[] { recString });
strSend = "服务器端已收到:" + Encoding.Default.GetString(buffer,0,receiveCount);
//socket.Send(buffer, receiveCount, SocketFlags.None);
buffer = Encoding.Default .GetBytes(strSend);
socket.Send(buffer);
}
else
{
socket.Close();
break;
}
}
4) 将接收到的数据显示出来,利用了委托定义了一个事件,因为在别的线程中是无法调用界面控件的。
{
Socket socket = (Socket)obj ;
byte[] buffer = new byte[1024];
string strSend;
while (IsListen)
{
int receiveCount = socket.Receive(buffer);
if (receiveCount > 0)
{
IPEndPoint remoEP = (IPEndPoint)socket.RemoteEndPoint;
recString = "来自客户端" + remoEP.Address.ToString() + "的消息:" + Encoding.Default.GetString(buffer, 0, receiveCount);
this.Invoke(new EventHandler(ReceiveData), new string[] { recString });
strSend = "服务器端已收到:" + Encoding.Default.GetString(buffer,0,receiveCount);
//socket.Send(buffer, receiveCount, SocketFlags.None);
buffer = Encoding.Default .GetBytes(strSend);
socket.Send(buffer);
}
else
{
socket.Close();
break;
}
}
private void ReceiveData( object sender,EventArgs e )
{
if (recString.Length > 0)
{
this.listBox1.Items.Insert (0,recString);
}
}
再来实现客户端,客户端要实现的主要有:
1)建立Socket,连接到服务端,创建线程接受数据,向发送数据。
Socket ClientSocket
=
null
;
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ClientSocket.Connect(IPAddress.Parse(txtIP.Text), int .Parse(txtPort .Text ));
new Thread( new ParameterizedThreadStart(ReceiveThread)).Start ();
private void ReceiveThread( object obj)
{
while (true)
{
byte[] buffer = new byte[1024];
int receiveLen = ClientSocket.Receive(buffer);
if (receiveLen > 0)
{
RcvStr = Encoding.Default.GetString(buffer);
Invoke(new EventHandler(ReceiveData));
}
}
}
private void ReceiveData( object sender, EventArgs e)
{
if (RcvStr.Length > 0)
{
listBox1.Items.Insert(0, RcvStr);
RcvStr = string.Empty;
}
}
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ClientSocket.Connect(IPAddress.Parse(txtIP.Text), int .Parse(txtPort .Text ));
new Thread( new ParameterizedThreadStart(ReceiveThread)).Start ();
private void ReceiveThread( object obj)
{
while (true)
{
byte[] buffer = new byte[1024];
int receiveLen = ClientSocket.Receive(buffer);
if (receiveLen > 0)
{
RcvStr = Encoding.Default.GetString(buffer);
Invoke(new EventHandler(ReceiveData));
}
}
}
private void ReceiveData( object sender, EventArgs e)
{
if (RcvStr.Length > 0)
{
listBox1.Items.Insert(0, RcvStr);
RcvStr = string.Empty;
}
}
private void btnSend_Click( object sender, EventArgs e)
{
try
{
byte[] buffer = Encoding.ASCII.GetBytes(txtSendData .Text );
ClientSocket.Send(buffer);
}
catch (SocketException ex)
{
MessageBox.Show(ex.Message);
}
}
完整代码下载