多线程&网络编程
1、多线程:

线程:是操作系统分配处理器时间的基本单元,并且进程中可以有多个线程同时执行代码。
NET用Thread创建并控制线程,设置做强先级并获取其状态。
Thread t1 = new Thread(new ThreadStart(tt1.WriteColor));
            或
        Thread t1 = new Thread(new ParameterizedThreadStart(tt1.WriteColor));
注:object数组可以赋给object类型的变量,数组继承Array,Array又继承object,即用子类来实例化父类是可以的,而int或其他类型的数组不具有这样的属性。
例:
        static void Main(string[] args)
        {
ThreadStart st = new ThreadStart(F1);
            Thread th1 = new Thread(st);//多线程的两种声明方法之一
            th1.Start();
Thread th2 = new Thread(F2);//第二种多线程的声明方法
            object[] obj = new object[] { "1",33,1,8,2.5,1};
            object o = obj;//将object的数组赋值给object类型的变量o
            th2.Start(o);//多线程有两种参数,一种是无参,一种是object类型的参数
               
        }
        static void F1()
        { 
            Console.WriteLine("387447647646");           
        }
        static void F2(object o)
        {
            foreach (object obj in (object[])o)
            {
                Console.WriteLine(obj);
            }//将object类型的参数转换成object数组并遍历输出数组元素
        }
上例中多线程有两种声明方法:
       
            1)ThreadStart st = new ThreadStart(F1);//F1方法
               Thread th1 = new Thread(st);//多线程的两种声明方法之一
2) Thread th2 = new Thread(F2);//第二种多线程的声明方法,F2为方法
小练习1:用线程的join()方法实现一个线程的加入终止另一个线程的操作
阻塞线程
  class Program
    {
        static Thread ThrTest1, ThrTest2;
        static void Main(string[] args)
        {
            ThreadStart TS1 = new ThreadStart(WriteLine1);
            ThrTest1 = new Thread(TS1);
            ThreadStart TS2 = new ThreadStart(WriteLine2);
            ThrTest2 = new Thread(TS2);
            ThrTest1.Start();
            ThrTest2.Start();
        }
        public static void WriteLine1()
        {
            for (int i = 0; i < 20; i++)
            {
                if (i == 10)
                {
                    ThrTest2.Join();
                }
                Console.ForegroundColor = ConsoleColor.Blue;
                Console.WriteLine(i.ToString() + "WriteLine1");
                Thread.Sleep(500);
            }
        }
public static void WriteLine2()
        {
            for (int i = 0; i < 20; i++)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(i.ToString() + "WriteLine2");
                Thread.Sleep(500);
            }
        }
   
}
小练习2:利用lock()代码段实现线程的同步控制(例火车票的同步售出)
     class Program
     {
       static void Main(string[] args)
        {
            BookShop a = new BookShop();
            Thread t1 = new Thread(new ThreadStart(a.Sale));
            Thread t2 = new Thread(new ThreadStart(a.Sale));
            t1.Start();
            t2.Start();
        }
     }
public class BookShop
        {
            int num = 1;//共享资源
            public void Sale()
            {
                lock (this)//同步控制
                {
                    if (num > 0)
                    {   //卖书过程
                        Thread.Sleep(1000);
                        num = num - 1;
                        Console.WriteLine("售出一本");
                    }
                    else
                    {
                        Console.WriteLine("没有了");
                    }
                }
            }
        }

Monitor 类通过向单个线程授予对象锁来控制对对象的访问,对象锁提供限制访问代码块(通常称为临界区)的能力。
2、网络编程:
TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/网际协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
TCP/IP 是供已连接因特网的计算机进行通信的通信协议。
在.net中,我们用TCPClient和TCPListener类来实现点对点通讯,这两个命名空间位于此System.Net.SocketsTcpListener 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求。可使用 TcpClient 或 Socket 来连接 TcpListener。可使用IPEndPoint、本地 IP 地址及端口号或者仅使用端口号,来创建 TcpListener。
TcpClient 类提供了一些简单的方法,用于在同步阻止模式下通过网络来连接、发送和接收流数据。
小练习:网络编程实现客户端与服务器端的相互通信(一个服务器端可同时与多个客户端端通信)。
   
      思路总结:1)要想实现一个服务器与多个客户端通信可以用一个泛型的哈希表来保存服务器监听到得客户端的信息,包括客户端的代号(用键保存代号)和客户端的流,每次服务器端可以选择要通信的客户端,利用检索保存客户端信息的哈希表来选择。
                2)在服务器端有一个可以接收所有客户端的方法,分别将接收到得信息保存在哈希表中。
