在System.net.Sockets的命名空间中,TcpListener类与TcpClient类是两个专门用于TCP协议编程的类,它们封装了底层的套接字并分别提供了用Socket进行同步和异步通信的方法,降低了TCP应用编程的难度。
在网络应用编程中,利用TCP协议编写的程序非常多,例如网络游戏,网络办公,股票交易,网络通信等。
1、TcpListener类
监听器,用于监听和接受传入的连接请求。
构造函数:TcpListener(IPEndPoint p)
其中,参数p为IPEndPoint类型的对象,其包含了服务区端的IP地址与端口号,参数address和port正好组成端点。最终,监听器通过指定端点来监听传入的连接请求。
为了监听客户端的连接请求,TcpListener分别提供了同步与异步方法。
AcceptTcpClient方法用于在同步方式下返回一个封装了套接字TcpClient对象。
Start方法用于启动监听。
Stop方法用于停止监听请求,原型:public void Stop()。执行Stop方法后,会立即停止监听客户端连接请求,并关闭底层的Socket对象。等待队列中的请求将会丢失,等待接受连接请求的远程主机会抛出套接字异常。
2、TcpClient类
利用TcpClient类提供的方法,可以连接,发送和接收网络数据流,其构造函数有
TcpClient(IPEndPoint p)
TcpClient()
编写一个服务器端和客户端通信的小程序,说明利用TCP协议和同步套接字编写网络应用程序方法。
首先启动服务端,输入要监听的端口号,单击开始按钮启动监听,接下来启动客户端,输入服务器的IP地址和端口号,连接到服务器,接下来双方就可以对话了。之后,如果单击客户端和服务器端终止按钮,即可终止对话。
运行结果:(上面服务器端,下面客户端)
源代码:
服务器端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace Socket_Server
{
public partial class Form1 : Form
{
static TcpClient client = null; //客户端对象,用来接受或发送信息
TcpListener server = null; //监听器对象,用来监听TCP连接
static NetworkStream stream = null; //流对象,完成接受或发送消息操作
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int port = int.Parse(textPort.Text);
IPEndPoint p = new IPEndPoint(IPAddress.Any, port); //创建TCP连接的端点
server = new TcpListener(p); //初始化TcpListener的新实例
server.Start(); //开始监听客户端的请求
lblShow.Items.Add("服务端已启动!");
client = server.AcceptTcpClient(); //执行挂起和接受连接请求,获得客户端对象
lblShow.Items.Add("已连接客户端!");
}
private void button2_Click(object sender, EventArgs e)
{
Byte[] msg = Encoding.UTF8.GetBytes(textMessage.Text);
stream = client.GetStream(); //获取用于读取和写入的流对象
stream.Write(msg, 0, msg.Length); //向客户端发送一个响应信息
}
private void button3_Click(object sender, EventArgs e)
{
Byte[] bytes = new Byte[256]; //缓存读入的数据
stream = client.GetStream(); //获取用于读取和写入的流对象
stream.Read(bytes, 0, bytes.Length); //读取来自客户端的信息
string data = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
lblShow.Items.Add("客户端:" + data);
}
private void button4_Click(object sender, EventArgs e)
{
if (stream != null)
stream.Close();
if (server != null)
server.Stop();
if (client != null)
client.Close();
}
}
}
客户端:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace Socket_Client
{
public partial class Form1 : Form
{
static TcpClient client = null; //客户端对象,用来接收或发送消息
static NetworkStream stream = null; //流对象,完成接受或发送消息的操作
public Form1()
{
InitializeComponent();
}
private void label3_Click(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string strIp = textAddress.Text;
int port = int.Parse(textPort.Text);
client = new TcpClient(); //创建TCP客户端
client.Connect(strIp, port); //连接服务器
}
private void button2_Click(object sender, EventArgs e)
{
byte[] msg = Encoding.UTF8.GetBytes(textMessage.Text);
stream = client.GetStream(); //获取用于读取和写入的流对象
stream.Write(msg, 0, msg.Length); //向服务器端发送一个响应信息
}
private void button3_Click(object sender, EventArgs e)
{
byte[] bytes = new byte[256]; //缓存读入的数据
stream = client.GetStream(); //获取用于读取和写入的流对象
stream.Read(bytes, 0, bytes.Length); //读取来自服务器端的信息
string data = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
lblShow.Items.Add("服务端: " + data);
}
private void button4_Click(object sender, EventArgs e)
{
if(stream != null)
stream.Close();
if(client != null)
client.Close();
}
}
}