黑马程序员 c#学习12

黑马程序员 C#学习笔记① 使用WPF实现简易计算器 ---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------     目的:运用一些WPF和C#基础知识实现一个能够进行整数加减乘除运算的计算器程序     功能:(1) 能够通过点击界面按钮在程序中输入数字并显示;          (2) 在处理6+5+这种输入组合, 会将前面的算式先进行计算 阅读详情
Windows Phone 7手机开发、 .Net培训、期待与您交流!
1、套接字  socket 

   socket用于进程间的互相通信,是一种通信机制, 用来描述IP地址和端口信息的。

   类型 :


   流式  socket   面向连接式的  针对面向连接的TCP服务应用,安全,但是效率较低


   报文  socket   面向非连接的,针对无连接的UDP服务应用,效率高,但是安全性能比较低。


2、通信过程


   服务端的套接字:
          
        至少两个:一个用于接收客户端的连接请求,不负责与客户端通信,当成功接收一个连接请求后边产生一个对应的套接
字,负责与客户端套接字通信。


   客户端:只有一个套接字,负责连接服务端的指定端口并与服务端返回的一个通信套接字通信。

    第一步 服务端创建一个监听套接字,并绑定一个节点对象,用于接收客户端的连接请求

    第二步 客户端创建一个套接字,并向服务端指定的端口发送连接请求 

    第三步  服务端接收到连接请求,并产生一个额外的通信套接字来与客户端进行通信,监听套接字就不在于客户端通信了,
他继续监听其他客户端的连接请求

    第四步,客户端通过服务端发来的通信套接字与服务端进行通信。

