
用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的连接
Thread acceptThread = new Thread(new ThreadStart(AcceptWorkThread));
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);
}

}3 ) 在上面一段代码中,是将于客户端连接的Socket保存下来,并将这个Socket当作参数开启另外一个线程,在另外一个线程中,接受客户端socket发来的数据和向客户端发送数据已响应客户端发送的数据已被接收。
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) 将接收到的数据显示出来,利用了委托定义了一个事件,因为在别的线程中是无法调用界面控件的。

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;
}
}


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);
}
} 完整代码下载
0 评论:
发表评论