C# socket简单编程

服务器端: 

 private void StartWatch_Click(object sender, EventArgs e)
        {
            //创建一个负责监听的Socket
            Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //创建IP地址和端口号对象
            IPAddress ip = IPAddress.Any;//IPAddress.Parse(IPaddress.Text)这会使接受的ip地址固定,any会随着IP地址变;
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(PortBox.Text));
            //让负责监听的Socket绑定IP地址跟端口号
            socketWatch.Bind(point);
            ShowMsg("监听成功");
            //设置监听队列
            socketWatch.Listen(10);//在某一个时间点内,服务器端最大连接的客户端的数量
            //创建多线程来监听
            Thread th = new Thread(Listen);
            th.IsBackground = true;
            th.Start(socketWatch);//Listen函数是带参数的,所以start使用时必须带监听参数


        }
        //等待客户端的连接,并创建与之通信的Socket
        Socket socketsend;

        //将远程连接的客户端的IP地址和Socket存入集合中
        Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();
        void Listen(object o)//listen要用多线程来运行,参数必须是object类
        {
            Socket socketWatch = o as Socket;
            while(true)
            {
                //负责监听的socket来接受客户端的连接  创建跟客户端通信的socket
                 socketsend = socketWatch.Accept();
                //将连接的客户端的IP地址和Socket存起来
                dicSocket.Add(socketsend.RemoteEndPoint.ToString(), socketsend);
                //将连接的客户端的IP地址和端口号存储到下拉框中
                ClientSelect.Items.Add(socketsend.RemoteEndPoint.ToString());
                //192.168.3.161:连接成功
                ShowMsg(socketsend.RemoteEndPoint.ToString() + ": " + "连接成功" );
                //开一个线程,不停接受客户端发送过来的消息
                Thread th = new Thread(Receive);
                th.IsBackground = true;
                th.Start(socketsend);
            }
           
        }
        void Receive(object o)
        {
            string[] str=new string[6];
            socketsend = o as Socket;
            while (true)
            {
                for (int i = 0;i< 6; i++)
                {
                    //客户端连接成功之后,服务器应该接受客户端发来的消息
                    byte[] buffer = new byte[1024 * 1024 * 2];
                    //实际接受到的字节数
                    int r = socketsend.Receive(buffer);
                    if (r == 0)
                    {
                        break;
                    }
                    str[i] = Encoding.UTF8.GetString(buffer, 0, r);

                    ShowMsg(socketsend.RemoteEndPoint + ":" + str[i]);
                }
                
            }
        }
        void ShowMsg(string str)//服务器端显示内容
        {
            servershow.Text=str;
            //servershow.AppendText(str + "\r\n");
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        //服务器给客户端发送消息
        private void Clicksend_Click(object sender, EventArgs e)
        {
            string str = Serversend.Text;
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
            //获得用户在下拉框中选中的IP地址
            string ip = ClientSelect.SelectedItem.ToString();
            dicSocket[ip].Send(buffer);
            // socketsend.Send(buffer);
        }

客户端:

Socket socketsend;
        private void Link_Click(object sender, EventArgs e)
        {
            //创建负责通信的socket,连接远程服务器端的ip,和端口号
            socketsend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse(IPBox2.Text);
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(PortBox2.Text));
            socketsend.Connect(point);
            ShowMsg("连接成功");
            //开启一个新线程不停的接受服务端发来的消息
            Thread th = new Thread(Receive);
            th.IsBackground = true;
            th.Start();

        }
        //客户端不停的接受服务端发来的消息
        void Receive()
        {
            while(true)
            {
                //接受到的信息为二进制信息
                byte[] buffer = new byte[1024 * 1024 * 2];
                //实际接受到的有效字节数
                int r = socketsend.Receive(buffer);
                if(r==0)
                {
                    break;
                }
                //将二进制信息转换为字符串
                string s = Encoding.UTF8.GetString(buffer, 0, r);
                ShowMsg(socketsend.RemoteEndPoint + ":" + s);
            }


        }
        void ShowMsg(string str)
        {
            Clientshow.AppendText(str + "\r\n");
        }
        //客户端给服务器发送消息
        private void send_Click(object sender, EventArgs e)
        {
            timer1 = new System.Windows.Forms.Timer();

            //设置定时器属性
            timer1.Tick += new EventHandler(timer1_Tick);
            timer1.Interval = 100;//时间间隔100毫秒
            timer1.Enabled = true;
            //开启定时器
            timer1.Start();
        }
        double L1, L2, L3, L4 = 0.555, L5, L6;
        private void timer1_Tick(object sender, EventArgs e)
        {
            L4 = L4 + 1;
            Clientsend.Text = L4.ToString();
            string str = Clientsend.Text.Trim();
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
            socketsend.Send(buffer);
            if (L4 > 360)
            {
                timer1.Stop();
            }

        }


        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值