线程的两个项目

摇奖机小程序

1 首先创建三个Label和button控件

public Form1()
        {
            InitializeComponent();
        }
        //在点击按钮事件中
        private void button1_Click(object sender, EventArgs e)
        {
            //刚开始是不赋值
            if (button1.Text=="开始")
            {
                //点击开始后赋值
                button1.Text = "停止";
                //因为会假死,所以要创建一个新线程
                //创建线程对象
                Thread th = new Thread(playGame);
                //将该线程设为后台线程
                th.IsBackground = true;
                //标记该线程可以被执行
                th.Start();
            }
            else//赋值
            {
                button1.Text = "开始";
            }
        }
        //写一个方法来将随机数赋值给larbel文本
        public void playGame()
        {
            Random rRandom = new Random();
            //通过一个循环来赋值
            while (button1.Text=="停止")
            {
                //将随机数赋值label文本,注意要ToString
                label1.Text = rRandom.Next(0, 10).ToString();
                label2.Text = rRandom.Next(0, 10).ToString();
                label3.Text = rRandom.Next(0, 10).ToString();
            }
        }
        //在程序加载的时候,取消跨线程的访问
        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }

Socket通信小程序

创建服务端项目

1 添加ip地址,端口号,以及接收信息,发送信息,文件路径五个textbox控件以及存储ip地址的下拉框(comboBox)控件和开始监听,选择 发送文件,发送信息,震动四个button控件

       public Form1()
        {
            InitializeComponent();
        }
          //在监听按钮中
        private void btnJT_Click(object sender, EventArgs e)
        {
            try
            {
                //创建Socket对象
                Socket socketWatch = new Socket(AddressFamily.Atm, SocketType.Stream, ProtocolType.Tcp);
                //创建ip地址
                IPAddress ip = IPAddress.Any;
                //创建端口号对象,将地址和端口号传入
                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtNumber.Text));
                //将Socket对象绑定端口号
                socketWatch.Bind(point);
                //在文本框中展示监听成功
                ShowMsg("监听成功");
                //设置监听队列
                socketWatch.Listen(10);
                //创建一个新线程调用监听方法
                Thread th = new Thread(Listen);
                //将该线程设为后台线程
                th.IsBackground = true;
                //标记该线程可以执行了
                th.Start(socketWatch);
            }
            catch { }
        }/// <summary>
        /// 显示连接信息
        /// </summary>
        /// <param name="str"></param>
        void ShowMsg(string str)
        {
            //因为可能不止一个连接,所以要追加到文本框,注意换行
            txtLog.AppendText(str + "\r\n");
        }
        /// <summary>
        /// 等待连接,并且创建通信的Socket
        /// </summary>
        void Listen(object o)
        {
            Socket socketWatch=o as Socket;//因为只能传入object类,所以传入后再强转为Socket类
            while (true)
            {
                try
                {
                    //创建通信用的Socket
                     Socket socketSend = socketWatch.Accept();
                    //将客户端IP地址和socketSend存入键值对集合中
                    dicSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
                    //将ip地址存入下拉框中
                    cboUser.Items.Add(socketSend.RemoteEndPoint.ToString());
                    //展示ip地址连接成功
                    ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");
                    //开启一个新线程调用接收方法
                    Thread th = new Thread(Recive);
                    //将该线程设为后台进程
                    th.IsBackground = true;
                    //标记该线程可以执行了
                    th.Start(socketSend);
                }
                catch { }
            }
        }
        //声明一个IP地址和Socke键值对集合
        Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();
       /// <summary>
       /// 接收方法
       /// </summary>
       /// <param name="o"></param>
        void Recive(object o)
        {
            Socket socktSend=o as Socket;//只能传入object类型,所以将object强转为Socket
            while (true)
            {
                try
                {
                    //创建一个3m的数组
                    byte[] buffer = new byte[1024 * 1024 * 3];
                    //实际接收的有效字节
                    int r = socktSend.Receive(buffer);
                    if (r == 0)//用户关闭后
                    {
                        break;
                    }
                    //将接收的字节数组按照指定编码格式转换成字符串
                    string str = Encoding.UTF8.GetString(buffer, 0, r);
                    //在文本框中展示ip地址和字符串
                    ShowMsg(socktSend.RemoteEndPoint + ":" + str);
                }
                catch { }
            }
        }
        /// <summary>
        /// 当窗体加载时,取消跨线程的访问
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        /// <summary>
        /// 发送信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnFSXX_Click(object sender, EventArgs e)
        {
            //将文本框中的文本用字符串接收
            string str=txtMsg.Text;
            //将字符串按照指定编码格式解码成字节数组
            byte[]buffer=Encoding.UTF8.GetBytes(str);
            //创建字节数组集合
            List<byte> list = new List<byte>();
            //将0和字节数组添加到集合中
            list.Add(0);
            list.AddRange(buffer);
            //在转换成字节数组,是为了区分发送的是信息还是文件还是震动
            byte[]newbuffer=list.ToArray();
            //获得下拉框中选择的ip地址
            string ip=cboUser.SelectedItem.ToString();
            //通过键值对集合中的键来拿Scoket用来发送
            dicSocket[ip].Send(newbuffer);
        }
        //在选择按钮中
        private void btnXZ_Click(object sender, EventArgs e)
        {
            //创建选择文件对话框对象
            OpenFileDialog ofd = new OpenFileDialog();
            //设置对话框的标题
            ofd.Title = "选择你要发送的文件";
            //设置对话框的初始目录
            ofd.InitialDirectory = @"C:\Users\Administrator\Desktop";
            //设置对话框的文本类型
            ofd.Filter = ("文本类型|*.txt|图片文件|*.Jpg|媒体类型|*.mav|所有文件类型|*.*");
            //展示对话框
            ofd.ShowDialog();
            //获得对话框中选择的文件路径赋值给文本框
            txtPath.Text=ofd.FileName;
            //显示选择成功
            MessageBox.Show("选择成功");
        }
        /// <summary>
        /// 发送文件中
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnFSWJ_Click(object sender, EventArgs e)
        {
            //获得发送路径
            string path=txtPath.Text;
            //在using中创建文件流并且读取
            using(FileStream fsRead=new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read))
            {
                byte[] buffer = new byte[1024 * 1024 * 3];
                int r=fsRead.Read(buffer,0,buffer.Length);
                //创建一个字节数组集合,里面添加第一个元素为1
                List<byte> list = new List<byte>();
                //添加元素1和字节数组
                list.Add(1);
                list.AddRange(list);
                //再将字节数组转换成字节数组
                byte[]newbuffer=list.ToArray();
                //通过下拉框中选择的ip地址来获得Socket用来发送
                dicSocket[cboUser.SelectedItem.ToString()].Send(newbuffer,0,r+1,SocketFlags.None);
                MessageBox.Show("发送成功");
            }
        }
        //震动按钮中
        private void btnZD_Click(object sender, EventArgs e)
        {
            //创建一个长度为1,元素为2的数组
            byte[] buffer = new byte[1];
            buffer[0] = 2;
            //通过下拉框中选择的ip地址来获取Socket用来发送
            dicSocket[cboUser.SelectedItem.ToString()].Send(buffer);
        }

