复习题new

更新时间:2023-11-21 23:26:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一、选择题

1、下列关于构造函数的描述正确的是( C ) A、构造函数可以声明返回类型。(不可以申明返回类型)

B、构造函数不可以用private修饰 (一般是用public,但也可以用private) C、构造函数必须与类名相同

D、构造函数不能带参数 (可以带数)

2、接口是一种引用类型,在接口中可以声明( A ),但不可以声明公有的域或私有的成员变量。

A、方法、属性、索引器和事件 B、方法、属性信息、属性 C、索引器和字段 D、事件和字段; 3、下列描述错误的是( D )

A、类不可以多重继承而接口可以;

B、抽象类自身可以定义成员而接口不可以; C、抽象类和接口都不能被实例化;

D、一个类可以有多个基类和多个基接口;(一个基类和实例化多个接口)

4、在C#中设计时,如何将一个可读写的公有属性Nmae修改为只读属性?( C ) A、为Nmae添加修饰符 B、将Nmae的set块置空

C、将Nmae的set块删除 D、在Nmae的set块前加修饰符pravite 5、以下关于ref和out的描述不正确的是?( B )

A、使用ref参数,传递到ref参数的参数必须最先初始化。

B、使用out参数,传递到out参数的参数必须最先初始化。(使用out表明该引用参数是用来输出的,调用时不需要对参数进行初始化)

C、使用ref参数,必须将参数作为ref参数显式传递到方法。 D、使用out参数,必须将参数作为out参数显式传递到方法。 6、下列关于C#中索引器理解正确的是( C )

A、索引器的参数必须是两个或两个以上(只要形参个数与类型不一样都可以 )