具体实现如下:
服务器端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Collections ;
namespace Server
{
    class Program
    {
        static Dictionary<string, NetworkStream> clients = new Dictionary<string, NetworkStream>();
        static void Main(string[] args)
        {
            Console.WriteLine("server");
            TcpListener server = new TcpListener(IPAddress.Parse("192.168.0.105"), 9999);//定义一个服务器 监听网络的客户端
            server.Start();
            Thread th = new Thread(Accept );//定义一个线程,执行Accept方法,传递一个参数是接收到得网络流,不断接收所挂起的链接请求
            th.Start(server);//将当前定义的服务器发送给Accept方法接收所有的客户端           
            Console.WriteLine("开始发送请按任意键!");
            Console.ReadLine();
while (true)
            {
                foreach (string key in clients.Keys)
                {
                    Console.WriteLine("{0}", key);
                }//将哈希表中已保存的客户端信息打印出来供用户选择
                Console.WriteLine("请输入编号选择您要对话的客户端:");
                string index = Console.ReadLine();
                NetworkStream netstream = clients[index];//根据用户输入信息转换为哈希表的键,然后根据键取出哈希表中存放的制定客户端的流信息,以便进行写操作
                StreamWriter sw = new StreamWriter(netstream);//定义一个写文件流执行写操作
                while (true)
                {
                    Console.WriteLine("请输入发送内容:");
                    string con = Console.ReadLine();
                    sw.WriteLine(con);//将要发送的内容写入流中供客户端读取
                    sw.Flush();//清理当前编写器的缓冲区
                    Console.WriteLine("退出请按E,继续请按任意键!");
                    if (Console.ReadLine().ToUpper() == "E")
                    {
                        break;
                    }
                }//定义一个死循环像客户端发送消息
            }
        }
        /// <summary>
        /// 读取客户端发过来的消息
        /// </summary>
        /// <param name="o"></param>
        static void ReadText(object o)
        {
            NetworkStream netstream = o as NetworkStream;
            StreamReader sr = new StreamReader(netstream);
            while (true)
            {
                Console.WriteLine("--------------------");
                string con = sr.ReadLine();
                //string [] a=con.Split('|');
                //foreach(string key in clients.Keys )
                //{
                //    if (a[0] == key)
                //    {
                //        NetworkStream netstream1 = clients[key];
                //    }
                   
                //}
              
Console.WriteLine(con);
                Console.WriteLine("客户端:"+DateTime.Now );
                Console.WriteLine("--------------------");
            }
         
        }
        /// <summary>
        /// 获取所有登入服务器的客户端,并将其代号和流信息保存在泛型哈希表中
        /// </summary>
        /// <param name="o"></param>
        static void Accept(object o)
        {
            TcpListener server = o as TcpListener;
            while (true)
            {
                TcpClient client = server.AcceptTcpClient();//接收挂起的连接请求,服务端每接收一个客户端消息都会生成
                NetworkStream netstream = client.GetStream();//获取客户端的流
StreamReader sr = new StreamReader(netstream );
                string con=sr.ReadLine();//获取客户端流输入的一行数据,即唯一标识某个客户端的数据,将其保存为泛型哈希表的键
                clients.Add(con,netstream );//将唯一标识客户端的数据和该客户端的流保存在哈希表中
Thread th = new Thread(ReadText);//定义一个进程,调用ReadText 方法,读取客户端输入的内容
                th.Start(netstream);//调用线程利用流读取客户端发来的数据内容
            }//循环让服务器不断地接收客户端
}
    }
}
 
客户端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("client");
            TcpClient client = new TcpClient("192.168.0.105", 9999);//客户端链接,存放的是服务器端的IP地址
            NetworkStream netstream = client.GetStream();//客户端接收到的网络流
            StreamWriter sw = new StreamWriter(netstream);
            Console.WriteLine("请输入客户端信息:");
            Thread th = new Thread(ReadText);//定义一个线程,执行ReadText方法,读网络流发送过来的消息,如果有发送来的消息就触发该线程,如果没有则跳过接着往下执行
            th.Start(netstream);
            while (true)
            {
                string con = Console.ReadLine();
                sw.WriteLine(con);//将用户要发送的内容写进流供服务器端读取
                sw.Flush();//将客户端信息发送给服务器
                Console.WriteLine("客户端:" + DateTime.Now);
                Console.WriteLine("--------------------");
            }
           
           
        }
        /// <summary>
        /// 读取客户端发送(即要发送给服务器)的消息
        /// </summary>
        /// <param name="o"></param>
        static void ReadText(object o)
        {
            NetworkStream netstream = o as NetworkStream;
            StreamReader sr = new StreamReader(netstream);
            while (true)
            {
                string con = sr.ReadLine();               
                Console.WriteLine(con);
                Console.WriteLine("服务端:" + DateTime.Now);
                Console.WriteLine("--------------------");
            }
}
    }
}
 

 