3、套接字例子  客户端与服务器互相发送消息功能


    服务端  代码及解释如下

      public partial class Form1 : Form
    {
        public Form1 ( )
        {
            InitializeComponent ( );
            TextBox.CheckForIllegalCrossThreadCalls = false;//取消控件在跨线程调用的检查
        }

        Thread threadwatch = null; //创建一个监听线程,用来循环监听客户端的连接请求

        Socket watchsocket = null;//创建一个监听套接字,用来循环监听客户端的连接请求

       // Socket connectsocket = null;

        Dictionary<string, Socket> dict = new Dictionary<string, Socket> ( );//创建一个字典,用来存储当前连接到服务端的客户端信息,键是客户端的IP与端口,值就是对应的socket对象

        private void button1_Click ( object sender, EventArgs e ) //启动服务端
        {
            watchsocket = new Socket ( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );//实例化监听套接字,AddressFamily.InterNetwork 指定了地址类型 SocketType.Stream,指定了套接字类型 ProtocolType.Tcp指定了协议类型

            IPAddress address = IPAddress.Parse ( txtip.Text.Trim ( ) );//创建一个地址对象,包含服务端IP地址信息

            IPEndPoint point = new IPEndPoint ( address, int.Parse(txtport.Text.Trim ( )) );//创建一个节点对象,包含了服务器端的IP地址和端口信息

            watchsocket.Bind (point);  //将监听套接字绑定到节点对象

            watchsocket.Listen ( 10 ); //设置服务端的监听队列,参数表示队列的最大长度

            threadwatch = new Thread ( WatchConnect );   //实例化监听线程,用来循环监听客户端的连接请求,用多线程来执行是为了防止程序在此中断,保证服务端程序可以执行其他任务

            threadwatch.IsBackground = true; //设置监听线程为后台线程,这样在程序退出后该线程会默认结束

            threadwatch.Start ( ); //启动监听线程,开始监听客户端连接请求

            showMsg ( "服务端启动成功" );//显示消息
            
        }
        /// <summary>
        /// 监听线程调用的方法,
        /// </summary>
        void WatchConnect ( )
        {
            while ( true )   //无线循环保证了监听线程可以不断的监听连接请求,不会因为一个客户端连接请求被接受后而中断监听其他客户端的连接请求
            {
                Socket connectsocket = watchsocket.Accept ( ); //当接收一个客户端连接请求后,建立连接并返回一个通信套接字与客户端通信

                dict.Add(connectsocket.RemoteEndPoint.ToString(),connectsocket);//将该通信套接字存入到我们的字典中,以便于发送消息的时候可以选择客户端
                
                lbonline.Items.Add ( connectsocket.RemoteEndPoint.ToString ( ));//将客户端信息显示在列表中,供服务端发送消息是选择客户端

                showMsg ( "客户端连接成功" );

                ParameterizedThreadStart pt1 = new ParameterizedThreadStart ( recmessage );//新建一个带参数的委托,用来接收客户端发来的信息,

                Thread t1 = new Thread ( pt1 );//使用以上带参数委托新建一个线程,用来监听客户端发来的消息

                t1.Start ( connectsocket ); //启动该线程,并将服务端返回给当前客户端连接请求的通信套接字作为参数,以便服务端能区别是谁发来的消息
               
            }
            
        }
        /// <summary>
        /// 服务端用来接收客户端发来的消息的方法,参数为object对象
        /// </summary>
        /// <param name="connectsocket"></param>
        void recmessage (object connectsocket )
        {
            while ( true )       //循环接收客户端发来的消息
            {

                Socket connect = ( Socket ) connectsocket;//将方法的oject对象强制转换成我们的通信套接字对象

                byte[] arrmsg = new byte[1024 * 1024 * 2]; //新建一个字节数组,用来存储客户端发来的消息

                int length = connect.Receive ( arrmsg );//接收客户端发来的消息

                string msgrec = System.Text.Encoding.UTF8.GetString ( arrmsg, 0, length );//将客户端发来的消息解析成字符串

                showMsg ( connect.RemoteEndPoint.ToString ( ) + "发送过来消息:" + msgrec );//显示信息

            }
        
        }
        void showMsg (string msg ) 
        
        {
            txtmsg.AppendText ( msg+"\r\n");
        }

        private void btnsend_Click ( object sender, EventArgs e )  //服务器发送消息给客户端
        {
            string msg = txtmsgsend.Text.Trim ( ); //获取要发送的信息

            byte[] msgbyte = System.Text.Encoding.UTF8.GetBytes ( msg );//将字符串转换成字节数组

            //connectsocket.Send ( msgbyte );

            string strclient = lbonline.Text;//获取服务端选择的客户端 信息

            dict[strclient].Send ( msgbyte );//通过字典查找到客户端对应的通信套接字,发送信息

            showMsg ( "发送了数据:"+msg);
        }
    }

   客户端代码

 public partial class Form1 : Form
    {
        Thread threadrec = null;  //新建一个接受服务端发来消息的线程
        Socket socketclient;//新建一个客户端套接字,用来向服务器发送连接请求与接受消息
        public Form1 ( )
        {
            InitializeComponent ( );
            TextBox.CheckForIllegalCrossThreadCalls = false;//关闭framework对于控件的跨线程调用检查
        }


        private void btncon_Click ( object sender, EventArgs e ) //向服务端发送连接请求
        {

            IPAddress address = IPAddress.Parse ( txtip.Text.Trim());//创建一个地址对象,指明需要连接的服务端的IP地址

            IPEndPoint point = new IPEndPoint ( address, int.Parse ( txtport.Text.Trim ( ) ) );//创建一个节点对象,指定需要连接的服务端的IP地址和端口

            socketclient = new Socket ( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );//实例化套接字,指明地址类型,套接字类型和协议类型

            socketclient.Connect(point);//发送连接请求

            threadrec = new Thread ( receivemsg );//实例化线程,用来接收服务端发来的消息

            threadrec.IsBackground = true;//设置为后台线程

            threadrec.Start ( );//启动线程,开始监听

        }
        /// <summary>
        /// 接收服务端发来的消息
        /// </summary>
        void receivemsg ( )  
        {
            while ( true )
            {
                byte[] arrmsg = new byte[1024 * 1024 * 2];
                int length =  socketclient.Receive ( arrmsg );
                string msgrec = System.Text.Encoding.UTF8.GetString ( arrmsg,0,length );
                showMsg ( msgrec );
            }
        }

        void showMsg ( string msg )
        {
            txtmsg.AppendText ( msg + "\r\n" );
        }
        /// <summary>
        /// 向服务端发送消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnsend_Click ( object sender, EventArgs e )
        {
            string strsend = txtsend.Text.Trim ( );  //取得要发送的消息字符串
            byte[] sendbyte = System.Text.Encoding.UTF8.GetBytes ( strsend);//将字符串转换为字节数组
            socketclient.Send ( sendbyte );//发送消息
        }
    } Windows Phone 7手机开发、 .Net培训、期待与您交流!
