资源描述
,201,9,基于C#的可视化编程基础教程,201,9,第一章,C#,基础,C#,基础,值类型,引用数据类型,枚举类型,基本概念、数据类型,循环语句:,while,循环、,do.while,循环、,for,循环,跳转语句:,break,语句、,continue,语句、,goto,语句、,return,语句,循环与跳转语句,类的概念、声明,封装、继承、多态,类与对象,ArrayList类,Hashtable类,集合、命名空间,第一章,C#,基础,1.1,C#概述,C#是微软公司推出的一种语法简洁、类型安全的面向对象的编程语言,可以通过它编写在.NET Framework 上运行的各种安全可靠的应用程序。近几年C#的使用人数呈现上升趋势,这也说明了C#语言正在被更多人所认同。C#有以下特点:,a.语法简洁。不允许直接操作内存,去掉了指针操作。,b.,面向对象的设计。封装、继承和多态。,c.与Web紧密结合。支持绝大多数的Web标准,如:HTML、XML、SOAP等。,d.强大的安全机制。,e.兼容性。因为C#遵循.NET的公共语言规范,从而能够保证与其他语言开发的组件兼容。,f.灵活的版本处理技术。C#语言本身内置了版本控制功能,因此开发人员能更加容易地开发和维护应用程序。,g.完善的错误、异常处理机制。C#提供了完善的错误异常处理机制,使程序在交付使用时能够更加健壮。,第一章,C#,基础,1.1,C#概述,例【1.1】使用Visual Studio和C#语言来编写第一个程序,程序在控制台上显示字符串“Hello World!”,第一章,C#,基础,创建一个控制台应用程序,使用WriteLine方法输出“Hello World!”字符串。,static void Main(string args)/在main方法下编写代码输出数据,Console.WriteLine(“Hello World!”);/输出“Hello World!”,Console.ReadLine();,值类型,数据类型,值类型变量直接存储其数据值,主要包含整数类型、浮点类型以及布尔类型等。值类型变量在堆栈中进行分配,引用类型,引用类型是构建C#应用程序的主要对象类型数据。在应用程序执行过程中,预先定义的对象类型以new创建对象实例,并存储在堆栈中。,枚举类型,枚举类型是一种独特的值类型,它用于声明一组具有相同性质的常量。编写与日期相关的应用程序时,经常需要使用年、月、日、星期等数据,可以将这些数据组织成多个不同名称的枚举类型。,第一章,C#,基础,1.,2,基本数据类型,第一章,C#,基础,值类型,整数类型,类 型,说 明,范 围,sbyte,8位有符号整数,-128127,short,16位有符号整数,-3276832767,int,32位有符号整数,-21474836482147483647,long,64位有符号整数,-92233720368547758089223372036854775807,byte,8位无符号整数,0255,ushort,16位无符号整数,065535,uint,32位无符号整数,04294967295,ulong,64位无符号整数,018446744073709551615,整数类型代表一种没有小数点的整数数值,在C#中内置的整数类型如表1-1所示。,表1-1 C#内置的整数类型,第一章,C#,基础,浮点类型变量主要用于处理含有小数的数值数据,浮点类型主要包含float和double两种数值类型。,表1-2 浮点类型及描述,类 型,说 明,范 围,float,精确到7位数,1.510-453.41038,double,精确到1516位数,5010-3241.710308,布尔类型主要是用来表示true/false值,一个布尔类型的变量,其值只能是true或者false,不能将其他的值指定给布尔类型变量,布尔类型变量不能与其他类型进行转,值类型,浮点类型,值类型,布尔类型,第一章,C#,基础,引用类型是构建C#应用程序的主要对象类型数据。在应用程序执行过程中,预先定义的对象类型以new创建对象实例,并存储在堆栈中。引用类型具有如下特征:,a.必须在托管堆中为引用类型变量分配内存。,b.必须使用关键字new来创建引用类型变量。,c.在托管堆中分配的每个对象都有与之相关联的附加成员,这些成员必须被初始化。,d.引用类型变量是由垃圾回收机制来管理的。,e.多个引用类型变量可以引用同一对象,这种情形下,对一个变量的操作会影响另一个变量所引用的同一对象。,f.引用类型被赋值前的值都是null。,所有被称为“类”的都是引用类型,主要包括类、接口、数组和委托。下面通过一个实例来演示如何使用引用类型。,引用类型,第一章,C#,基础,枚举类型是一种独特的值类型,它用于声明一组具有相同性质的常量。编写与日期相关的应用程序时,经常需要使用年、月、日、星期等数据,可以将这些数据组织成多个不同名称的枚举类型。,C#中使用关键字enum声明枚举,其形式如下:,大括号中的内容为枚举值列表,每个枚举值均对应一个枚举值名称,value1valueN为整数数据类型,list1listN为枚举值的标识名称。,枚举类型,enum 枚举名,list1=value1,l,ist2=value2,l,ist3=value3,.,listN=valueN,循环语句,while,语句、,do.while,语句、,for,语句、,foreach,语句,跳转语句,break,语句、,continue,语句、,goto,语句、,return,语句,点击此处添加标题内容,1.3,循环与跳转语句,循环语句主要用于重复执行嵌入语句,在C#中,常见的循环语句有while语句、do.while语句、for语句和foreach语句。,第一章,C#,基础,循环语句,while(【布尔表达式】),【语句块】,1.while,语句,执行顺序:,(1)计算【布尔表达式】的值。,(2)如果【布尔表达式】的值为true,程序执行【语句块】。执行完毕重新计算【布尔表达式】的值是否为true。,(3)如果【布尔表达式】的值为false,则控制将转移到while语句的结尾。,【例1.5】创建一个控制台应用程序,声明一个int类型的数组,并初始化数组,然后通过while语句循环输出数组中的所有成员。,第一章,C#,基础,循环语句,static void Main(string args),int num=new int61,2,3,4,5,6;/声明一个int类型的数组并初始化,int s=0;/声明一个int类型的变量s并初始化,while(s6)/调用while语句,当s小于6时执行,Console.WriteLine(“num0的值为1”,s,nums);,s+;/s自增1,Console.ReadLine();,第一章,C#,基础,循环语句,do,【语句块】,while(【布尔表达式】);,2.do.while语句,执行顺序:,(1)程序首先执行【语句块】。,(2)当程序到达【语句块】的结束点时,计算【布尔表达式】的值,如果【布尔表达式】的值是true,程序跳到do.while语句的开头,否则,结束循环。,【例1.6】创建一个控制台应用程序,声明一个bool类型的变量term,并初始化为false,再声明一个int类型的数组,并初始化,然后调用do.while语句,通过for语句循环输出数组中的值。,第一章,C#,基础,static void Main(string args),bool term=false;/声明一个bool类型的变量term并初始化为false,int myArray=new int50,1,2,3,4;/声明一个int类型数组并初始化,do,for(int i=0;imyArray.Length;i+)/调用for语句输出数组中所有数据,Console.WriteLine(myArrayi);/输出数组中的数据,while(term);/设置do.while语句的条件,Console.ReadLine();,第一章,C#,基础,循环语句,for(【初始化表达式】;【条件表达式】;【迭代表达式】),【语句块】,3,.,for,语句,执行顺序:,(1)如果有【初始表达式】,则按变量初始值设定项或语句表达式的书写顺序指定它们,此步骤只执行一次。,(2)如果存在【条件表达式】,则计算它。,(3)如果不存在【条件表达式】,则程序将转移到嵌入语句。如果程序到达了嵌入语句的结束点,按顺序计算for迭代表达式,然后从上一个步骤中for条件的计算开始,执行另一次迭代。,第一章,C#,基础,static void Main(string args),int myArray=new int50,1,2,3,4;,for(int i=0;i,检查左操作数的值是否大于右操作数的值,如果是则条件为真,(a b)不为真,检查左操作数的值是否小于右操作数的值,如果是则条件为真,(a=,检查左操作数的值是否大于等于右操作数的值,如果是则条件为真,(a=b)不为真,=,检查左操作数的值是否小于等于右操作数的值,如果是则条件为真,(a=b)为真,!,检查左操作数的值是否不小于右操作数的值,如果是则条件为真,(a!,检查左操作数的值是否不大于右操作数的值,如果是则条件为真,(a!b)为真,运算符,描述,AND,AND 运算符允许在一个 SQL 语句的 WHERE 子句中的多个条件的存在,BETWEEN,BETWEEN 运算符用于在给定最小值和最大值范围内的一系列值中搜索值,EXISTS,EXISTS 运算符用于在满足一定条件的指定表中搜索行的存在,IN,IN 运算符用于把某个值与一系列指定列表的值进行比较,NOT IN,IN 运算符的对立面,用于把某个值与不在一系列指定列表的值进行比较,LIKE,LIKE 运算符用于把某个值与使用通配符运算符的相似值进行比较,GLOB,GLOB 运算符用于把某个值与使用通配符运算符的相似值进行比较。GLOB 与 LIKE 不同之处在于,它是大小写敏感的,NOT,NOT 运算符是所用的逻辑运算符的对立面。比如 NOT EXISTS、NOT BETWEEN、NOT IN,等等。它是否定运算符,OR,OR 运算符用于结合一个 SQL 语句的 WHERE 子句中的多个条件,IS NULL,NULL 运算符用于把某个值与 NULL 值进行比较,IS,IS 运算符与=相似,IS NOT,IS NOT 运算符与!=相似,|,连接两个不同的字符串,得到一个新的字符串,UNIQUE,UNIQUE 运算符搜索指定表中的每一行,确保唯一性(无重复),表,1,比较运算符,表,2,逻辑运算符,5.3,SQLite的SQL语法,S,ELECT,语句,SQLite的SELECT语句的基本语法如下:,SELECT column1,column2,columnN FROM table_name;,在这里column1,column2.是表的字段,它们的值即是要获取的值。如果想获取所有可用的字段,那么可以使用下面的语法:,SELECT*FROM table_name;,【例5.7】查询学生表的所有未删除信息。,select*from students where isdelete=0;,【例5.8】查询未删除学生的姓名和年龄。,select name,age from students where isdelete=0;,5.3,SQLite的SQL语法,U,PDATE,语句,语法如下:,UPDATE table_name,SET column1=value1,column2=value2.,columnN=valueN,WHERE condition;,【例5.9】将id为5的学生姓名修改为张三,年龄修改为33。,update students set name=张三,age=33 where id=5;,【例5.10】对id为5的学生进行逻辑删除,并查询所有未删除的学生信息。,update students set isdelete=1 where id=5;,select*from students where isdelete=0;,5.3,SQLite的SQL语法,D,ELETE,语句,语法如下:,DELETE FROM table_name,WHERE condition;,【例5.11】删除id为5的学生信息。,delete from students where id=5;,说明,:在开发中,为了避免信息被误删和重要数据的丢失,常常采用逻辑删除的方式而不是真正的物理删除。,5.3,SQLite的SQL语法,L,IKE,语句,如果搜索表达式与模式表达式匹配,LIKE运算符将返回真(true),也就是1。这里有两个通配符与LIKE运算符一起使用:,百分号(%):,零个、一个或多个数字或字符。,下划线(_):一个单一的数字或字符。这些符号可以被组合使用。,【例5.12】查询学生信息中姓名以红结尾的信息。,select name,age from students where name like%红;,【例5.13】添加一条信息,姓名为王晓红,年龄为22。随后进行查询。,(1)姓名以红结尾的学生信息,(2)姓名以红结尾的姓名为两个字的学生信息,(3)姓名以王开头的学生信息,语句如下:,insert into students values(null,王晓红,22,0);,(1):select name,age from students where name like%红;,(2):select name,age from students where name like _红;,(3):select name,age from students where name like 王%;,5.4,C#调用SQLite接口,SQLite.NET也是一个数据访问组件,其中System.Data.SQLite就如.NET自带的System.Data.SqlClient一样。里面包含connection、command等数据访问的常用对象,只是它们前面都有一个前缀sqlite。,具体步骤如下,(1)下载正确版本的SQLite,32位或64位;,(2)下载SQLite操作驱动dll:System.Data.SQLite;,(3)将项目属性里面的生成平台目标改成x64,如果是32位则不用此操作;,(4)一般来说,数据库的操作的代码,都是写在类库里面的。,需要注意的是:,在编写对SQLite使用的类库时,在类库中只需引用System.Data.SQLite.dll,文件放在什么地方无所谓,只要能引用就行。,5.4,C#调用SQLite接口,创建应用控制台程序,如下图15。,在解决方案中找到引用,再引用上右键,选择添加引用,出现界面如图16。,在图16中选择浏览,然后找出当前存放System.Data.SQLite.dll文件所在位置,如图17(根据个人的文件所在位置),然后将其添加到引用中。,图,15,图,16,图,17,5.4,C#调用SQLite接口,图,18 创建,highscores表,图,19 添加数据并查询,图,20 Program中添加updateScores(),【例5.14】创建一个应用控制台程序,然后实现创建数据库、链接数据库、创建表、添加数据、查询数据、修改数据、删除数据的功能。,图,21 Program中添加deleteScores(),5.5,习题,1、通过SQLite Studio界面,创建一个名为testdb的数据库,在创建好的数据库中创建一个名为sudent的表,并在其中添加id、name、age属性。,2、通过SQLite Studio界面,利用,SQL,语句完成对数据库的增、删、改、查操作。,3、创建应用控制台程序,通过C#调用SQLite接口,完成创建数据库、创建表以及完成对数据库的增、删、改、查操作。,201,9,第六章 网络编程基础,网络编程基础,TCP、UDP、IP、ICMP,TCP/IP简介,6.2.1 什么是Socket,6.2.2 Socket相关概念,Socket编程基础,6.3.1 UDP介绍,6.3.2 N,ET,平台对UDP编程的支持,6.3.3 UDP编程的具体实现,基于UDP的数据传输,实例:实现一个客户端与服务器间的通信程序,基于TCP的数据传输,第六章 网络编程基础,6.1,TCP/IP简介,TCP/IP的全称是Transmission Control Protocol/Internet Protocol。中译名是传输控制协议/因特网互联协议,TCP/IP这个协议是Internet国际互联网络的基础。因此,更准确的名字应该叫网络通信协议。TCP/IP是网络中使用的基本的通信协议。虽然从名字上看TCP/IP包括两个协议,即TCP协议(Transmission Control Protocol)和IP协议(Internet Protocol)。但是TCP/IP实际上是一个协议簇,它包括了上百个各种功能的协议。,在TCP/IP中包含一系列用于处理数据通信的协议:,a.TCP(传输控制协议)-应用程序之间通信,b.UDP(用户数据包协议)-应用程序之间的简单通信,c.IP(网际协议)-计算机之间的通信,d.ICMP(因特网消息控制协议)-针对错误和状态,6.1,TCP/IP简介,TCP,TCP是面向连接的通信协议,通过三次握手建立连接,通信完成时要拆除连接,且只能用于端到端的通信。,提供一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输。,采用一种称为“滑动窗口”的方式进行流量控制。,所谓窗口实际表示接收能力,用以限制发送方的发送速度。,面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性。DNS在某些情况下使用TCP(发送和接收域名数据库),但某些情况下使用UDP(传送有关单个主机的信息)。,01,6.1,TCP/IP简介,UD,P,UDP是面向无连接的通信协议,UDP数据包括目的端口号和源端口号信息,由于通信不需要连接,所以可以实现广播发送。,UDP通信时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。,UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。,因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询-应答的服务,例如NFS。,UDP的服务包括:,NTP,(网络时间协议)和,DNS,(DNS也使用TCP)。欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手),也就是说,与UDP相关的服务面临着更大的危险。,02,6.1,TCP/IP简介,IP,IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层-TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是否按顺序发送的或者有没有被破坏,IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。,高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。,对于一些TCP和UDP的服务来说,使用了该选项的IP包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。,03,6.1,TCP/IP简介,ICMP,ICMP与IP位于同一层,它被用来传送IP的控制信息。,它主要是用来提供有关通向目的地址的路径信息。,ICMP的Redirect信息通知主机通向其他系统的更准确的路径,而Unreachable信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接终止。,PING是最常用的基于ICMP的服务。,04,6.2,Socket编程基础,1,.,什么是Socket,Socket的英文原意是“孔”或“插座”。作为进程通信机制,取后一种意思。通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄(其实就是两个程序通信用的)。,Socket非常类似于电话插座。,电话网为例:,电话的通话双方相当于相互通信的两个程序,电话号码就是IP地址。,流式套接字(SOCK_STREAM),1.,提供了一种可靠的、面向连接的双向数据传输服务。,2.,实现了数据无差错,无重复的发送,内设流量控制,被传输的数据被看作无记录边界的字节流。,3.,在TCP/IP协议簇中,使用TCP实现字节流的传输,当用户要发送大批量数据,或对数据传输的可靠性有较高要求时使用流式套接字。,数据报套接字(SOCK_DGRAM),1.,提供了一种无连接、不可靠的双向数据传输服务。,2.,数据以独立的包形式被发送,并且保留了记录边界,不提供可靠性保证。,3.,数据在传输过程中可能会丢失或重复,并且不能保证,数据,在接收端按发送顺序接收。,4.,在TCP/IP协议簇中,使用UDP实现数据报套接字。,原始套接字(SOCK_RAW),该套接字允许对较低层协议(如IP或ICMP)进行直接访问。一般用于对TCP/IP核心协议的网络编程。,6.2,Socket编程基础,套接字分类,为了满足不同程序对通信质量和性能的要求,一般的网络系统都提供了以下3种不同类型的套接字,以供用户在设计程序时根据不同需要来选择:,6.2,Socket编程基础,2.,Socket相关概念,(1),端口,在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务(应用程序),因此,在网络协议中使用端口号识别主机上不同的进程。例如:http使用80端口,FTP使用21端口。,(2),协议,TCP:是一种面向连接的、可靠的,基于字节流的传输层通信协议。为两台主机提供高可靠性的数据通信服务。它可以将源主机的数据无差错地传输到目标主机。但TCP传输的效率比较低。,UDP:一种简单的、面向数据报的无连接的协议,提供的是不一定可靠的传输服务。所谓“无连接”是指在正式通信前不必与对方先建立连接,不管对方状态如何都直接发送过去。,UDP虽然不能保证数据传输的可靠性,但数据传输的效率较高。,6.2,Socket编程基础,a.TCP的工作过程,b.传输数据,c.TCP的主要特点,d.同步与异步,TCP是面向连接的协议,TCP协议通过三个报文段完成类似电话呼叫的连接建立过程,这个过程称为三,次,握手,.,1.,通信双方建立TCP连接,连接中的任何一方都能向对方发送数据和接收对方发来的数据。,2.,TCP协议负责把用户数据(字节流)按一定的格式和长度组成多个数据报进行发送,并在接收到数据报之后按分解顺序重新组装和恢复用户数据。,3.,利用TCP传输数据时,数据是以字节流的形式进行传输的。,1.,面向连接的协议,2.端到端的通信,3.高可靠性,4.全双工方式传输,5.数据以字节流的方式传输,6.传输的数据无消息边界,1.,同步工作方式是指利用TCP编写的程序执行到监听或接收语句时,在未完成工作(侦听到连接请求或收到对方发来的数据)前不再继续往下执行,线程处于阻塞状态,直到该语句完成相应的工作后才继续执行下一条语句。,2.,异步工作方式是指程序执行到监听或接收语句时,不论工作是否完成,都会继续往下执行。,TCP,6.2,Socket编程基础,UDP,UDP可靠性不如TCP,TCP包含了专门的传递保证机制,.,UDP并不提供数据传送的保证机制。,UDP不能保证有序传输,UDP不能确保数据的发送和接收顺序。对于突发性的数据报,有可能会乱序。,UDP速度比TCP快,UDP不需要先与对方建立连接,也不需要传输确认,因此其数据传输速度比TCP快得多。,UDP有消息边界,发送方UDP对应用程序交下来的报文,在添加首部后就向下直接交付给IP层。既不拆分,也不合并,而是保留这些报文的边界。,UDP可以一对多传输,由于传输数据不建立连接,也就不需要维护连接状态(包括收发状态等),因此一台服务器可以同时向多个客户端传输相同的消息。,UDP与TCP的区别,UDP的优势,6.2,Socket编程基础,总结,速度快,是UDP的首要优势,由于TCP协议中植入了各种安全保障功能,在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重影响。,反观UDP,由于,抛弃了信息可靠传输机制,,将安全和排序等功能移交给上层应用完成,极大地降低了执行时间,使速度得到了保证。,简而言之,UDP的“理念”就是“不顾一切,只为更快地发送数据”。,6.3,基于UDP的数据传输,1.,UDP介绍,UDP和TCP都是构建在IP层之上传输层的协议。,UDP是一种,简单、面向数据报,(Sock_Dgram)的无连接协议,提供的是不一定可靠的传输服务。,TCP是一种面向连接、可靠的,面向字节流(Sock_Stream)的传输协议,对于“无连接”是指在正式通信前不必与对方先建立连接,不管对方状态如何都可以直接发送过去。,从UDP和TCP的定义中可以看出它们两者的区别,UDP的可靠性不如TCP,因为TCP传输前要首先建立连接,这样就增加了TCP传输的可靠性,所以UDP也被称为不可靠的传输协议。,另外UDP不能保证有序传输,即UDP不能确保数据的发送和接收顺序。,2,.,N,ET,平台对UDP编程的支持,简单介绍.,NET,平台下对UDP编程的支持(主要介绍提供的类来对UDP协议进行编程)。,.Net类库中的UdpClient类对基础的Socket进行了封装,这样就在发送和接受数据时不需要考虑底层套接字的收发时处理的一些细节问题,这样为UDP编程提供了方便,也可以提高开发效率。,6.3,基于UDP的数据传输,3,.,UDP编程的具体实现,UDP进程在通信之前是不需要建立连接,消息接收方可能并不知道是谁给它发的消息,因此UDP编程分为两种模式:,一种是“实名发送”,即接收方可以由收到的消息得知发送方进程端口。,另一种则为“匿名发送”,即接收方并不知道发给它信息的远程进程究竟来自哪个端口。,下面通过一个,W,in,F,orm 程序来演示UDP的编程。,6.3,基于UDP的数据传输,运行结果:,(,1,)实名发送:在本地运行本程序的三个进程(分别为A、B、C),把进程C作为接收进程,进程A和进程B都向进程C发送信息,进程A和进程B分别绑定端口号为11883和21883,发送到端口都为51883,配置界面如图,1,所示。,图,1 配置界面,6.3,基于UDP的数据传输,首先不勾选“匿名”复选框,在进程C中单击“接收”按钮开启收线程,在A进程和B进程的发送消息框里分别输入“你好,我是1”和“你好,我是2”,然后单击,“,发送,”,按钮,此时在进程中就可以看到进程A和进程B发来的消息,如图,2,所示。,图,2 不勾选“匿名”发送消息,6.3,基于UDP的数据传输,匿名发送:下面,勾选,“匿名”复选框,再按照前面的步骤将得到下图,3,所示的结果。,图,3 匿名发送消息,6.4,基于TCP的数据传输,运行结果:,(1),首先先启动服务器然后单击,“,开始监听,”,按钮,,此时线程会阻塞,直到接受到一个连接请求为止;,(2),然后运行客户端,在IP地址和端口处输入服务器端的IP地址和端口号,点击连接服务器按钮,通过,“,接受,”,按钮和,“,发送,”,按钮来实现双方的通信,实现界面如图,4,所示。,实例:简单实现一个客户端与服务器间的通信程序。,图,4 实现双方的通信,6.5,习题,1,.,请简述TCP连接过程以及其断开的过程。,2,.,请简述TCP与UDP的区别。,3,.,创建窗体应用程序,完成基于UDP协议的Socket通信功能。,4,.,创建窗体应用程序,完成基于TCP协议的Socket通信功能。,
展开阅读全文