Scoket例子

ScoketService

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = false;//关闭跨线程修改控件检查
        }

        Socket sokWatch = null;//负责监听 客户端段 连接请求的  套接字
        Task task;
        CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
        Thread threadWatch = null;//负责 调用套接字, 执行 监听请求的线程
        List<ClientIp> list = new List<ClientIp>();
        private Socket[] ClientSocket;//为客户端建立的SOCKET连接

        private void Form1_Load(object sender, EventArgs e)
        {
            ClientSocket = new Socket[65535];
        }

        private void btnstart_Click(object sender, EventArgs e)
        {
            //实例化 套接字 (ip4寻址协议,流式传输,TCP协议)
            sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //创建 ip对象
            IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
            //创建网络节点对象 包含 ip和port
            IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
            //将 监听套接字  绑定到 对应的IP和端口
            sokWatch.Bind(endpoint);
            //设置 监听队列 长度为10(同时能够处理 10个连接请求)
            sokWatch.Listen(10);
            threadWatch = new Thread(()=>StartWatch(sokWatch));
            //threadWatch.IsBackground = true;
            threadWatch.Start();
            this.ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 开始运行.");

            //txtShow.AppendText("启动服务器成功......\r\n");
            btnstart.Enabled = false;
        }
        bool isWatch = true;
        bool isRec = true;
        int num = 0;
        #region 1.被线程调用 监听连接端口
        /// <summary>
        /// 被线程调用 监听连接端口
        /// </summary>
        void StartWatch(Socket sokWatch)
        {

            while (isWatch)
            {
                //监听 客户端 连接请求,但是,Accept会阻断当前线程
                Socket sokMsg = sokWatch.Accept();//监听到请求,立即创建负责与该客户端套接字通信的套接字
                string st = sokMsg.RemoteEndPoint.ToString();
                if (st != null)
                {
                    string[] str = st.Split(‘:‘);
                    ClientIp clientIp = new ClientIp();
                    clientIp.Cip = str[0];
                    clientIp.CPort = str[1];
                    clientIp.stk = sokMsg;
                    ClientIp cliIp = list.Find(i => i.Cip == clientIp.Cip && i.CPort == clientIp.CPort);
                    if (cliIp == null)
                    {
                        list.Add(clientIp);
                        isRec = true;
                    }
                }
                this.ClientList.Items.Add(st + "于 " + DateTime.Now.ToString() + "成功连接服务器.");
                task = Task.Factory.StartNew(() => NewMethod(sokMsg));
            }
        }

        private void NewMethod(Socket sokMsg)
        {
            while (isRec)
            {
                try
                {
                    byte[] arrMsg = new byte[1024 * 1024 * 2];
                    //接收 对应 客户端发来的消息
                    int length = sokMsg.Receive(arrMsg);
                    //将接收到的消息数组里真实消息转成字符串
                    if (length > 0)
                    {
                        string strMsg = System.Text.Encoding.UTF8.GetString(arrMsg, 0, length);
                        if (strMsg != null && strMsg != "")
                        {
                            Send(sokMsg, strMsg);
                        }
                    }
                }
                catch
                {
                    isRec = false;
                }
            }
        }
        #endregion

        void Send(Socket sokMsg,string strmsg)
        {
            try
            {
                Sendmsg msg = JsonConvert.DeserializeObject<Sendmsg>(strmsg);
                ClientIp clientIp = list.Find(i => i.Cip == msg.OtherPartyIP && i.CPort == msg.OtherPartyPort);
                if (clientIp != null)
                {
                    //Socket socketmsg = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    ////创建 ip对象
                    //IPAddress address = IPAddress.Parse(msg.OtherPartyIP);
                    ////创建网络节点对象 包含 ip和port
                    //IPEndPoint endpoint = new IPEndPoint(address, int.Parse(msg.OtherPartyPort));
                    ////连接 服务端监听套接字
                    //socketmsg.Connect(endpoint);
                    if (msg.msgType == 0)
                    {
                        string Sendinfo = JsonConvert.SerializeObject(msg);
                        byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(Sendinfo);
                        byte[] arrMsgFinal = new byte[arrMsg.Length + 1];

                        arrMsgFinal[0] = 0;//设置 数据标识位等于0,代表 发送的是 文字
                        arrMsg.CopyTo(arrMsgFinal, 1);

                        clientIp.stk.Send(arrMsgFinal);
                    }
                    else if (msg.msgType == 2) {
                        byte[] arrMsgFinal = new byte[1];
                        arrMsgFinal[0] = 2;
                        clientIp.stk.Send(arrMsgFinal);

                    }
                }
                else {
                    string stmsg = "找不到目标IP";
                    byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(stmsg);
                    byte[] arrMsgFinal = new byte[arrMsg.Length + 1];
                    string st = sokMsg.RemoteEndPoint.ToString();
                   string[]str= st.Split(‘:‘);
                   ClientIp cliIp = list.Find(i => i.Cip == str[0]);
                   if (cliIp != null)
                   {
                       arrMsgFinal[0] = 0;//设置 数据标识位等于0,代表 发送的是 文字
                       arrMsg.CopyTo(arrMsgFinal, 1);
                       cliIp.stk.Send(arrMsgFinal);
                   }
                }

            }
            catch (Exception)
            {
                string stmsg = "服务端获取发送信息不完整无法解析";
                byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(stmsg);
                byte[] arrMsgFinal = new byte[arrMsg.Length + 1];

                arrMsgFinal[0] = 0;//设置 数据标识位等于0,代表 发送的是 文字
                arrMsg.CopyTo(arrMsgFinal, 1);
                sokMsg.Send(arrMsgFinal);

            }

        }

        private void btnclose_Click(object sender, EventArgs e)
        {
            try
            {
                isWatch = false;
                sokWatch.Dispose();
                sokWatch.Close();//关闭socket
                //cancelTokenSource.Cancel();
                //threadWatch.();//线程终止
                this.ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 停止运行.");
            }
            catch (Exception)
            {
                sokWatch.Close();//关闭socket

                this.ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 停止运行.");
            }
        }
    }

    public class ClientIp {
        public string Cip { get; set; }

        public string CPort { get; set; }

        public Socket stk { get; set; }
    }

    public class Sendmsg
    {
        public string OtherPartyIP { get; set; }

        public string OtherPartyPort { get; set; }

        public string Sendinfo { get; set; }

        public int msgType { get; set; }

        public byte[] msginfo { get; set; }
    }

  ScoketService的界面