转载于:https://blog.51cto.com/fayling/624810

.NET Framework-多线程网络编程相关推荐

  1. day16多线程网络编程日志枚举

    多线程&网络编程 一.实现多线程 1.1 相关概念 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的一条执行路径.实际运作单位.简单理解:应用软件中互相独立,可以同时运 ...

  2. Linux多线程网络编程要义丨epoll与reactor原理

    linux多线程网络编程要义 1. epoll原理剖析 2. 单reactor原理以及应用 3. 多reactor原理以及应用 [Linux服务器系列]Linux多线程网络编程要义丨epoll与rea ...

  3. 【Linux服务器开发系列】详解多线程网络编程丨百分百干货分享丨学到就是赚到

    90分钟搞懂多线程网络编程模型 1. 网络编程关注的问题 2. 网络编程的几种模型reactor,one loop per thread及其变种 3. skynet,redis,nginx,memca ...

  4. HSHA多线程网络编程模型介绍

     我在上一篇的分享<Leader/Follower多线程网络模型介绍>中详细介绍了LF多线程网络模型的原理和代码分析.它的思路是减少线程上下文切换和数据拷贝时间,通过角色转换,来提高处 ...

  5. Java高并发与多线程网络编程

    目录 一. 基础 1. 线程介绍 2. 创建并启动线程 3. 函数式接口编程 4. Thread 构造器 5. 守护线程 线程关系 6. join 7. interrupt 8. 优雅的结束线程 9. ...

  6. python多线程网络编程_python网络编程之线程

    一 .背景知识 1.进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令 ...

  7. python多线程网络编程_python之网络编程-多线程

    死锁现象,递归锁 所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,若无外力作用,他们将无法推进下去,此时称系统处于死锁状态或系统产生了死锁,这些永远在相互 ...

  8. QT多线程网络编程程序崩溃问题与解决

    环境:Ubuntu14.04,Qt5.5 平台:QtCreator 场景:有以下三个线程:1.gstreamer循环取摄像头视频帧,25fps:2.HTTP循环请求消息并显示在QDoubleSpinB ...

  9. 多线程+SOCKET编程实现qq群聊的服务端和客户端

    多线程+SOCKET编程实现qq群聊的服务端和客户端 标签(空格分隔): 多线程 网络编程 线程同步 一.设计思路 1.服务端 每来一个客户端连接,服务端起一个线程维护: 将收到的消息转发给所有的客户 ...

  10. 索骥馆-编程语言之《网络编程实用教程(第2版)》扫描版[PDF]

    内容介绍: 本书主要介绍基于tcp/ip协议栈的套接字网络编程技术.全书分为10章,第1章介绍网络编程基础,第2章介绍套接字网络编程接口,第3章介绍windows环境的网络编程,第4章介绍mfc编程, ...

最新文章

  1. android studio安装在其他盘,Android Studio配置移动到D盘(亲测)
  2. 挂隐藏链接的4种代码
  3. 深度剖析WinPcap之(七)——获得与释放网络适配器设备列表(5)
  4. WindowsService 安装后报错: 无法启动计算机“.”上的服务 解决方案
  5. 技术交流论坛_研发部第四次技术交流论坛
  6. P1303 A*B Problem(python3实现)
  7. git版本回退:error: Your local changes to the following files would be overwritten by merge
  8. cxfreeze打包pyqt5程序_基于PyQt5的简单RMSE计算小工具研究
  9. 1203.1——条件语句 之 if语句
  10. 2.1.6 用ProtectX实现扫描的反击与追踪
  11. VirtualBox虚拟机安装教程
  12. 20172301 2017-2018-2 《程序设计与数据结构》第十周学习总结
  13. 第二重要极限公式推导过程_土木考研 土力学第八章公式推导
  14. word文档解密方法
  15. Mybatis的代码
  16. 盛唐气象:李白的诗与酒
  17. 小程序 wepy+MinUI
  18. form表单提交时传递额外的参数
  19. 麒麟820鸿蒙,华为最强千元机:绝版麒麟820+首升鸿蒙2.0+完美全屏!
  20. 日语学习的在线资料,朋友推荐,拿来分享

热门文章

  1. CABasicAnimation 按home键后台之后,再切回来动画就停止
  2. 51nod1417 天堂里的游戏
  3. 中考在即,杂乱的书房
  4. java 调用 c# webservice 压缩 Liststring示例
  5. Ubuntu18.04 evo安装
  6. MySql Odbc等驱动下载地址分享下
  7. Bash : 冒泡排序
  8. Linux从入门到精通——Linux中的补充知识点
  9. (3.13)常用知识-元数据函数
  10. 浅谈商品推荐:如何猜中用户的心思?