黑马程序员考试题 题目一 文本文件中存储了多个文章标题、作者,标题和作者之间用若干空格(数量不定)隔开,每行一个,标题有的长有的短,输出到控制台的时候最多标题长度10,如果超过10,则截取长度8的子串并且最后添加“...”,加一个竖线后输出作者的名字。 namespace test1 { class Program { /*文本文件中存储了多个文章标题、作者,标题和作者之间 阅读详情

相关推荐

黑马程序员—C#系列 (一)

1.学习4句话 Console.Redkey() // 暂停 Console.WriteLine() //输出内容 Console.ReadLine() //请求用户输入 string name = Console.ReadLine();//取得用户输入的内容赋给变量name 2.变量 int i = 0; // 变量只能声明一次,但是可以多次赋值,多次使用 int i8,i9,

BuHuanLiaoxxxxx的专栏 1365

黑马程序员——【C#基础】

---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ---------------------- 总结一下以前不知道的和容易犯错误的 异常处理    public static bool MyTryParse(string str,out int re)         {             try

keda218的专栏 221

惯性导航原理(九)-INS的初始对准-初始姿态确定+双矢量定姿

文章目录INS的初始对准INS初始化静基座/静态粗对准静态粗对准—加速度计调平原理加速度计调平静态粗对准—陀螺罗盘思考初始对准的影响因素双矢量定姿原理静态解析粗对准—双矢量定姿静态解析粗对准(续)其它初始对准方法精对准动对准 INS的初始对准 INS的初始对准为初始化的一部分 INS初始化 初始位置: 给定(INS没有初始位置确定的能力,例如从GPS ) 初始速度: 零(静止状态)或给定 初始姿态: 初始对准(INS有能力自己测资态) 粗对准vs. 精对准 静止状态vs. 运动状态 重要性: 失之毫厘,谬

十八与她的博客 1万+

黑马程序员-C#学习笔记(二)

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- - C#学习笔记 一、变量与表达式 1.变量第一个字母必须是字符、下划线或@,其后就可以字符、数字、下划线。 2.字面值 (1)double为浮点默认字面值,在给float或de...

weixin_34005042的博客 310

VOS3000线路对接、路由配置与路由分析操作教程

通过本教程,你应该已经掌握了VOS3000的线路对接、路由配置和路由分析的基本操作。添加备用路由:为常用前缀添加备用路由,确保在主路由失效时呼叫仍能正常进行。进入线路管理:点击“系统管理” -> “线路管理” -> “添加线路”。查看日志:在“系统日志”中查看路由选择情况,确保路由配置正确。失败原因:查看失败呼叫的原因(如“无应答”、“线路忙”等)。线路选择:选择之前添加的线路(如“供应商A”)。保存并启用:填写完毕后,点击“保存”并启用路由。路由名称:自定义一个名称(如“路由A”)。

AI_wx_3307623172的博客 2974

解决Surface更新后Bitlocker无限循环的问题

在Surface系统更新以后,出现要求输入Bitlocker恢复密钥的问题。已经输入正确密钥以后,依然无法正常进入Windows操作系统,一旦重启依然循环Bitlocker要求输入密钥的界面。 一旦到登录界面,点击“登录”之后又跳转回登录界面.,但就是无法进入桌面。 解决方案: 拒绝暴力重装!这个问题是Bitlock把盘给锁了,所以要解锁 重启之后,直接点击右下角“跳过这个驱动器” 选择“疑难解答”,然后进入命令提示符 先查看判断现在是不是被锁了: 输入: manage-bde -status c

premierapp的博客 1万+

黑马程序员c#学习8

Windows Phone 7手机开发、.Net培训、期待与您交流! 1、 基础sql语句    sql语句字符串用单引号,字段名关键字是大小写不敏感的,但是字段值还是区分大小写的。    分类 DDL(数据定义语言) DCL(数据控制语言) DML(数据操作语言)    DDL: 数据定义语言,主要包括create ,alter ,drop 语句。    DCL: 数据控制语言,主要包

ilovedxt的专栏 435

学Simulink——基于Simulink的扰动观测器(DOB)补偿坡道重力分量

(质量5kg,坡度30°,目标速度1m/s)为例,基于Simulink搭建“DOB+PI”复合控制仿真平台,从系统建模、DOB算法推导、离散化实现到Simulink模块搭建,提供模块化模型、核心代码及参数整定表,帮助工程师彻底解决重力等恒值扰动引起的稳态误差问题。采用双线性变换(Tustin): s=Ts​2​z+1z−1​,其中 Ts​为控制周期。模块相加(注意符号:ufinal​=upi​−ucomp​或 upi​+ucomp​,取决于扰动定义方向,此处假设重力为正,控制力需反向抵消,故为减)。

MHD0815的博客 69

黑马程序员 c#学习10

Windows Phone 7手机开发、.Net培训、期待与您交流! 1、参数化查询    前面使用的查询语句可能会引起sql注入攻击,所谓sql注入攻击,就是用户在输入数据时构造一条sql语句,让查询顺利进行,取消了任何验证逻辑。我们拿登陆程序来试验下。    对于一个登陆模块,通常我们要求用户输入用户名和密码,然后提交到数据库进行验证,    我们假设用户名 为a

ilovedxt的专栏 485

VTK-9.5.0 1D2D3DWidget实现灰度图+深度图+3D点云显示(可轻松集成到自己的项目)

VTK1D2D3DWidget是一个基于Qt和VTK开发的3D点云可视化工具,支持RGB和深度点云数据的显示与处理。主要功能包括点云加载、可视化、保存为PLY格式文件,以及背景颜色、点间隔、坐标轴显示等参数的自定义设置。该工具采用模块化设计,核心组件包括主窗口管理类、VTK渲染组件和自定义鼠标交互样式,依赖Qt5+和VTK9.5.0库实现跨平台支持。项目提供完整的源码和构建指南,适用于点云数据的快速展示与分析。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 386

SAP-ABAP:接口多继承与复合接口设计:复杂业务场景下的能力组合实现方案

本文介绍了ABAP中通过接口多继承与复合接口设计实现能力组合的方案。文章首先辨析了类实现多个接口与接口继承接口的核心概念,指出ABAP虽不支持类多继承,但可通过这两种机制灵活组合能力。随后详细讲解了类实现多个接口的语法规则与三种调用方式,并给出了五个基础能力接口的设计示例(日志记录、权限校验、数据导出、消息通知、格式转换)。作者通过对比单继承与接口多重实现的差异,强调后者在解耦和扩展性上的优势,为复杂业务场景下的能力组合提供了实用解决方案。

baidu_35680696的博客 247

黑马程序员—我和我男朋友在黑马的故事,感谢黑马~~~~~~~~...

文章来源:黑马程序员,黑马论坛 (注:黑马学员发来的毕业感言)   我是一名女生,也是黑马训练营培训出来的一匹最普通的黑马,众马云集又各奔前程。现在的我已找到一份满意的7k工作。每当夕阳西下,结束了一天忙碌的工作,都会想起和他在黑马的充实而快乐的时光。我和我的男朋友来自同一个学校同一个系。本来无缘相识,因为有着共同的编程梦想先手于毕业前夕,现在的他已在搜狐上班,每月12k的工资给我们的

heima_26的专栏 1138

量化交易零基础入门教程

特点 从零开始教编程。靠谱的量化交易学习资源稀少,且具有不讲编程、代码较难、过多等不适合新手等问题,本教程中则会从零开始教编程,解决量化入门过难过编程门槛这一问题。 量化与编程相结合。本教程不仅会教编程,而且会尽量结合量化情景,减少“我要做量化交易为什么要看这些用来培训程序员的东西”的愤懑。 简易精炼,快速入门。尽量只讲最核心最常用的知识,助你快速摆脱想学习量化却处处陌生不知所措的茫然的新手阶段。 读前说明 文后会有自测与自学,包括一些额外的延伸自学内容以及稍有难度的自测题目。 最最最基础的股票.

JanLEE 2888

黑马程序员--一个初中没毕业的苦逼,到8.5k的程序人生,感谢黑马

文章来源:黑马程序员 乡亲们and同学们:                 大家好!         貌似现在感谢信是每个黑马毕业后找到工作的首要任务了!   我是5月份进的黑马,是9期的, 其实感觉从我搭上飞机,落在北京之时这一切都好像做梦似的,我是90年出生的, 属于90后了,我辍学的非常的早,在我上初中二年级的时候就辍学了。       可以说我是一个标准的小学毕业生吧,当时我

heima_hb3的专栏 3144

SPI为什么不需要加上拉电阻

大家好,我是记得诚。I2C因为其开漏的结构,无法输出高电平,所以外部加上拉电阻。我们在使用SPI的时候,发现是不需要加上拉电阻的。主要因为SPI多为推挽的结构,推挽电路,高低电平都可以输出,所以外部不需要加上拉电阻。推挽电路可以用2个三极管或者2个MOS管搭建而成。

记得诚 2629

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

黑马程序员—[.Net就业薪资] 四个班100%就业,.Net学科称霸黑马

文章来源:黑马程序员,黑马论坛 [.Net就业薪资] 四个班100%就业,.Net学科称霸黑马 四个班100%就业,.Net学科称霸黑马 作为.Net学科的就业指导老师,我也曾经被Android等其他学科的薪资真正的震撼到。然而,当我越来越深入到.Net的班级,和学员们打交道越来越多。我现在可以拍着胸脯的告诉每一个人,.Net在班级纪律、就业速度上绝对遥遥领先于黑

heima_88_0822的专栏 1310

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

黑马程序员 C#学习1

Windows Phone 7手机开发、.Net培训、期待与您交流!   1、什么是.net与C#     .net是一门技术,是一个开发平台,在这个平台上,我们可以使用多种开发语言来进行开发。     C# 则是一门语言,是在.net平台下进行程序开发的一门语言。     他们是一种依赖关系,c#是依赖于.net框架的 2、.net能开发什么     使用.net主要可以开发3

ilovedxt的专栏 453

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

黑马程序员—C#基础回顾

---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------   这几天接触到了“黑马程序员”这一培训班,觉得这是个机遇呀。 按照流程通过的申请,下载视频,把C#的基础又复习了一边,把其中比较重要的和自己容易忘记的知识点总结了下来。 1.类的修饰符包括:new,public,protec

wang475383895的专栏 420

黑马程序员_C#编程基础

---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ---------------------- C#编程基础 1.概念:.Net与C# .Net/DotNet: 是一种平台,一种技术。一般指.Net Framework 框架。 C# (sharp): 是一种编程语言。可开发基于.net平台的应用。 (*) Java既是

creating2000的专栏 1042

C#新手该如何规划学习【学习路线指南】

花费了几天时间整理了C#学习路线图,可以说是纯野生C#程序员成长路线规划,在这里分享下,希望可以帮助到想从事C#开发的同学们。本人阅历尚浅,有些知识点可能分享不正确,希望广大网友评论区补充,我会同步修正更新。题记最近自己一直在想,一个初学者刚开始应该学些什么,该学习到哪种程度找工作才不成问题,才能在做项目时游刃有余不被Bug所困住。是不是每一个初学者在刚开始学习任何一门编...

zls365365的博客 1万+

黑马程序员——C#基础视频笔记(苏昆老师的视频)

1.显示行号:工具-〉选项-〉文本编辑 2.恢复设置:工具-〉导入导出设置-〉重置所有设置 3.快捷键:home:行起始       end:行末尾       pageUp:上一页       pageDown:下一页       shift+home:向前选中本行       shift+end:向后选中本行       shift+pageUp:……       ……  

WayToAccept的专栏 1672

黑马程序员——C#基础

---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------------- 1.创建一个控制台应用程序: 打开 visual studio 2012,依次选择【文件】->【新建】->【项目】(也可同时按下Ctrl+Shift+N快捷键进入此界面)。选择“其他项目类型”栏目下的“Visu

u011184588的专栏 824

[黑马程序员]c#基础学习笔记

------- WindowsPhone 7手机开发、.Net培训、期待与您交流! ------- .net指.net Framework框架,一种技术,一种平台 c#语言 .net可以开发桌面应用程序(Winform),Internet应用程序(asp.net、WebServer),手机开发wp7 .cs表示是类文件 Console.ReadKey();程序停在这里等待用户从键

dan810103的专栏 1195

黑马程序员_学习日记1_C#基础

---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ---------------------- 优快云终于可以发帖了,把前几天的补上...... 4月12日 今晚网速很慢,下黑马视频很卡,我下了一本《C#基础教程》的电子书来学习,做笔记如下: 一、IL(Microsoft中间语言)的五大特性: 1、实现给定接口的类,必须

Jack's Domain 528

黑马程序员——C#基础总结笔记

---------------------- http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训、期待与您交流! ---------------------- 1..net与C#的关系 .net框架是一种平台,一种技术    

u013681984的专栏 808
上一篇: 黑马程序员 c#学习11
下一篇: 黑马程序员 c#学习13
ilovedxt
博客等级 码龄14年 2粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值