ScoketClient

public partial class Form2 : Form
    {
        //IMRichTextBox _imRichTextBox;
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            //richTextBox1.SelectedText += "\n李小说:\t" + DateTime.Now + "\n";
            richTextBox1.SelectionStart += richTextBox1.TextLength;
            richTextBox1.ScrollToCaret();
            string picPath = Application.StartupPath + @"\img\keai.jpg";
            Image img = Image.FromFile(picPath);
            Bitmap bmp = new Bitmap(picPath);//获得图片
            Clipboard.SetDataObject(bmp, false);//将图片放在剪贴板中
            if (richTextBox1.CanPaste(DataFormats.GetFormat(DataFormats.Bitmap)))
                richTextBox1.Paste();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            richTextBox1.SelectAll();
            richTextBox1.Copy();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            richTextBox1.Paste();
        }
    }

  ScoketClient界面:

运行图:

时间: 2024-07-30 21:14:27

Scoket例子的相关文章

scoket多线程例子

大体思路,有n台mc,要dump出数据,n台进行对比,看数据是否一致,设计到同时dump的问题,server断发条指令给这n台mc,mc同时去dump把结果返回给server端,server端把这些结果进行对比 server段 #!/usr/bin/python #coding:utf8 import socket import os import threading import time import sys def work_1(ip,conn): global should_stop w

