Socket编程-TCP实现简单聊天程序

在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地址和端口号,连接到服务器,接下来双方就可以对话了。之后,如果单击客户端和服务器端终止按钮,即可终止对话。

运行结果:(上面服务器端,下面客户端)

Socket编程-TCP实现简单聊天程序_第1张图片

源代码:

服务器端:

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

 

你可能感兴趣的:(网络编程)