Socket编程基础学习

1、创建一个Socket对象

Socket mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

AddressFamily 寻址类型

AddressFamily.InterNetwork代表IPV4。

SocketType 套接字类型

SocketType.Dgram表示使用数据报协议,用于Udp;
SocketType.Stream 表示使用字节流,用于Tcp;

ProtocolType 协议类型

ProtocolType.Udp表示使用UDP协议;
ProtocolType.Tcp表示使用TCP协议;
注意的是套接字类型与协议类型并不是可以随便组合

SocketType ProtocolType 描述
Stream(使用字节流) Tcp 面向连接
Dgram(使用数据报) Udp 面向无连接
Raw Icmp 网际消息控制
Raw Raw 基础传输协议
2、创建IP地址类

//将文本框中的文本转换为IP地址
IPAddress iPAddress = IPAddress.Parse(IPtextBox.Text);或者
//创建IP地址
IPAddress iPAddress = IPAddress.Any;//表示侦听任何IP
//声明网络终端节点(IP地址加端口号) 用于表示具体位置(具体电脑得具体程序)
IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, port);

3、绑定网络终端节点

mySocket.Bind(iPEndPoint);

4、 //开始监听 设置挂起最多个数

mySocket.Listen(10);//最多挂起10个连接

5//等待 接受客户端的连接并创建新的Socket对象
        sendSocket = serverSocket.Accept();
6、//客户端 声明网络终端节点(IP地址加端口号)

IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, port);
//连接服务器
socket.Connect(iPEndPoint);
连接成功后,可用Socket对象开始互相传递数据

7、发送数据

//将String类型转换为二进制数组用于传输 (只有二进制才能通过传输)
byte[] BtMsg = Encoding.UTF8.GetBytes(Msg);
//将数组发送出去
socket.Send(BtMsg, BtMsg.Length,SocketFlags.None);

8、接受数据

//声明3M空间 用于存放接受的消息
byte[] buffer = new byte[1024 * 1024 * 3];
//将接受的数据存入buffer中并返回实际接受的数据大小
int r = socketSend.Receive(buffer);//接受数据
服务器Socket代码示例

 private void WindowServer_Load(object sender, EventArgs e)
        {
            //取消跨线程检查
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void Login_Click(object sender, EventArgs e)
        {
            //声明套字接  流用于TCP
            Socket mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //手动设置IP地址或者自动获取
            // IPAddress iPAddress = IPAddress.Parse("192.168.176.42");//IPAddress.Parse(txtServer.Text);
            //创建IP地址
            IPAddress iPAddress = IPAddress.Any;
            //将文本框中的文本转换成int类型表示端口号
            int port = int.Parse(PortTextBox.Text);
            //声明网络终端节点(IP地址加端口号)
            IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, port);
            //关联终结点/ 绑定IP
            mySocket.Bind(iPEndPoint);
            //开始监听
            mySocket.Listen(10);
            //提示监听成功
            MsgShow("开始监听");

            //开启新线程
            Thread thread = new Thread(ConnectSocket);
            //将线程设置为后台线程
            thread.IsBackground = true;
            //开始执行
            thread.Start(mySocket);
        }
        //显示文本消息
        private void MsgShow(string str)
        {
            OutTextBox.AppendText(str + "\r\n");

        }
        //声明Socket用于接受连接成功的Socket对象
        Socket sendSocket;
        ///接受连接生成  新套接字对象 (生成连接成功的对象)
        private void ConnectSocket(object obj)
        {
            //接受object对象强转为Socket对象
            Socket serverSocket = obj as Socket;
            //接受客户端的连接并创建新的Socket对象
            sendSocket = serverSocket.Accept();
            //显示连接的端点信息
            MsgShow(sendSocket.RemoteEndPoint.ToString() + ":" + "连接成功");

            //开启新线程执行接受数据
            Thread clientThread = new Thread(ReceiveData);
            //开始执行
            clientThread.Start(sendSocket);

            //Thread clientThread = new ThreadStart(ReceiveData);
            //clientThread.Start();
        }
        /// <summary>
        /// 接受数据对象方法
        /// </summary>
        /// <param name="o"></param>
        private void ReceiveData(object o)
        {
            Socket socketSend = o as Socket;

            while (true)
            {
                //声明3M空间 用于存放接受的消息
                byte[] buffer = new byte[1024 * 1024 * 3];
                //将接受的数据存入buffer中并返回实际接受的数据大小
                int r = socketSend.Receive(buffer);
                //判断客户端是否下线 (传输空格也会占1。如果是0表示传输为空)
                if (r == 0)
                {
                    break;
                }
                //将二进制数据按照UTF-8格式转换为字符串
                string str = Encoding.UTF8.GetString(buffer, 0, r);
                MsgShow(socketSend.RemoteEndPoint.ToString() + ":" + str);

            }

        }
        //发送消息
        private void sendBut_Click(object sender, EventArgs e)
        {
            //获取文本框的内容
            string Mssage = IntextBox.Text;
            //将文本转换为二进制数组
            byte[] Msg = Encoding.UTF8.GetBytes(Mssage);
            //将数据发送出去
            sendSocket.Send(Msg, Msg.Length, SocketFlags.None);
            //将文本框清空
            IntextBox.Text = null;
        }

客户端代码

 private void WindowClient_Load(object sender, EventArgs e)
        {
            //取消跨线程检查
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        //声明套字接
        Socket socket;
        private void Loginbutton_Click(object sender, EventArgs e)
        {
            // 流用于TCP
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //将文本框中的文本转换为IP地址
            IPAddress iPAddress = IPAddress.Parse(IPtextBox.Text);
            //将文本框中的文本转换成int类型表示端口号
            int port = int.Parse(ProtTextBox.Text);
            //声明网络终端节点(IP地址加端口号)
            IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, port);
            //连接服务器
            socket.Connect(iPEndPoint);
            //提示连接成功
            ShowMsg("连接成功");
            //开启新线程
            Thread thread = new Thread(ReceiveMessage);
            //将线程设置为后台线程
            thread.IsBackground = true;
            //线程准备执行
            thread.Start();

        }

        /// <summary>
        /// 将消息输出到文本框
        /// </summary>
        /// <param name="str"></param>
        void ShowMsg(string str)
        {
            MsgOutText.AppendText(str + "\r\n");
        }
        /// <summary>
        /// 发送消息到服务器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void send_Click(object sender, EventArgs e)
        {
            //获取文本内容
           string Msg= MsgInText.Text;
            //将String类型转换为二进制数组用于传输 (只有二进制才能通过传输)
            byte[] BtMsg = Encoding.UTF8.GetBytes(Msg);
            //将数组发送出去
            socket.Send(BtMsg, BtMsg.Length,SocketFlags.None);
            //将数据清空
            MsgInText.Text = null;
        }

        /// <summary>
        /// 接受消息
        /// </summary>
        void ReceiveMessage()
        {
            while (true)
            {
                //声明1M空间 用于存放接受的消息
                byte[] buffer = new byte[1024 * 1024 * 1];
                //将接受的数据存入buffer中并返回实际接受的数据大小
                int r = socket.Receive(buffer);
                //判断客户端是否下线 (传输空格也会占1。如果是0表示传输为空)
                if (r == 0)
                {
                    break;
                }
                //将二进制数据按照UTF-8格式转换为字符串
                string str = Encoding.UTF8.GetString(buffer, 0, r);
                ShowMsg(socket.RemoteEndPoint.ToString() + ":" + str);

            }

        }
(0)

相关推荐