创建客服端(client)

1 添加ip地址,端口号,接收信息 发送信息的textbox,以及连接和发送信息button几个控件

 Socket sockeSend;
        //在连接按钮中
        private void btnLJ_Click(object sender, EventArgs e)
        {
            try
            {
                //创建Socket
                sockeSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //从两个文本框拿到IP地址和端口号
                IPAddress IP = IPAddress.Parse(txtIP.Text);
                IPEndPoint point = new IPEndPoint(IP, Convert.ToInt32(txtNumber.Text));
                //用创建的Socket来连接服务器
                sockeSend.Connect(point);
                //显示连接成功
                ShowMsg("连接成功");
                //开启一个新线程来调用接收方法
                Thread th = new Thread(Recive);
                //将该线程设为后台线程
                th.IsBackground = true;
                //标记该线程可以执行了
                th.Start();
            }
            catch { }
        }
        void ShowMsg(string str)
        {
            //因为不止一个连接所以追加到文本框,并且换行
            txtLog.AppendText(str + "\r\n");
        }
        /// <summary>
        /// 循环接收服务端发来的信息
        /// </summary>
        void Recive()
        {
            while (true)
            {
                try
                {

                    //创建字节数组来接收
                    byte[] buffer = new byte[1024 * 1024 * 3];
                    //实际接收的有效字节
                    int r = sockeSend.Receive(buffer);
                    if (r == 0)//停止发送
                    {
                        break;
                    }
                    //判断发送的类型
                    if (buffer[0] == 0)
                    {
                        //将数组按照指定的编码格式解码成字符串
                        string str = Encoding.UTF8.GetString(buffer, 1, r - 1);
                        //将服务端的ip地址和字符串显示在文本框中
                        ShowMsg(sockeSend.RemoteEndPoint.ToString() + ":" + str);
                    }
                    else if (buffer[0] == 1)
                    {
                        //创建保存文件对话框对象
                        SaveFileDialog sfd = new SaveFileDialog();
                        //设置对话框标题
                        sfd.Title = "请保存发送过来的文件";
                        //设置对话框的初始目录
                        sfd.InitialDirectory = @"C:\Users\Administrator\Desktop";
                        //设置对话框的文本类型
                        sfd.Filter = ("所有文件类型|*.*");
                        //展示对话框
                        sfd.ShowDialog();
                        //获得对话框中选择的文件路径
                        string path = sfd.FileName;
                        //在using中创建文件流对象并且写入
                        using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            //调用写入方法
                            fsWrite.Write(buffer, 1, r - 1);
                        }
                        MessageBox.Show("保存成功");
                    }
                    else if (buffer[0] == 2)
                    {
                        ZD();
                    }
                }
                catch { }
            }
        }
        /// <summary>
        /// 震动方法
        /// </summary>
        void ZD()
        {
            //通过循环改变窗体坐标来实现
            for(int i = 0; i < 10; i++)
            {
                this.Location = new Point(200, 300);
                this.Location = new Point(300, 400);
            }
        }
        //发送信息按钮中
        private void btnFSXX_Click(object sender, EventArgs e)
        {
            //将文本框中的要发送文本用字符串接收
            string str=txtMsg.Text;
            //将字符串按照指定编码格式解码成字节数组
            byte[]buffer=Encoding.UTF8.GetBytes(str);
            //用Soket来发送
            sockeSend.Send(buffer);
        }
        /// <summary>
        /// 在窗体加载时,取消跨线程访问
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个示例代码,演示了如何在Android中使用两个线程来操作同一个列表: ``` public class MainActivity extends AppCompatActivity { private List<String> list; private ArrayAdapter<String> adapter; private Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化列表和适配器 list = new ArrayList<>(); adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list); ListView listView = findViewById(R.id.list_view); listView.setAdapter(adapter); // 创建Handler对象 handler = new Handler(); // 创建并启动第一个线程 Thread thread1 = new Thread(new Runnable() { @Override public void run() { // 向列表中添加数据 list.add("Item 1"); list.add("Item 2"); // 发送消息给UI线程,通知它更新列表 handler.post(new Runnable() { @Override public void run() { adapter.notifyDataSetChanged(); } }); } }); thread1.start(); // 创建并启动第二个线程 Thread thread2 = new Thread(new Runnable() { @Override public void run() { // 休眠2秒钟 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } // 向列表中添加数据 list.add("Item 3"); list.add("Item 4"); // 发送消息给UI线程,通知它更新列表 handler.post(new Runnable() { @Override public void run() { adapter.notifyDataSetChanged(); } }); } }); thread2.start(); } } ``` 在上面的代码中,我们创建了一个列表和一个适配器,并将适配器设置为列表的适配器。然后我们创建了一个Handler对象,用于在后台线程中向UI线程发送消息。接下来,我们创建了两个线程来操作列表。第一个线程向列表中添加两个项目,然后发送消息给UI线程,通知它更新列表。第二个线程休眠2秒钟,然后向列表中添加两个项目,并发送消息给UI线程,通知它更新列表。最终,我们启动了这两个线程,并在UI线程中等待它们完成它们的工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值