网络编程---scoket使用,七层协议,三次挥手建连接,四次挥手短链接

目录 == 网络编程 == 软件开发架构 网络编程 互联网协议 TCP协议的工作原理 Socket == 网络编程 == 软件开发架构 开发软件 必须要开发一套 客户端与服务端 客户端与服务端的作用 服务端:24小时不间断提供服务 客户端:如果想要找服务,就去寻找服务端并享受 软件开发架构分为两种 C/S架构 Client:客户端 Server:客户端 优点:软件的使用稳定,并且可以节省网络资源 缺点:1.若用户想在同意设备上使用多个软件,不许下载多个客户端 2.软件的每一次更新,客户端也必须跟

Android小例子:使用反射机制来读取图片制作一个图片浏览器

效果图: 工程文件夹: 该例子可供于新手参考练习,如果有哪里不对的地方,望指正>-< <黑幕下的人> java代码(MainActivity.java): package com.example.imageswitchtest; import java.lang.reflect.Field; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.v

JSON 简单例子

代码: json [ { "title" : "a", "num" : 1 }, { "title" : "b", "num" : 1 }, { "title" : "c", "num" : 1 }] 例子1 js var box=[ { title:'a', num:1, height:177, }, { title:'b',

最简单的基于FFmpeg的AVDevice例子(读取摄像头)【转】

转自:http://blog.csdn.net/leixiaohua1020/article/details/39702113 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] libavdevice使用 注意事项 代码 结果 下载 =====================================================最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDevice例子(读取摄像头) 最简单的基于FFm

Clustering by Passing Messages Between Data Points(Brendan J.Frey* and Delbert Dueck)例子

例1,数据点聚类:AP应用到25个二维数据中,使用负平法误差作为相似度  聚类数目不用预先指定 AP的一个优点是聚类数目不用预先指定,而是在消息传递方法中慢慢浮现,取决于输入参考度(preference),这种自动模型的选择,基于先验指定每一个数据点有多合适作为exemplar. 下图表示输入常量参考度对聚类数目的影响,这种关系近乎同样于在精确最小平方误差中的关系. 例2,人脸识别:使用优化标准为均方差,识别900张灰度图像   AP一致的能够实现更低的误差,在时间上花费要少于两个数量级. AP

Python之路42-socket介绍及简单例子

socket对数据的底层收.发做了封装 实现通信要通过IP+port 一个socket服务端和客户端实现的伪代码 # 发送端 # import socket # socket.TCP/IP # connect(a.ip,a.port) # socket.send("hello") # socket.recv() # socket.close() # 接收端 # import socket # socket.TCP/IP # listen(0.0.0.0,6969) # waiting(

c语言一个例子对比php学习随记

今天开始学写一些简单的C例子,发现很多和PHP不一样的地方,做个笔记. #include <stdio.h> int main(void) { int a,b; printf("请输入整数a"); //这里是用双引号,不能用单引号,PHP类似的地方可以用单引号,这里需注意 scanf("%d",&a); //获取用户输入值存入a printf("请输入整数b"); scanf("%d",&b);//

判断当前进程是否以管理员权限运行(AllocateAndInitializeSid后,用CheckTokenMembership与AdministratorsGroup进行比较,和Delphi的那个例子还有点不一样)

在Win7下(Vista以上的...)有时某些操作就是会让人郁闷 开启了UAC的话,得以管理员权限运行才不会出现Access is denied... 但是,程序又不是非得什么时候都用那破管理员权限的 总不能在manifest里加权限,然后用户运行时老弹确认吧? 当然啦,可以将需要管理员权限的部分写到另一个小程序,需要时调用它就行了 不过还是不爽,如果是一个小小的程序还要再加另一个小小小程序的话 那好,干脆判断是不是Win7...开启了UAC没有之类 开启的话再判断下是不是以管理员权限运行,不是