B、索引器的参数类型必须是整数型(C#并不将索引类型限制为整数)

C、索引器没有名字(索引器声明类似于属性声明,主要区别是索引器是无名称的 使用this关键字) D、以上皆非

7、在C#中设计类时,应如何保证在释放对象的所有引用之前,释放对象使用的文件、网络等资源?(A)

A、为类添加析构函数,在析构函数中释放资源 B、为类重载new运算符 C、为IDisposable实现接口 D、为类添加delete运算符

8、要创建多文档应用程序,需要将窗体的( D )属性设为true。 A、DrawGrid; B、ShowInTaskbar; C、Enabled; D、IsMdiContainer

9、.变量openFileDialog1 引用一个OpenFileDialog 对象.为检查用户在退出对话框时是否单击了“打开”按钮,应检查openFileDialog1.ShowDialog()的返回值是否等于( A )。

A、DialogResult.OK B、DialogResult.Yes C、DialogResult.No D、DialogResult.Cancel

10、C#程序中,为使变量myForm 引用的窗体对象显示为对话框,必须: ( C ) A、使用myForm.ShowDailog 方法显示对话框 (好像myForm.Show也行) B、 将myForm 对象的isDialog 属性设为true

C、将myForm 对象的FormBorderStyle 枚举属性设置为FixedDialog D、将变量myForm 改为引用System.Windows.Dialog 类的对象

11、在C# Windows表单应用程序中,如何将一个对话框对象myDialog显示为模态对话框?(B) A、调用myDialog.Show();

B、调用myDialog.ShowDialog ();

C、调用System.Forms.Dialog.Show(myDialog); D、调用System.Forms.Dialog.Show(myDialog);

12、变量nenuItem1引用一个菜单项对象,为隐藏该菜单项,应进行何种操作?( A )

A、nenuItea1.Visible=false B、nenuIteal.Enabled=false C、nenuIteal.Checked=false D、nenuIteal..Test=\

13、创建菜单后,为了实现菜单项的命令功能,应为菜单项添加( C )事件处理方法.

A、DrawIten B、Popup C、Click D、Select 14、如果设treeView1=new TreeView(),则treeView1.Nodes.Add(\根节点\返回的是一个 ( A )类型的值。 A、TreeNode B、int

C、string D、TreeView

15、变量menuItem1引用一个菜单项对象.为使该菜单项变为“灰色不可选”状态, 应对menuItem1的哪个属性进行操作?( A ) A、Enabled B、Checked C、Visible D、Text 16、 以下叙述正确的是:( C )

A、接口中可以有虚方法。 B、一个类只能实现一个接口。 C、接口不能被实例化。 D、接口中可以包含已实现的方法。 17、从数据库读取记录,你不可能用到的方法是:( A) A、ExecuteNonQuery B、ExecuteScalar C、Fill D、ExecuteReader 18、在对SQL Server 数据库操作时应选用( A ) A、SQL Server .NET Framework 数据提供程序; B、OLE DB .NET Framework 数据提供程序; C、ODBC .NET Framework 数据提供程序; D、Oracle .NET Framework数据提供程序; 19、下列选项中,( C )是引用类型。

A、enum类型 B、struct类型 C、string类型 D、int类型 20、C#的数据类型有( B )

A、值类型和调用类型; B、值类型和引用类型; C、引用类型和关系类型; D、关系类型和调用类型;

21、C#程序中,可使用try..catch 机制来处理程序出现的( B )错误。 A、语法 B、运行 C、逻辑 D、拼写

22、int[][] myArray3=new int[3][]{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}}; myArray3[2][2]的值是( D )。 A、9 B、2 C、6 D、越界

23、.如果将窗体的FormBoderStyle设置为None,则( )。

A、窗体没有边框并不能调整大小; B、窗体是透明的;

C、窗体有边框但不能调整大小; D、窗体没有边框但能调整大小; 24、.如果要将窗体设置为透明的,则( )

A、要将FormBoderStyle属性设置为None; B、要将Opacity属性设置为小于100%得值; C、要将locked 属性设置为True; D、要将 Enabled属性设置为True;

25、C#中,在方法MyFunc 内部的try..catch 语句中,如果在try 代码块中发生异常,并且在当前的所有catch 块中都没有找到合适的catch 块,则( C ) A、.NET 运行时忽略该异常

B、.NET 运行时马上强制退出该程序

C、.NET 运行时继续在MyFunc 的调用堆栈中查找提供该异常处理的过程 D、 .NET 抛出一个新的”异常处理未找到”的异常 26、装箱、拆箱操作发生在: ( C )

A、类与对象之间 B、对象与对象之间

C、引用类型与值类型之间 D、引用类型与引用类型之间 27、用户自定义异常类需要从以下哪个类继承:( A ) A、Exception B、CustomException C、ApplicationException D、BaseException 28、在C#程序中,显示一个信息为”This is a test!”, 标题为”Hello”的消息框,正确的语句是( B )。

A、MessageBox(“This is a test!”, “Hello”) ; B、MessageBox.Show(“This is a test!”, “Hello”) ; C、MessageBox(“Hello”,”This is a test!”) ; D、MessageBox.Show(“Hello”,”This is a test!”) ;

30、在使用FileStream 打开一个文件时,通过使用FileMode 枚举类型的( A )成员,来指定操作系统打开一个现有文件并把文件读写指针定位在文件尾部。 A、 Append B、 Create C、CreateNew D、Truncate

32、变量openFileDialog引用一个OpenFileDialog对象,为检查用户是否单击了“打开”按钮而退出该对话框,应检查框,应检查(D)是否等于OpenFileDialog.OK。

A、OpenFileDialog.Site属性的值 B、OpenFileDialog.Result属性的值 C、OpenFileDialog.OpenFile()的返回值 D、OpenFileDialog1.ShowDialog()的返回值

33、变量openFileDialog引用一个openFileDialog对象. 为使该对话框可以同时打开多个文件,应在显示对话框前将( C )属性的值设为ture. A、 FileName B、FileNames

C、Multiselect D、Multifiles

34、在C#中,将路径名”C:\\Documents\\”存入字符串变量path中的正确语句是( A )

A、path = “C: \\\\Docments\\\\“; B、path = “C: //Document//”; C、path = “C:\\Document\\”; D、path = “C:\\/Document\\/”;

35、cmd 是一个SqlCommand 类型的对象,并已正确连接到数据库MyDB.为了在遍历完SqlDataReader 对象的所有数据行后立即自动释放cmd 使用的连接对象,应采用下列哪种方法调用ExecuteReader 方法。( D ) A、SqlDataReader dr = cmd.ExecuteReader( ); B、 SqlDataReader dr = cmd.ExecuteReader(true); C、 SqlDataReader dr = cmd.ExecuteReader(0);

D、SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 36、下列那个不可以在DataSet 对象ds 中添加一个名为\的DataTable 对象( A )

A、DataTable dt_customers = new DataTable();

B、 DataTable dt_customers = new DataTable(\ds.Tables.Add(dt_customers); C、ds.Tables.Add(\

D、ds.Tables.Add(new DataTable(\

37、dt 为DataTable 类型的变量,引用名为\的DataTable 对象。该表中包含\,\,\,\等4 列。将数据列\设为该表的主键的正确语句有: ( D ) A、dt.PrimaryKey = \ B、dt.PrimaryKey.Add(\

C、 dt.PrimaryKey = new object[]{\

D、dt.PrimaryKey = new DataColumn[]{dt.Columns[\

38、已知ds 为数据集对象。以下语句的作用是(A)。 ds.Tables[\

UniqueConstraint(\A、为表\添加一个由列\组合成的主键约束 B、为表\添加一个由列\组合成的唯一性约束

C、为数据集ds 添加一个名为\的数据表,并添加两个列,列名分别为\和\

D、为数据集ds 添加一个名为\的数据表,并添加一个名为\的数据列

39、在DataSet 中,若修改某一DataRow 对象的任何一列的值,该行的DataRowState 属性的值将变为( D )

A、DataRowState.Added B、DataRowState.Deleted C、DataRowState.Detached D、DataRowState.Modified

40、SqlDataAdapter 对象的DeleteCommand 的属性值为null,将造成: ( C ) A、程序编译错误

B、SqlDataAdapter 在处理DataSet 中被删除的行时,这些行将被跳过不处理 C、SqlDataAdapter 在处理DataSet 中被删除的行时,将引发异常 D、SqlDataAdapter 在处理DataSet 中被删除的行时,将出现对话框询问用户如何

处理该行

42、在类作用域中能够通过直接使用该类的( D )成员名进行访问。 A、私有 B、公用 C、保护 D、任何 43、在类的成员中,用于存储属性值的是( D )。 A、属性 B、方法 C、事件 D、成员变量 44、属于C#语言的关键字( A )。

A、abstract B、camel C、Salary D、 Employ 45、以下说法正确的是( B )

A、构造函数名不必和类名相同 B、一个类可以声明多个构造函数

C、构造函数可以有返回值 D、编译器可以提供一个默认的带一个参数的构造函数

47、c#中获得当前时间并在控制台上只显示年月日的语句是( B ): A、Console.WriteLine(DateTime.Now.ToString(\ B、Console.WriteLine(DateTime.Now.ToString(\ C、 Console.WriteLine(DateTime.Now.ToString());

D、Console.WriteLine(DateTime.Now.ToString(\ 48、“访问范围限定于此程序或那些由它所属的类派生的类型”是对以下哪个成员可访问性含义的正确描述?( B )

A、public B、protected C、internal D、protected internal 49、在ADO.NET 中,为访问DataTable 对象从数据源提取的数据行。可使用DataTable 对象的( A )属性。

A、 Rows B、 Columns C、Constraints D、DataSet 50、下面描述错误的是( D )

A、窗体也是控件; B、窗体也是类;

C、控件是从窗体继承来的; D、窗体的父类是控件类;

51、声明一个委托public delegate int myCallBack(int x); 则用该委托产生的回调方法的原型应该是( B )

A、void myCallBack(int x) ; B、int receive(int num) ; C、string receive(int x) ; D、不确定的; 52、以下哪个是可以变长的数组?( D )

A、Array B、string[] C、string[N] D、ArrayList ?53、 使用TCP套接字时,有可能产生阻塞的函数是( C )。 A、socket B、listen C、accept D、bind

4. 使用TCP套接字时,发出连接请求的函数是( B )。 A、bind B、connect C、socket D、write 54、( C )协议提供面向连接的、可靠的数据流服务。 A、UDP B、IP C、TCP D、ICMP ?55、TCP套接字函数中(B)不会产生阻塞。 A、bind B、read C、accept D、write 57、下面选项中,( C )是构造函数特点

A、构造函数可以有返回值 B、一个类中只能有一个构造函数 C、构造函数名同类名 D、构造函数不能重载 58、 己知在一个名为“dsOrder”的数据集中有一个名为“order”的表,在“order”表中有一行一列,下列( B )段C# 代码能够正确访问该表记录的第一行第一

列的值。

A、 disorder[“order”].Rows[0][0]; B、disorder.Tables[0].Rows[0][0]; C、disorder.Tables[0].Columns[0][0]; D、disorder[“order”].Columns[0][0];

69、在ADO . NET中,为了执行一个存储过程,需要把SqlCommand对象的CommandType属性设置为( A )。

A.CommandType . StoredProcedure B.CommandType . TableDirect C.CommandType . Text D.CommandType . Sql 60、在C#中,一个类( B )

A、可以继承多个类 B、可以实现多个接口 C、在一个程序中只能有一个子类 D、只能实现一个接口 61、、列表视图ListView的View属性的默认值为( A )

A、大图标LargeIcon B、小图标SmallIcon C、详细资料Details D、列表List 62、、在WinForm窗体中,放置了一个PictureBox 控件PictureBox1,在设置PictureBox1控件的Image 属性后,当图片与控件的大小不一致时,可以通过如下代码( A )使PictureBox1控件的大小与图片大小保持一致。 A.this.PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize; B.this.PictureBox1.SizeMode = PictureBoxSizeMode.Normal;

C.this.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; D.this.PictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;

63、在.NET中,文本框控件的( A )属性用来设置其是否是只读的。 A.ReadOnly B.Locked C.Lock D.Style

64、WinForms程序中,如果复选框控件的 Checked属性值设置为 True,表示( A )。

A.该复选框被选中 B.该复选框不被选中

C.不显示该复选框的文本信息 D.显示该复选框的文本信息 65、( A )方法执行指定为SqlCommand对象的命令文本的SQL语句,并返回受SQL语句影响或检索的行数。

A.ExecuteNonQuery B.ExecuteReader C.ExecuteQuery D.ExecuteScalar

66、在WinForms中,为了防止用户无意关闭窗体,需要在( A )事件中编写代码,提示用户是否关闭窗体。

A.Closing B.Closed C.Load D.VisibleChanged 67、在ADO.NET中,SqlConnection 类所在的命名空间是( D )。

A.System B.System.Data C.System.Data.OleDb D.System.Data.SqlClient

*68、在Winforms窗体中,有一名为txtUser的TextBox控件,其MaxLength属性为5,该控件的当前文本为“网络编程”,若再执行代码:txtUser.AppendText(“高手”);则控件的文本为( C )。

A.网络编程 B.网络编程高 C.网络编程高手 D.出现运行时错误 69、在C#中,让线程启动的方法是( A )

A、Start() B、Resume() C、Thread() D、Process() 70、在C#中,销毁线程的方法是( D ) A、Stop() B、Close() C、End() D、Abort() 71、在C#中,让线程休眠的方法是( B )

A、Bed () B、Sleep() C、Asleep () D、Dormant ()

72、IPAddress类所在的命名空间是( B )

A、System.Threading; B、using System.Net; C、System.Net.Sockets; D、System;

73、在IPAddress类的( A )属性表示本地系统可用的任何IP地址 A、Any

B、Broadcast C、Loopback D、None

74、在IPAddress类的( B )属性表示本地网络的IP广播地址

A、Any

B、Broadcast C、Loopback D、None

75、在IPAddress类的( C )属性表示系统的回送地址 A、Any

B、Broadcast C、Loopback D、None

76、在C#中,Dns类 的GetHostByName方法返回类型中( D ) A、int B、String C、Socket D、IPHostEntry

77、在C#中,生成TCP套接字的语句,以下正确的是(A)

A、Socket temp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

B、Socket temp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)

C、Socket temp = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Raw)

D、Socket temp = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Ip)

78、在C#中,以下( C )不是Socket.ShutDown的枚举值。 A、SocketShutDown.Both B、SocketShutDown.Receive C、SocketShutDown.None D、SocketShutDown.Send

79、在C#中,异步套接字中方法BeginAccept()方法返回类型是( B ) A、int B、IAsyncResult C、Socket D、string

80、在C#中,UdpClient的( C )方法将套接安加入组播组中。 A、Add() B、AddInto( ) C、JoinMulticastGroup() D、Join()

81、在C#中,UdpClient的( D )方法用于断开与一个组播组的连接 A、Abort() B、Stop() C、Break() D、DropMulticastGroup()

?82、在C#中,工作于同步方式下时,UdpClient的( D )方法将产生阻塞。 A、Bind() B、Connect() C、Close() D、Receive()

83、在GDI+中的Graphics的( D ),用于画直线。 A、DrawLine() B、Line()

C、DrawLineTo() D、PointToPoint()

84、DateTime类的( A )属性可以获得系统当前日期和时间 A.Now B.Today C.Tomorrow D.ThisTime

85、下列代码执行后,将显示( B ) Random rr=new Random(); int k=rr.Next(10,100)

A、0<=k<100之间的随机数 B、10<=k<100之间的随机数 C、10<=k<=100之间的随机数 D、0<=k<=100之间的随机数

86. 在C#中,假设Class1是一个类,而IExample是一个接口,下面的( A )类声明是正确的。

A、 class Employee: Class1, IExample B、 class Employee: IExample, Class1 C、 class Employee- Class1, IExample D、 class Employee: Class1/Iexample 87、如果希望类的某个方法能够在子类中进一步进行改进,以处理不同的子类的需要,则应将该方法声明成( C ) A、 sealed 方法 B、 public 方法 C、virtual 方法 D、override方法

88.有如下程序 using system;( C ) class Program {

public static void Main(strng[] args) {

int x=1,a=0,b=0;

switch(x) {

Case 0:b++,break;

Case 1:a++,break;

Case 2:a++,b++,break; }

Console.Writeline(“a={0},b={1}”,a,b);

} }

的输出结果是

A、a=2,b=1 B、a=1,b=1 C、a=1,b=0 D、a=2,b=2 89.using namespace的作用是( A )

A、引入命名空间 B、使用数据库 C、使用一个文件 D、使用一段程序

90、在C#中有一个Windows窗体,该窗体中有一个名为btClose的按钮控件,程序员为该控件邦定了Click事件,该事件的处理程序如下所示,程序运行时,用户点击btClose按钮后,程序将( A )。

Application.Exit();//结束应用程序 MessageBoxShow(“再见!”); A、直接退出

B、关闭当前窗体,程序并不退出

C、关闭当前窗体并显示消息框后,程序退出 D、显示消息框,程序并不退出

91、 在WinForms应用程序中,当需要将窗体关闭时,需要调用窗体的( D )方法。

A、Activate B、Stop C、Show D、Close

92、在使用C#开发Windows应用程序时,在窗体上放置一个名为lblMessage的标签控件,用户希望此标签的宽度根据其文本内容的长短而变化,那么开发人员应当使用如下( B )语句对该标签控件进行初始化设计

A、lblMessage.AutoWide=true; B、lbMessage.AutoSize=true; C、lblMessage.AutoWide=false; D、lblMessage.AutoSize=false;

93. 要使文本框控件能够输入口令(无论输入什么字符,均显示同一字符),应设置它的( A )属性?

A、PasswordChar B、ScrollBars C、Text D、MaxLength

94. WinForm 中, 在为了禁用一个名为 btnOpen 的 Button 控件, 下列做法正确的是 。 ( B )

A、btnOpen.Enable=true; B、btnOpen.Enable=false; C、btnOpen.Visible=false; D、btnOpen.Visible=true;

95. 向数据源插入一条记录,需要将命令对象的CommandText属性设置为Sql语言的

Insert命令后,再调用命名对象的( A )方法 A、 ExecuteNonQuery B、ExecuteReader C、 ExecuteScalar D、ExecuteXmlReader

96 将数据集中的数据同步到数据源中去,必须调用DataAdapter对象的( A )方法

A、Fill B、Dispose C、Update D、ToString() 97. 数据集DataSet与Sql数据源之间的桥梁是( B )

A、 SqlConnection B、SqlDataAdapter C、SqlCommand D、SqlTransaction

98、在c#中,如果想要修改Windows窗体的边框样式,需要修改该 窗体的( D )属性。 A、StartPosition B、BackColot C、ShowInTaskbar D、FormBorderStyle

99.下列( B )不是类的成员的访问修饰符

A、private B、base C、public D、protected

100、在Windows应用程序中,当需要将窗体显示为模式对话框时,需要调用窗体的( B )

A、Activate() B、ShowDialog() C、Show() D、Close() 101、 以下哪些不是UDP协议的特性( A )

A、 提供可靠服务 B、 提供无连接服务 C、 提供端到端服务 D、 提供全双工服务

102、 环回地址是指( B )。

A、 255.255.255.255

B、 127.0.0.1 C、 127.255.255.255

D、 10.0.0.0

103.控件是一个类,在窗体上创建一个控件对象,那么下面( A )属性是控件对象名称(即在程序中引用的名称)。 A.Name B.Text C.Font D.TextAlign 104.窗口打开时触发的事件是( C )。 A.Click B.Enter C.Load D.MouseMove 105、下面描述错误的是( B )。 A.Pen类主要用于绘制线条

B.Brush类主要用于定义绘图的线条的粗细 C.Font类主要用于控制文本的字体样式 D.Color类用于设置颜色

二、简答题

1.什么是线程池?使用线程池有什么好处?

答:线程池是在后台执行多个任务的线程集合。使用线程池接受传入的请求,每个传入请求都分配给线程池中的一个线程,从而达到异步处理请求的目的。在服务器应用程序中,如果每到一个请求就创建一个新线程,然后在新线程中为其请求服务的话,将不可避免的造成系统开销的增大。实际上,创建太多的线程可能会导致由于过度使用系统资源而耗尽内存。为了防止资源不足,服务器应用程序可以采用线程池来限制同一时刻处理的线程数目。线程池不会占用主线程,也不会延迟后续请求的处理。一旦池中的某个线程完成任务,它将返回到等待线程队列中,等待被再次使用。这种重用使应用程序可以避免为每个任务创建新线程引起的资源和时间消耗。

2. 线程是如何创建的?怎样设置线程的优先级? 答:

C#中创建线程的工作是通过使用System.Threading名称空间下的Thread类的构造方法来完成的,如创建一个线程实例输出字符“a”1000次。 Thread thread = new Thread(new ThreadStart(func1)); thread.Priority =ThreadPriority.Normal; thread.Start(); static void func1() {

for(int i =0;i<1000;i++) {

Console.WriteLine(\} }

C#中System.Threading名称空间下的ThreadPriority枚举类定义了线程可能具有的所有优先级的值,优先级由高到低排序为:Highest,AboveNormal,Normal,BelowNormal,Lowest。可以通过访问线程的Priority属性来获取和设置其优先级。每个线程都具有分配给它的线程优先级。在公共语言运行库中创建的线程最初分配的优先级为ThreadPriority.Normal。在运行库以外创建的线程保留它们在进入托管环境之前具有的优先级。可以使用Thread.Priority属性获取或设置任何线程的优先级。

*3.使用DNS类和IPHostEntry类创建一个如下图所示的域名解析器。用户输入主机名或者DNS域名以后,能在下面的列表框中显示与主机或者DNS域名对应的IP地址和别名。 注:输入主机名的文本框名为textBox1;输入DNS主机名的文本框名为textBox2;显示IP地址的列表框名为listBox1;显示别名的列表框名为listBox2

答:

1) 主要源程序如下: using System.Net;

private void button1_Click(object sender, EventArgs e) {

try {

this.Cursor = Cursors.WaitCursor;

//解析主机名

IPHostEntry IPinfo = Dns.GetHostEntry(textBox1.Text); //清空列表框

listBox1.Items.Clear(); listBox2.Items.Clear(); //显示IP地址

foreach (IPAddress IP in IPinfo.AddressList) {

listBox1.Items.Add(IP.ToString()); }

//显示别名

foreach (string alias in IPinfo.Aliases) {

listBox2.Items.Add(alias); }

//显示主机名

textBox2.Text = IPinfo.HostName; }

catch (Exception ex) {

MessageBox.Show(ex.Message); }

finally {

this.Cursor = Cursors.Default; } }

*5、什么是套接字?套接字有哪几种不同的类型?

答:套接字是引用网络连接的特殊的文件描述符,它有三个基本要素组成:网络类型、数据传输类型、采用的网络协议。Socket类的构造函数为: Socket(AddressFamily af,SocketType st,ProtocolType pt)

其中,AddressFamily为网络类型,SocketType为数据类型,ProtocolTyp为使用的网络协议。Socket构造函数的三个参数中,对于网络上的IP通信来说,AddressFamily总是使用AddressFamily.InterNetwork枚举值。SocketType参数则与ProtocolType参数配合使用,不允许其它的匹配形式,也不允许混淆匹配。 *6、说明面向连接套接字服务端编程的基本步骤。

答:1) 生成一个服务器的IP地址和端口号的IpEndPoint对象 2)创建一个包含使用的网络类型、数据传输类型和协议类型的本地套接字对象, 3)并将其IpEndPoint对象与Socket类绑定。

4) 在指定的端口进行监听,以便接受客户端连接请求。

5) 一旦接受了客户端的连接请求,就根据客户端发送的连接信息创建与该客户端对应的Socket对象。

6) 根据创建的Socket对象,分别与每个连接的客户进行数据传输。

7) 根据传送信息情况确定是否关闭与对方的连接。 7、什么是网络流?网络流的基本操作有哪些? 答:可以将NetworkStream看作在数据来源端和接收端之间架设了一个数据通道,这样一来,读取和写入数据就可以针对这个通道来进行。NetworkStream流具有读取和写入两个基本操作。对于NetworkStream流,写入操作是指从来源端内存缓冲区到网络上的数据传输;读取操作是从网络上到接收端内存缓冲区(如字节数组)的数据传输。网络流不具有查找操作。

8、利用StreamWriter与StreamReader类读写流具有什么样的优势?

答:NetworkStream、MemoryStream和FileStream类都提供了以字节为基本单位的读写方法,但是这种方法需要首先将待写入的数据转化为字节序列后才能进行读写,当操作的是使用字符编码的文本数据时,使用很不方便。因此,在操作文本数据时,一般使用StreamWriter、StreamReader执行这些功能。 *8.TCP有哪些主要特点? 答: TCP最主要的特点是: (1)是面向连接的传输层协议;

(2)每个TCP连接只能有两个端点,而且只能一对一通信,不能一点对多点直接通信;

(3)通过TCP连接传送的数据,能保证数据无差错、不丢失、不重复地准确到达接收方,并且保证各数据到达的顺序与数据发出的顺序相同; (4)数据以字节流的方式传输; (5)传输的数据无消息边界。

**9.简要回答采用TcpListener类编写基于TCP的服务器端的一般步骤。

答:使用对套接字封装后的类,编写基于TCP的服务器端程序的一般步骤为: (1)创建一个TcpListener对象,然后调用该对象的Start方法在指定的端口进行监听。

(2)在单独的线程中,循环调用AcceptTcpClient方法接受客户端的连接请求,并根据该方法的返回的结果得到与该客户端对应的TcpClient对象。

(3)每得到一个新的TcpClient对象,就创建一个与该客户对应的线程,在线程中与对应的客户进行通信。

(4)根据传送信息的情况确定是否关闭与客户的连接。

**10.简要回答采用TcpClient类编写基于TCP的客户端程序的一般步骤。 答:使用对套接字封装后的类,编写基于TCP的客户端程序的一般步骤如下: (1)利用TcpClient的构造函数创建一个TcpClient对象。 (2)使用Connect方法与服务器建立连接。

(3)利用TcpClient对象的GetStream方法得到网络流,然后利用该网络流与服务器进行数据传输。

(4)创建一个线程监听指定的端口,循环接收并处理服务器发送过来的信息。 (5)完成工作后,向服务器发送关闭信息,并关闭与服务器的连接。 11.解决TCP的无消息边界问题有哪些常用的方法? 答:常用的方法有三种:

(1)发送固定长度的消息。适用于信息长度固定的场合。 (2)将消息长度与消息一起发送。此方法适用于任何场合。

(3)使用特殊标记分隔消息。适用于消息本身不包含特殊标记的场合。 **12.简述异步编程中基于IAsyncResult的异步设计模式。

答:基于IAsyncResult的异步设计模式通过前缀分别为“Begin”和“End”的两个方法实现开始和结束异步操作,每个Begin方法都必须有一个与其对应的End方法。程序在调用Begin方法后,调用该方法的线程会继续执行其下面的语句,同时该方法用另一个单独的线程执行异步操作,当异步操作完成后,会返回一个实现IAsyncResult接口的对象,循环判断该对象的IsCompleted属性,来决定异步操作是否完成。调用Begin方法后,程序调用End方法来结束异步操作。 13.如果要在服务器进行监听的同时进行其他操作,异步套接字需要提供那些方法? 答:

异步套接字需要提供那些方法:

(1)需要开始接受网络连接请求的方法

(2)需要一个处理连接请求并开始发送或接收网络数据的回调方法 (3)需要一个结束发送或接收数据的方法

14、 UDP协议和TCP协议的主要区别有哪些?

答:UDP是一个简单的、面向数据报的无连接协议,提供了快速但不一定可靠的传输服务。与TCP一样,UDP也是构建于底层IP协议之上的传输层协议。与TCP相比,UDP有如下一些特点:首先,UDP协议是基于无连接的协议,它能够消除生成连接的系统延迟,所以速度比TCP更快。对于强调传输性能而不是传输完整性的应用(例如音频和多媒体应用)UDP是最好的选择。其次,UDP不但支持一对一连接,而且也支持一对多连接,可以使用广播的方式多地址发送,而TCP仅支持一对一通信;第三,UDP与TCP的报头比是8:20,这使得UDP消耗的网络带宽更少。最后,UDP协议传输的数据有消息边界,而TCP协议没有消息边界。但是使用UDP协议的发送无法了解数据报是否已经到达终端系统,这样一来,UDP就无法保证数据被真正传送到了目标。UDP没有任何对双方会话的支持,也不保证各数据报到达的顺序与数据包发出的顺序相同,可靠性不如TCP协议。

15、UdpClient的Connect方法和TcpClient的Connect方法语法形式基本一致,作用是否相同? 答:不同。

UdpClient的Connect方法仅指定远程主机,并不向远程主机发送连接请求。 TcpClient的Connect方法向远程主机发送连接请求。 16、简要回答利用UdpClient加入组播组的方法步骤。

答:在UDP协议中,广播和组播的实现都是借助于特殊的IP地址实现的。特别是组播比较特殊。在.NET套接字中,可以使用JoinMutiCastGroup加入组播组,通过向特殊IP发送消息,实现向加入到组播组的主机发送消息。 **17、简述采用C#语言编程中如何确定最佳的断行位置? (1)、将折行位置处的分隔符留在上一行的行末 (2)、换行后的表达式应当完整 (3)、当参数数量较多、较长或者包含表达式的时候,为了将逻辑体现得更为清晰,应将函数调用中的每一个参数都分行书写 (4)、对于SQL语句或其它较长的复合语句,每个子句单独写成一行,更易理解。

**18、简述采用C#语言编程中使用空格降低代码密度的规范?

(1). 单目运算符(Unary Operators)与它的操作数之间应紧密相接,不需要空

格。

(2). 在双目、三目运算符(Binary/Ternary Operators)的左右两侧分别添加空格。

(3). 括号(包括小括号、中括号与大括号)的内侧应该紧靠操作数或其他运算符,不需要添加额外的空格。

(4). 不要使用连续的两个或多个空格。 **19、简述C#中注释有哪几类? (1)、单行注释// (2)、多行注释 /* */ (3)、XML文档注释 采用///

20、在C#中,为构造函数加文档注释时,简述在其描述上可以采用一些模式化的表达方式?

(1) 初始化……类的新实例。

(2)使用指定的……初始化……类的新实例。 (3)基于……初始化……类的新实例。 **21、命名中使用字符的限制规则

(1)所有的标识符只能由字母、数字和下划线这三类字符组成,而且第一个字符必须为字母或下划线;下划线主要用于分隔具有多个单词的常量。 (2)标识符中不能包含空格、标点符号、运算符等其他符号; (3)标识符区分大小写;

(4)利用英语单词的组合命名,做到一目了然; (5)标识符不能与C#关键字名相同; (6)标识符尽量不与C#中的类库名相同。

22、Pascal与Camel规则的区别,何时采用Camel规则。

(1)Pascal与Camel规则的区别:

A、Pascal规则:标识符中的每个单词首字母大写,其余字母小写。

B、Camel规则:标识符的第一个单词首字母小写,其余单词的首字母大写,剩余小写。

(2)采用Camel规则

A、少数外部程序不可见的“私有及受保护的字段” B、局部变量 C、函数参数

**23、简述在C#中,方法的参数的类型? (1)、值参数 (2)、引用参数 (3)输出参数 (4)数组型参数

**24、面向对象思想的3个原则是,各自有什么作用。 (1)封装:作用:A、模块化 B、信息隐藏

(2)继承:作用:A、实现代码复用 B、简化设计过程 (3)多态:作用:A、高度灵活的抽象 25、简述结构和类的区别 (1)、结构是值类型;类是引用类型 (2)结构不可以继承;类可以继承

(3)结构不能定义默认,必须带参;类可以自定义无参的默认构造函数 (4)结构不可以定义析构函数;类可以定义析构函数 (5)结构不能为实例变量设初始值,类可以

26、在C#中可以使用结构和类,什么时候会用类来描述对象。 (1)数据成员大小超过16个字以内;

(2)需要频繁进行参数传递等数据传送操作; (3)需要继承和多态;

(4)需要特别的初始化操作。

27、简述设计自定义异常及应遵守的约定 (1)、应当继承自System.Exception或其它常用异常基类型 (2)、应该为自定义异常类型的名称添加“Exception”后缀 (3)、避免过深的继承层次 (4)、使用标准的异常类声明和构造函数声明 (5)、考虑提供错误提示信息以外的可由程序访问的属性,以反映与异常相关的额外信息。

28.接口和抽象类的区别是什么?

答:接口用于规范,抽象类用于共性。接口中只能声明方法,属性,事件,索引器。而抽象类中可以有方法的实现,也可以定义非静态的类变量。抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。抽象类可以提供某些方法的部分实现,接口不可以.抽象类的实例是它的子类给出的。接口的实例是实现接口的类给出的。在抽象类中加入一个方法,那么它的子类就同时有了这个方法。而在接口中加入新的方法,那么实现它的类就要重新编写(这就是为什么说接口是一个类的规范了)。接口成员被定义为公共的,但抽象类的成员也可以是私有的、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。此外接口不能包含字段、构造函数、析构函数、静态成员或常量。

三、程序题

1、下列程序完成的功能是:从键盘上输入一个直角三角形的斜边长度和一个角的度数,计算出另两条直角边的长度并输出。请填空:

Using system; Class Example1 {

Public Static void main() {

Double a,b,c,d;

c =Convert.ToSingle(Console.Readline()); //输入斜边长度 d = Convert.ToSingle(Console.Readline()); //输入角的度数 d =_________???_____________________; a =c*Math.Sin(d);

b= c*Math.cos(d)______________________________;

Console.Writeline(“a={0},b={1}”,a,b); //输出两直角边的值 } }

2、写出程序的运行结果: using System; class square {

static void Main( ) {

int m;

for(int i=1;i<=8;i++) {

m=i*i;

Console.Write(“{0}\\t”,m); } } }

结果:1 4 9 16 25 36 49 64

?*3、根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:

namespace test {

public delegate void OnDBOperate();

public class UserControlBase : System.Windows.Forms.UserControl {

public event OnDBOperate OnNew;

privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e)

{

if(e.Button.Equals(BTnNew))

{

//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。

}

} }

答:if( OnNew != null )

OnNew( this, e );

*4、分析以下代码,完成填空

string strTmp = \某某某\

int i= System.Text.Encoding.Default.GetBytes(strTmp).Length; int j= strTmp.Length;

以上代码执行完后,i= j= 答:i=13,j=10

**5、说明下面的注释有什么不正确之处加以改正 public int[] randomArray(int x) {

int i, rInt, tmp; //创建三个整形变量

Random r1 = new Random(); //创建一个随机数类的对象 int[] randArray = new int[x]; for (i = 0; i < x; i++) {

randArray[i] = i; }

for (i = x - 1; i >= 1; i--) {

rInt = r1.Next(i); //取出一个0~i范围之内的随机整数赋给rInt //下面是将第rInt个数值与第i个数值交换 tmp = randArray[i];

randArray[i] = randArray[rInt]; randArray[rInt] = tmp; }

return randArray; //将计算之后的数组返回出去 }

修改:

//函数功能:得到一个具有X个元素的随机序列, //数组的元素值为0~x-1,并且不重复 public int[] randomArray(int x) {

int i, rInt, tmp;

Random r1 = new Random(); //创建一个随机数类的对象 int[] randArray = new int[x];

//为数组赋初值为0,1,2,…,x-1 for (i = 0; i < x; i++) {

randArray[i] = i; }

//循环得到随机值,并与最后一个数值交换 for (i = x - 1; i >= 1; i--)

{

rInt = r1.Next(i);

//下面是将第rInt个数值与第i个数值交换 tmp = randArray[i];

randArray[i] = randArray[rInt]; randArray[rInt] = tmp; }

return randArray; }

**6、基于有连接的通信方式,客户机产生两个随机数,发给两个服务器。服务器1(IP地址:192.168.0.1,Port:3254)将这两个随机数相加;服务器2(IP地址:192.168.0.10,Port:3255),将这两个随机数相减。两个服务器分别将运算结果返回给客户机,客户机显示回传结果。

**7、在Student数据库中有一个Score表(字段为: stuID,stuName,courseName,scScore),做一个winform应用程序,有一个Button和DataGrid,要求通过点击Button从数据库中取出所有数据并显示在DataGrid中。(只写按钮事件的主要代码)

答案:private void button1_Click(object sender, EventArgs e)

{

String con = \

ID=sr;Password=sasa\;

SqlConnection conn = new SqlConnection(con); String str1 = \;

SqlDataAdapter da = new SqlDataAdapter(str1, conn); DataSet ds = new DataSet(); da.Fill(ds);

dataGrid1.DataSource = ds.Tables[0]; }

**8、

using System;

using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text;

using System.Windows.Forms; using System.Data.SqlClient;

namespace WindowsApplication9 {

public partial class Form1 : Form {

public Form1() {

InitializeComponent();

string sqlstr = \

string connString = \Source=.;Initial Catalog=\\\SERVER 2000 SAMPLE DATABASES\\\\PUBS.MDF\\\ SqlConnection conn = new SqlConnection(connString);

SqlDataAdapter adapter = new SqlDataAdapter(sqlstr, conn); DataSet ds = new DataSet(); adapter.Fill(ds, \

DataView dv = new DataView(ds.Tables[0]);

//不允许用户直接添加新行(不在最后一行显示添加新行标志) dv.AllowNew = false; //设置排序字段 dv.Sort = \ //设置过滤条件

dv.RowFilter = \

//使用DataView作为数据源时,将DataMember设置为空字符串 this.dataGrid1.SetDataBinding(dv, \ } } }

**9、编一个程序,输入一个字符串,用ToCharArray()方法把字符串中的内容拷贝到字符数组中,然后用foreach输出该字符数组。 string s;

Console.WriteLine(\请输入一个字符串\ s = Console.ReadLine();

char[] ch =new char[s.Length]; ch = s.ToCharArray(); foreach (char c in ch) {

Console.WriteLine(c); }

**10、使用DNS类创建一个如下图所示的域名解析器。用户输入主机地址以后,点击确定按钮后能在下面的文本框中显示与主机IP地址、本地主机名。写出button1_Click方法中的主要代码。

注:输入主机地址的文本框名为textBox1;显示IP地址的文本框名为textBox2;显示本地主机名的文本框名为textBox3

30、有下面一段Server段程序,目的是能够同时服务多个客户,客户的请求是一句话(一个 String)。如果这个请求的内容是字符串\的话,服务器仅将\字符串返回给用户。

31、(8分)1.编程实现如图所示计算圆面积的窗体,其中有两个标签控件label1和label2,两个文本框控件textBox1和textBox2,一个命令按钮控件button1。在textBox1用于输入圆半径,textBox2用于输出圆面积。计算功能由命令按钮实现。要求写出设计步骤并button1_Click( )方法。

)private void button1_Click(object sender,

EventArgs e)

{ Single a =

Convert.ToSingle(textBox1.Text);

textBox2.Text =Convert.ToString(3.1415926* a*a); }

32、有一个名为“FillMultiRectangle”的Windows应用程序,同时了创建多个矩形并用红黑相间的颜色进行填充,如右图所示,窗体左上角的坐标原点(0,0),各矩形的右下角坐标分别是(50,100)、(150,150)、(200,250)。完成FormFillMultiRectangle_Paint事件代码,以实现程序功能。

可能会用到的类及其方法:Graphics类及其FillRectangles(Brush, Rectangle[])方法和Dispose( );HatchBrush及其构造方法(HatchStyle,Color,Color);Rectangle类及其构造方法Rectangle( int, int, int, int)等。

private void FormFillMultiRetangle_Paint(object sender, PaintEventArgs e) {

Graphics g = e.Graphics; HatchBrush mybrush=new HatchBrush(HatchStyle.Cross,Color .Red,Color .Black);

Rectangle[] rect={ new Rectangle( 0, 0, 50, 100), new Rectangle(50,100, 100, 50), new Rectangle(150, 150, 50, 100) }; g.FillRectangles(mybrush, rect); g.Dispose(); }

33、右图是一个利用异步TCP实现的网络聊天程序的服务器。其他功能都已实现,请完成FormServer( )方法、buttonStart_Click( )方法、ListenClientConnect( )方法、FormServer_FormClosing( )方法以实现程序的监听客户端的连接请求功能和关闭窗体后退出应用程序的功能。

可能用到的类及其方法:IPAddress类;IAsyncResult类及其IsCompleted属性(用来判断异步操作是否完成);静态类Dns的GetHostAddresses( )和GetHostName( );TcpListener类及其构造方法TcpListener(IPAddress, int)和Start( )方法;Thread类及其Start( )方法;委托的BeginInvoke(out TcpClient, null, null)方法和EndInvoke(out TcpClient, IAsyncResult)方法;Button控件的PerformClick( )方法等。

using System; ??

namespace AsyncTcpServer

{ public partial class FormServer : Form

{ private List userList = new List( ); //保存连接的所有用户 IPAddress localAddress; //使用的本机IP地址 private const int port = 51888; //监听端口 private TcpListener myListener;

bool isExit = false; //是否正常退出所有接收线程 public FormServer( ) { InitializeComponent( );

listBoxStatus.HorizontalScrollbar = true;

IPAddress[] addrIP = Dns.GetHostAddresses(Dns.GetHostName());

localAddress = addrIP[0]; buttonStop.Enabled = false; }

///

【开始监听】按钮的Click事件 private void buttonStart_Click(object sender, EventArgs e) { myListener = new TcpListener(localAddress, port);

myListener.Start();

AddItemToListBox(string.Format(\开始在{0}:{1}监听客户连接\localAddress, port));

Thread myThread = new Thread(ListenClientConnect); myThread.Start(); buttonStart.Enabled = false; buttonStop.Enabled = true; }

///

监听客户端请求 private void ListenClientConnect( ) { TcpClient newClient = null; while (true)

{ ListenClientDelegate d = new ListenClientDelegate(ListenClient);

IAsyncResult result = d.BeginInvoke(out newClient, null, null);

while (result.IsCompleted == false) { if (isExit) { break; }

Thread.Sleep(250); }

d.EndInvoke(out newClient, result); if (newClient != null)

{ //每接受一个客户端连接,

//就创建一个对应的线程循环接收该客户端发来的信息 User user = new User(newClient);

Thread threadReceive = new Thread(ReceiveData); threadReceive.Start(user); userList.Add(user);

AddItemToListBox(string.Format(\进入newClient.Client.RemoteEndPoint));

AddItemToListBox(string.Format(\当前连接用户数:userList.Count)); } else

{ break; } } }

private delegate void ListenClientDelegate(out TcpClient client); ///

接受挂起的客户端连接请求 private void ListenClient(out TcpClient newClient) { ?? }

///

处理接收的客户端数据 private void ReceiveData(object userState)

\{0}\

{ ?? }

delegate void ReceiveMessageDelegate(User user, out string receiveMessage); ///

接受客户端发来的信息

private void ReceiveMessage(User user, out string receiveMessage) { ?? }

///

异步发送message给user

private void AsyncSendToClient(User user, string message) { ?? }

///

发送message给user private void SendToClient(User user, string message) { ?? }

///

异步发送信息给所有客户

private void AsyncSendToAllClient(User user, string message) { ?? }

///

移除用户 private void RemoveUser(User user) { ?? }

private delegate void AddItemToListBoxDelegate(string str); ///

在ListBox中追加状态信息 /// private void AddItemToListBox(string str) { ?? }

///

【停止监听】按钮的Click事件 private void buttonStop_Click(object sender, EventArgs e) { ?? }

///

关闭窗口时触发的事件 private void FormServer_FormClosing(object FormClosingEventArgs e) {

if (myListener != null)

{ buttonStop.PerformClick(); } } } }

sender,

private void button1_Click(object sender, EventArgs e) {

textBox2.Text = string.Empty;

IPAddress[] ips = Dns.GetHostAddresses(textBox1.Text); foreach (IPAddress ip in ips) {

textBox2.Text = ip.ToString(); }

textBox3.Text = Dns.GetHostName(); }

**11、写出下面程序的运行结果 using System; using System.Net;

using System.Net.Sockets; class TestSocket{

public static void Main(){

IPAddress ip=IPAddress.Parse(\ IPEndPoint iep=new IPEndPoint(ip,8000);

Socket socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);

Console.WriteLine(\ Console.WriteLine(\ socket.Bind(iep);

Console.WriteLine(\ Console.Read();}} 运行结果: Blocking: True Connected: False

Local EndPoint: 127.0.0.1:8000 12、写出下面程序的运行结果

using System;

using System.Net; class TestIPEndPoint{ public static void Main(){

IPAddress ip=IPAddress.Parse(\ IPEndPoint iep=new IPEndPoint(ip,8000);

Console.WriteLine(\ Console.WriteLine(\

Console.WriteLine(\ Console.WriteLine(\ Console.WriteLine(\ Console.Read(); }}

运行结果:

The IPEndPoint is:127.0.0.1:8000 The Address is:127.0.0.1

The AddressFamily is:InterNetwork The max port number is:65535 The min port number is:0

***13、如下图:将下面程序填充完整

注:显示“服务器IP”的文本框名为textBoxIP;显示“监听端口”的文本框名为textBoxPort;

显示“服务器状态”的列表框名为listBoxState;显示“接收信息”富文本框为richTextBoxAccept; 显示“发送信息”富文本框为richTextBoxSend;“开始监听”按钮名为buttonStart;“发送信息”按钮名为buttonSend;“停止监听”按钮名为buttonStop

using System;

using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Net;

using System.Net.Sockets; using System.Threading;

namespace TestSyncServer {

public class Form1 : System.Windows.Forms.Form {

private Socket socket;

private Socket clientSocket; Thread thread; ………

private System.ComponentModel.Container components = null; public Form1() {

InitializeComponent();

System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false;

this.listBoxState.Items.Clear(); this.richTextBoxAccept.Text=\ this.richTextBoxSend.Text=\ }

private void InitializeComponent() {

……… }

[STAThread]

static void Main() {

Application.Run(new Form1()); }

private void buttonStart_Click(object sender, System.EventArgs e)

{

this.buttonStart.Enabled=false;

IPAddress ip=IPAddress.Parse(this.textBoxIP.Text); IPEndPoint server=new

IPEndPoint(ip,Int32.Parse(this.textBoxPort.Text));

socket=new

Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

socket.Bind(server); //监听客户端连接 socket.Listen(10);

clientSocket=socket.Accept(); //显示客户IP和端口号

this.listBoxState.Items.Add(\与客户

\建立连接\ //创建一个线程接收客户信息

thread=new Thread(new ThreadStart(AcceptMessage)); thread.Start(); }

private void AcceptMessage() {

NetworkStream netStream=new NetworkStream(clientSocket); while(true) {

try {

byte[] datasize=new byte[4]; netStream.Read(datasize,0,4);

int size=System.BitConverter.ToInt32(datasize,0); Byte[] message=new byte[size]; int dataleft=size; int start=0;

while(dataleft>0) {

int recv=netStream.Read(message,start,dataleft); start+=recv; dataleft-=recv; }

this.richTextBoxAccept.Rtf=System.Text.Encoding.Unicode.GetString(message);

} catch {

this.listBoxState.Items.Add(\与客户断开连接\ break; } } }

private void buttonSend_Click(object sender, System.EventArgs e) {

string str=this.richTextBoxSend.Rtf; int i=str.Length; if(i==0) {

return; } else {

//因为str为Unicode编码,每个字符占字节,所以实际字节数应*2

i*=2; }

byte[] datasize=new byte[4]; //将位整数值转换为字节数组

datasize=System.BitConverter.GetBytes(i); byte[]

sendbytes=System.Text.Encoding.Unicode.GetBytes(str); try {

NetworkStream netStream=new NetworkStream(clientSocket); netStream.Write(datasize,0,4);

netStream.Write(sendbytes,0,sendbytes.Length); netStream.Flush();

this.richTextBoxSend.Rtf=\ }

catch {

MessageBox.Show(\无法发送!\ } }

private void buttonStop_Click(object sender, System.EventArgs e) {

this.buttonStart.Enabled=true; try {

socket.Close();

if(clientSocket.Connected) {

clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); thread.Abort(); }

}

catch(Exception err) {

MessageBox.Show(err.Message); } }

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) {

this.buttonStop_Click(null,null); } } }

***14、如下图:将下面程序填充完整

注:显示“服务器IP”的文本框名为textBoxIP;显示“监听端口”的文本框名为textBoxPort;

显示“程序状态”的列表框名为listBoxState;显示“接收信息”富文本框为richTextBoxReceive; 显示“发送信息”富文本框为richTextBoxSend;“请求连接监听”按钮名为buttonRequest;“发送信息”按钮名为buttonSend;“关闭连接”按钮名为buttonClose

using System;

using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms;

using System.Data;

using System.Net;

using System.Net.Sockets; using System.Threading;

namespace TestSyncClient {

///

/// Form1 的摘要说明。 ///

public class Form1 : System.Windows.Forms.Form {

private Socket socket; private Thread thread; ….

private System.ComponentModel.Container components = null; public Form1() {

InitializeComponent();

System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false; this.richTextBoxSend.Text=\ this.richTextBoxReceive.Text=\ this.listBoxState.Items.Clear(); }

private void InitializeComponent() { ….

}

[STAThread]

static void Main() {

Application.Run(new Form1()); }

private void buttonRequest_Click(object sender, System.EventArgs e)

{

IPAddress ip=IPAddress.Parse(this.textBoxIP.Text); IPEndPoint server=new

IPEndPoint(ip,Int32.Parse(this.textBoxPort.Text)); socket=new

Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)

;

try {

socket.Connect(server); }

catch {

MessageBox.Show(\与服务器连接失败!\ return; }

this.buttonRequest.Enabled=false;

this.listBoxState.Items.Add(\与服务器连接成功\ thread=new Thread(new ThreadStart(AcceptMessage)); thread.Start(); }

private void AcceptMessage() {

NetworkStream netStream=new NetworkStream(socket); while(true) {

try {

byte[] datasize=new byte[4]; netStream.Read(datasize,0,4);

int size=System.BitConverter.ToInt32(datasize,0); Byte[] message=new byte[size]; int dataleft=size; int start=0;

while(dataleft>0) {

int recv=netStream.Read(message,start,dataleft); start+=recv; dataleft-=recv; }

this.richTextBoxReceive.Rtf=System.Text.Encoding.Unicode.GetString(message);

} catch {

break; } } }

private void buttonClose_Click(object sender, System.EventArgs e)

{

try {

if(socket.Connected) {

socket.Shutdown(SocketShutdown.Both); socket.Close(); thread.Abort(); }

this.listBoxState.Items.Add(\与主机断开连接\ }

catch(Exception err) {

MessageBox.Show(err.Message); }

this.buttonRequest.Enabled=true; }

private void buttonSend_Click(object sender, System.EventArgs e) {

string str=this.richTextBoxSend.Rtf; int i=str.Length; if(i==0) {

return; } else {

//因为str为Unicode编码,每个字符占字节,所以实际字节数应*2

i*=2; }

byte[] datasize=new byte[4]; //将位整数值转换为字节数组

datasize=System.BitConverter.GetBytes(i); byte[]

sendbytes=System.Text.Encoding.Unicode.GetBytes(str); try {

NetworkStream netStream=new NetworkStream(socket); netStream.Write(datasize,0,4);

netStream.Write(sendbytes,0,sendbytes.Length); netStream.Flush();

this.richTextBoxSend.Text=\ }

catch {

MessageBox.Show(\无法发送!\ } } } }

?15、给方法内每一行加注释,说明每一行的功能

private void button1_Click(object sender, System.EventArgs e) { //只能用UDP协议发送广播,所以ProtocolType设置为Udp Socket socket=new Socket(

AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); //让其自动提供子网中的IP广播地址 //多台机器运行时

IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast,6788);

//同一台机器运行时使用 IPEndPoint iep = new

IPEndPoint(IPAddress.Parse(\

IPEndPoint iep = new IPEndPoint(IPAddress.Parse(\ //设置Broadcast值为1表示允许套接字发送广播信息,该值默认为0(不允许)

socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1); //将发送内容转换为字节数组 byte[] bytes = System.Text.Encoding.Unicode.GetBytes(this.textBox1.Text); //向子网发送信息 socket.SendTo(bytes,iep); socket.Close(); }

16、编写一个Windows应用程序,获取并显示本机的主机名和第一个IP地址。 **17、采用TCP同步套接字方式编写一个程序,要求实现以下功能:

(1)客户端输入两个整型数,发送到服务器,由服务端收到客户端发来的两个整型数,并进行计算,将结果发给客户端,客户端收到服务器的计算结果并显示出来。

部分参考程序:

private void button1_Click(object sender, EventArgs e) {

IPAddress ip = IPAddress.Parse(\ IPEndPoint server = new IPEndPoint(ip, 8000);

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(server);

NetworkStream netStream=new NetworkStream(socket); byte[] datasize=new byte[4];

int s1 = Int32.Parse(textBox1.Text);

datasize = System.BitConverter.GetBytes(s1); netStream.Write(datasize, 0, 4); s1 = Int32.Parse(textBox2.Text);

datasize = System.BitConverter.GetBytes(s1); netStream.Write(datasize, 0, 4); netStream.Read(datasize, 0, 4);

int size = System.BitConverter.ToInt32(datasize, 0); textBox3.Text = size.ToString(); netStream.Close();

socket.Shutdown(SocketShutdown.Both); socket.Close(); }

private void button1_Click(object sender, EventArgs e) {

IPAddress ip = IPAddress.Parse(\ IPEndPoint server = new IPEndPoint(ip, 8000);

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(server); socket.Listen(10);

Socket clientSocket = socket.Accept();

NetworkStream netStream = new NetworkStream(clientSocket); byte[] datasize = new byte[4]; netStream.Read(datasize, 0, 4);

int size1 = System.BitConverter.ToInt32(datasize, 0); netStream.Read(datasize, 0, 4);

int size2 = System.BitConverter.ToInt32(datasize, 0); int size3 = size1 + size2;

label1.Text = size3.ToString(); byte[] datasize1 = new byte[4];

datasize1 = System.BitConverter.GetBytes(size3); netStream.Write(datasize1, 0, 4); netStream.Close();

//socket.Shutdown(SocketShutdown.Both); socket.Close(); }

18、在画线处填上合适的内容,使程序变得正确完整 public Form1() {

InitializeComponent();

string str=\ SqlConnection conn=new SqlConnection(str); string sql=\

SqlDataAdapter adapter=new SqlDataAdapter(sql,conn); DataSet dataset=new DataSet(); adapter.Fill(dataset,\

this.comboBox1.DataSource=dataset.Tables[\}

19、在画线处填上合适的内容,使程序变得正确完整

if(MessageBox.Show(\是否删除当前记录!\删除当前记录\,MessageBoxIcon.Question)== DialogResult.Yes) { try {

string connString=\

SqlConnection conn=new SqlConnection(connString); string com=\ SqlCommand comm=new SqlCommand(com, conn); conn.Open();

comm.ExecuteNonQuery() conn.Close(); }

catch(Exception e) {

MessageBox.Show(\删除记录出现错误:\,\错误!\}

?20、编写一个Windows程序,利用Bitmap类和PictureBox控件显示、保存图像的功能。

21、设本地SQL Server2000中的NorthWind数据库中存放有一张Toys 玩具表。表结构如下所示: 字段 数据类型 描述 ToyId int 玩具编号 ToyName char(20) 玩具名称 ToyRate money 玩具价格 试编程实现利用SqlConnection,SqlCommand,SqlDataAdapter,DataSet等用DataGrid显示整张表的数据。写出关键代码即可。

答案:String con = \; SqlConnection conn = new SqlConnection(con); String str1 = \;

SqlDataAdapter da = new SqlDataAdapter(str1, conn); DataSet ds = new DataSet(); da.Fill(ds);

dataGrid1.DataSource = ds.Tables[0];

?22、

服务器端: using System;

using System.Collections.Generic; using System.Text; using System.Net;

using System.Net.Sockets;

namespace ConsoleApplication2 {

class Program {

static void Main() {

StartListener();

Console.ReadLine(); }

private static void StartListener() {

UdpClient server = new UdpClient(8080); IPEndPoint myhost = null; try {

while (true) {

Console.WriteLine(\等待接收...\

byte[] bytes = server.Receive(ref myhost);

string str = Encoding.Unicode.GetString(bytes, 0, bytes.Length);

Console.WriteLine(\接收到信息:{0}\ if (str == \

Console.WriteLine(\发送应答信息:你好,我也爱你!\

bytes = Encoding.Unicode.GetBytes(\你好,我也爱你!\

server.Send(bytes, bytes.Length, \8081);

} server.Close();

Console.WriteLine(\对方已经byebye了,请按回车键退出。\

}

catch (Exception err)

{ Console.WriteLine(err.ToString()); } }

} }

客户端: using System;

using System.Collections.Generic; using System.Text; using System.Net;

using System.Net.Sockets;

namespace ConsoleApplication3 {

class Program {

static void Main(string[] args) {

Send(\你好,朋友! I love you!\ Send(\ }

private static void Send(string message) {

UdpClient client=new UdpClient(8081); try {

Console.WriteLine(\向8080发送数据:{0}\ byte[]

bytes=System.Text.Encoding.Unicode.GetBytes(message);

client.Send(bytes,bytes.Length,\ if(message==\ {

Console.WriteLine(\已经向对方发送byebye,请按回车退出程序\

return; }

IPEndPoint host=null;

byte[] response=client.Receive(ref host); Console.WriteLine(\接收到返回信息:

{0}\ client.Close();}catch(Exception err){Console.WriteLine(err.ToString()); } }

} }

23、按要求完成以下要求

(1)在本地SQL SERVER数据库系统中的数据名:sun,用户:sa,密码:pass。该数据库中有一张表IP已存放服务器端的IP地址和端口号,如下: ID IP Port 1 192.168.1.100 20000 2 192.168.1.200 22000 请编写程序从数据库中查询、取出ID为“2”的记录,显示IP地址与port号。 (2)要求用C#实现查询本机IP和端口号,并且显示在屏幕上。

(3)从数据库中查询ID为“2”的记录,使用Socket套接字,与IP:202.115.15.1 port:2002的远端服务器建立TCP连接,将查询出的信息传送到远端服务器,并在其远端显示信息。 要求:分别实现客户端和服务端程序。

答案: String con= “ Sever=Localhost;uid=sa;pwd=pass;database=sun”; SqlConnection conn=new SqlConnection(con); String str=”select * from IP Where ID=2”;

SqlCommand cmd=new SqlCommand(str,conn); conn.open();

SqlDataReader sdr=cmd.ExecuteReader(); if(sdr.Read())

{ textBox1.Text=sdr[1].ToString(); textBox2.Text=sdr[2].ToString(); }

IPAddress ip=IPAddress.parse(“202.115.15.1”); IPEndPoint server=new IPEndPoint(ip,2002); Socket socket=new Socket(AddrsessFamily.InterNetWork,SocketType.Stream,ProtocolType.Tcp);

socket.Connect(server);

thread=new Thread(new ThreadStart(AcceptMessage)); thread.Start();

String str=” 获取到的IP和端口”; int i=str.Length; if(i==0) {

return; } else {

i*=2;

}

byte[] datasize=new byte[4];

FormClosingEventArgs e) {

udpClient.Close(); } } }

28、在画线处填上合适的内容,使程序变得正确完整

using System;

using System.Drawing; using System.Collections;

using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Net;

using System.Net.Sockets;

namespace TestUdpServer {

public class Form1 : System.Windows.Forms.Form { public Form1() {

InitializeComponent(); }

private void InitializeComponent() { …… }

[STAThread]

static void Main() { Application.Run(new Form1()); }

private void button1_Click(object sender, System.EventArgs e) { //只能用UDP协议发送广播,所以ProtocolType设置为Udp *Socket socket=new Socket(

AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);* //让其自动提供子网中的IP广播地址 //多台机器运行时使用

*IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast,6788);*

//同一台机器运行时使用

IPEndPoint iep = new IPEndPoint(IPAddress.Parse(\

IPEndPoint iep = new IPEndPoint(IPAddress.Parse(\ //设置Broadcast值为1表示允许套接字发送广播信息,该值默认为0(不允许)

*socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);* //将发送内容转换为字节数组 *byte[] bytes = System.Text.Encoding.Unicode.GetBytes(this.textBox1.Text);* //向子网发送信息 *socket.SendTo(bytes,iep);* socket.Close(); } } } 29、

using System;

using System.Text; using System.Net;

using System.Net.Sockets; using System.Threading; using System.Diagnostics; //服务器程序

namespace SocketServer {

class Program {

private static byte[] result = new Byte[1024]; private static int myprot = 8889; static Socket serverSocket; static void Main(string[] args) {

//服务器IP地址

IPAddress ip = IPAddress.Parse(\ serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);

serverSocket.Bind(new IPEndPoint(ip, myprot)); serverSocket.Listen(10); Console.WriteLine(\启动监听{0}成功\serverSocket.LocalEndPoint.ToString()); //通过clientsocket发送数据

* Thread myThread = new Thread(ListenClientConnect);*//这里线程中的委托是用来处理客服端发来的连接请求 myThread.Start(); Console.ReadLine(); }

///

/// 接收连接 ///

private static void ListenClientConnect() {

while (true) {

Socket clientsocket = serverSocket.Accept();//接收客服端的连接 clientsocket.Send(Encoding.ASCII.GetBytes(\Say Hello\

*Thread receiveThread = new Thread(ReceiveMessage);* *receiveThread.Start(clientsocket);* } }

///

/// 接收信息 ///

/// private static void ReceiveMessage(Object clientSocket) {

*Socket myClientSocket = (Socket)clientSocket;* while (true) {

try {

//通过clientsocket接收数据

* int receiveNumber = myClientSocket.Receive(result);* * Console.WriteLine(\接收客户端{0}消息{1}\Encoding.ASCII.GetString(result, 0, receiveNumber));* }

catch (Exception ex) {

Console.WriteLine(ex.Message);

*myClientSocket.Shutdown(SocketShutdown.Both);* *myClientSocket.Close();* break; } } } } }

using System;

using System.Collections.Generic; using System.Text; using System.Net;

using System.Net.Sockets; using System.Threading; //客户端程序

namespace SocketClient {

class Program {

private static byte[] result = new Byte[1024]; static void Main(string[] args) {

//服务器IP地址

IPAddress ip = IPAddress.Parse(\ Socket clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); try {

clientSocket.Connect(new IPEndPoint(ip, 8889)); Console.WriteLine(\连接服务器成功\ } catch {

Console.WriteLine(\连接服务器失败,请按回车键退出\ return; }

//通过clientSocket接收数据

int receiveLength = clientSocket.Receive(result); Console.WriteLine(\接收服务器消息:{0}\ // 通过clientSocket发送数据 for (int i = 0; i < 10; i++) {

try {

Thread.Sleep(1000);

string sendMessage = \send Message Hello\+ DateTime.Now;

clientSocket.Send(Encoding.ASCII.GetBytes(sendMessage));

Console.WriteLine(\向服务器发送消息:{0}\sendMessage);

} catch {

clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); break; } }

Console.WriteLine(\发送完毕,按回车键退出\ Console.ReadLine(); } } }

本文来源:https://www.bwwdw.com/article/werv.html

Top