C#Socket编程 仿服务端与客户端 聊天

来源:互联网 发布:淘宝的吉他会是正品吗 编辑:程序博客网 时间:2024/06/07 03:05

服务器端

这里写图片描述

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace SocketDemo{    public partial class Serverce : Form    {        public Serverce()        {            InitializeComponent();            Control.CheckForIllegalCrossThreadCalls = false;        }        //用来存储客户端的连接对象        List<Socket> sockets = new List<Socket>();        private void btnConn_Click(object sender, EventArgs e)        {            //socket服务器端            //1.第一个协议 可使用的寻址方案 Ipv4            //2.第二个参数 设置数据传输方式            //3.第三个参数 设置传输协议            //1.创建socket对象            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            txtLog.Text = "创建服务器端\r\n" + txtLog.Text;            //2.绑定Ip地址和端口号            IPAddress ipAddress = IPAddress.Parse(txtIP.Text);            IPEndPoint endPoint = new IPEndPoint(ipAddress, Convert.ToInt32(txtPort.Text));            try            {                socket.Bind(endPoint);            }            catch            {            }            //3.开启监听            socket.Listen(10);            //开启线程            Thread thread = new Thread(StartAcceptClient);            thread.IsBackground = true;            thread.Start(socket);        }        //等待客户端连接        public void StartAcceptClient(object o)        {            Socket socket = o as Socket;            while (true)            {                //4.等待客户端连接                Socket socketAccept = socket.Accept();                txtLog.Text = "[" + socketAccept.RemoteEndPoint + "]" + "连接成功:时间:" + DateTime.Now.ToString() + "\r\n" + txtLog.Text;                //将客户端连接放入到集合中                sockets.Add(socketAccept);                comboBox1.Items.Add(socketAccept.RemoteEndPoint);                Thread thread = new Thread(GetMsgFromClient);                thread.IsBackground = true;                thread.Start(socketAccept);            }        }        //接受客户端发来的信息        public void GetMsgFromClient(object socket)        {            Socket socketAccept = socket as Socket;            try            {                while (true)                {                    byte[] data = new byte[1024 * 1024];                    int r = socketAccept.Receive(data, 0, data.Length, SocketFlags.None);                    if (r > 0)                    {                        txtLog.Text = "[" + socketAccept.RemoteEndPoint + "]" + "客户端发来的信息:" +                                      Encoding.Default.GetString(data, 0, r) + "\r\n" + txtLog.Text;                    }                    else                    {                        socketAccept.Shutdown(SocketShutdown.Both);                        socketAccept.Close();                    }                }            }            catch            {            }            finally            {                socketAccept.Shutdown(SocketShutdown.Both);                socketAccept.Close();            }        }         //服务器给客户端发送消息        private void btnSend_Click(object sender, EventArgs e)        {            foreach (Socket socket in sockets)            {                //实现服务端与某个选定的客户端进行通信                if (socket.RemoteEndPoint.ToString() == comboBox1.SelectedItem.ToString())                {                    if (socket.Connected)                    {                        string str = txtSend.Text.Trim();                        byte[] data = Encoding.Default.GetBytes(str);                        socket.Send(data, 0, data.Length, SocketFlags.None);                    }                }            }        }        //打开客户端        private void button1_Click(object sender, EventArgs e)        {            Customer customer = new Customer();            customer.Show();        }        private void Serverce_Load(object sender, EventArgs e)        {        }    }}

客户端

这里写图片描述

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace SocketDemo{    public partial class Customer : Form    {        public Customer()        {            InitializeComponent();        }        private Socket socket = null;        //连接        private void btnConn_Click(object sender, EventArgs e)        {            //连接协议Tcp协议 寻址方案Ipv4 套接字类型“流”            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //服务端Ip            IPAddress ipAddress = IPAddress.Parse(txtIp.Text);            //服务端端口号            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, Convert.ToInt32(txtPort.Text));            //客户端连接到服务端            socket.Connect(ipEndPoint);            Thread thread = new Thread(ReceiveDataFromServerce);            thread.IsBackground = true;            thread.Start(socket);        }        //接收客户端发送的消息        public void ReceiveDataFromServerce(object socket)        {            txtLog.Text = "连接成功"+txtLog.Text;            Socket socketAccept = socket as Socket;            //非正常关闭链接            try            {                while (true)                {                    byte[] data = new byte[1024*1024];                    int r = socketAccept.Receive(data, 0, data.Length, SocketFlags.None);                    if (r > 0)                    {                        txtLog.Text = DateTime.Now.ToString() + "[" + Encoding.Default.GetString(data, 0, r) + "]\r\n" +                                      txtLog.Text;                    }                    else                    {                        socketAccept.Shutdown(SocketShutdown.Both);                        socketAccept.Close();                    }                }            }            catch            {            }            //关闭客户端            finally            {                socketAccept.Shutdown(SocketShutdown.Both);                socketAccept.Close();            }        }        //客户端发送消息        private void btnSend_Click(object sender, EventArgs e)        {            byte[] data = Encoding.Default.GetBytes(txtMsg.Text.Trim());            int r = socket.Send(data, 0, data.Length, SocketFlags.None);            if (r>0)            {            }            else            {            }        }    }}
原创粉丝点击