网络程序设计习题题目练习
- 格式:doc
- 大小:235.00 KB
- 文档页数:9
网络程序设计复习题(课程代码 252284)一.选择题1、编译Java Application 源程序文件将产生相应的字节码文件,这些字节码文件的扩展名为( )。
A. javaB. classC. htmlD. exe2、设int型变量x = 1 , y = 2 , z = 3,则表达式y+=z--/x++ 的值是( )。
A. 3B. 3. 5C. 4D. 53、在Java Applet程序用户自定义的Applet子类中,一般需要重载父类的( )方法来完成一些画图操作。
A. start( )B. stop( )C. init( )D. paint( )4、不允许作为类及类成员的访问控制符的是( )。
A. publicB. privateC. staticD. protected5、为AB类的一个无形式参数无返回值的方法method书写方法头,使得使用类名AB作为前缀就可以调用它,该方法头的形式为( )。
A. static void method( )B. public void method( )C. final void method( )D. abstract void method( )6、下列浏览器中,可以运行HTML中的Applet,而忽略其他HTML命令的是( )。
A. Netscape 3.0B. Internet Explorer5.0C. Hot JavaD. Appletviewer7、以下哪一个不是JA V A的标准数据流( )。
A. 标准输出数据流B. 标准输入数据流C. 标准错误数据流D. 标准运算数据流8、下面声明数组的写法错误()。
A. int a[ ]; B: int[ ] a;C: int[ ][ ] a[3][ ]; D; int[ ][ ] a[ ][3];9: 设x为float型变量,y为double型变量,a为int型变量,b为long型变量,c为char 型变量,则表达式x+y*a/x+b/y+c的值为( )类型。
网络程序设计(JAVA)习题及参考答案《网络程序设计》(JAVA)复习题一、填空题1、Java源文件和编译后的字节码文件扩展名分别是________和________。
2、定义方法时,如果方法不返回任何结果,则方法返回类型写为________。
3、Java中的数据类型分两大类,分别为________和________。
4、字符和字符串常量分别用________和________引起来。
5、退出循环用________语句,继续新一次循环用________语句,从方法返回用用________语句。
6、类由________和________两部分组成。
7、类的继承和接口的实现分别用关键字________和________表示。
8、类成员的访问控制符可以是________、protected、默认和________。
9、集合类和输入/输出流类分别在________和________包中。
10、实现线程有两种方法,继承________类和实现________接口。
11、根据结构组成和运行环境的不同,JAVA程序可以分为两类:________和___________。
12、多态有________和_______两种表现形式。
13、Java构造数据类型有三种________、___________和___________。
14、通过类名直接调用的方法前要加修饰符___________。
15、单行注释和块注释分别用___________和___________表示。
16、表示字符串常量和变量的类分别是___________和___________。
17、假设int x=5,则表达式x++和++x的值分别为___________和___________。
18、构造方法调用本类其他构造方法和父类构造方法分别用___________和___________语句。
19、final类不能被___________,final方法不能被___________。
网络程序设计课后答案【篇一:网络程序设计—asp(第3版尚俊杰编著)课后习题答案】txt>1. 选择题(可多选)(1)静态网页的扩展名一般是:a.htm b .phpc.aspd.jsp答案:a(2)asp文件的扩展名是:a.htmb. txtc. docd. asp答案:d(3)当前的web程序开发中通常采用什么模式?a. c/sb. b/sc. b/bd. c/c答案:b解释:c/s是客户机(client)/服务器(server),b/s是浏览器(browser)/服务器。
c/s一般要求用户有特定的客户端。
比如qq就是c/s模式,你的桌面上的qq就是腾讯公司的特定的客户端,而服务器就是腾讯的服务器。
而b/s模式则不需要特定的客户端,只要有普通浏览器,就可以访问到服务器了,web页就是b/s 模式。
(4)小王正在家里通过拨号上网访问搜狐主页,此时,他自己的计算机是:a. 客户端b. 既是服务器端又是客户端c. 服务器端d. 既不是服务器端也不是客户端答案:a(5)小王正在访问自己计算机上的网页,此时,他自己的计算机是: a. 客户端b. 既是服务器端又是客户端c. 服务器端d. 既不是服务器端也不是客户端答案:b(6)asp脚本代码是在哪里执行的?a. 客户端b. 第一次在客户端,以后在服务器端c. 服务器端d. 第一次在服务器端,以后在客户端答案:c解释:asp脚本代码是在服务器端运行的,服务器将其解释执行为标准的html代码,然后发送到客户端。
(7)在以下url中,从形式上看正确的是:a. .cn/history/1998/intro.aspb. .cn/news/1.jpg答案:a b c d解释:从形式上看,都是正确的。
(8)如果在chapter1下建立了一个子文件夹images,并且在其中放置了一个图片文件1.jpg,那么以下url正确的是:a. http://localhost/asptemp/chapter1/images/1.jpgb. http://127.0.0.1/asptemp/chapter1/images/1.jpg答案:a b(9)对于1.5.5节建立的1-2.asp,以下浏览方式正确的是:a. http://localhost/temp/1-2.aspb. http://127.0.0.1/temp/1-2.aspc. http://localhost/asptemp/chapter1/temp/1-2.aspd. http://127.0.0.1/asptemp/chapter1/temp/1-2.asp答案:a b c d解释:ab两种方式利用了建立的虚拟目录,cd实际上没有用到这个虚拟目录,此时和1-1.asp没有什么区别。
网络编程练习题
1. 编写一个程序,在本地机器上创建一个服务器,能够接收来自客户端的连接请求,并回送一个欢迎消息给客户端。
2. 在上述服务器的基础上,修改程序,使得它能够同时处理多个客户端的连接请求,并将每个客户端发送的消息广播给其他客户端。
3. 编写一个客户端程序,能够连接到上述服务器,并发送一个消息给服务器,服务器接收到消息后将其显示在控制台上。
4. 在上述服务器的基础上,修改程序,使得服务器能够接收客户端发送的文件,并保存到服务器的指定路径上。
5. 编写一个程序,在本地机器上创建一个UDP服务器,能够接收来自客户端的消息,并将消息回送给客户端。
6. 在上述UDP服务器的基础上,修改程序,使得服务器能够同时处理多个客户端的消息,并将每个客户端发送的消息广播给其他客户端。
7. 编写一个UDP客户端程序,能够连接到上述UDP服务器,并发送一个消息给服务器,服务器接收到消息后将其显示在控制台上。
请根据以上练习题,结合网络编程的知识和技巧,编写相应的程序进行练习。
网络编程是一个需要不断实践和探索的领域,通过不断练习和学习,你将能够掌握并灵活运用网络编程的技术。
祝你好运!。
《程序设计基础——C#.NET》练习参考答案:一、选择题的目的就是将____A____作为新一代操作系统的基础,对互联网的设计思想进行扩展。
A.互联网 B. Windows C. C# D. 网络操作系统2.假设变量x的值为10,要输出x值,下列正确的语句是__C__。
A.System.Console.writeline(“x”) B. System.Cosole.WriteLine(“x”)C. System.Console.WriteLine(“x={0}”,x)D. System.Console.WriteLine(“x={x}”)3.要退出应用程序的执行,应执行下列的_A___语句。
A. Application.Exit();B. Application.Exit;C. Application.Close();D. Application.Close;4.关于C#程序的书写,下列不正确的说法是__D________。
A.区分大小写B.一行可以写多条语句C.一条语句可以写成多行D.一个类中只能有一个Main()方法,因此多个类中可以有多个Main()方法5. 在C#语言中,下列能够作为变量名的是__C__。
A.if B. 3ab C. b_3a D. a-bc7. 能正确表示逻辑关系“a≥5或a≤0”的C#语言表达方式是__D__。
A.a>=5 or a<=0 B. a>=5|a<=0 C. a>=5&&a<=0 D. a>=5||a<=08. 以下程序的输出结果是___C_____。
A. 5B. 4C. 6D. 不确定9. If语句后面的表达式应该是__A___。
A.逻辑表达式 B. 条件表达式 C. 算术表达式 D. 任意表达式10.有如下程序:该程序的输出结果是__A___。
A. a=0,b=1B. a=1,b=1C. a=1,b=0D. a=2,b=211.以下叙述正确的是__D___。
网络程序设计复习题1、为了实现网络的互联,互联网技术必须保证使用不同硬件结构的计算机能够进行通信适用于多种不同的操作系统、能够使用多种分组交换网络硬件2、因特网体系结构委员会的英文简称是ICCB3、协议的实现要落实到一个个具体的硬件模块和软件模块上,在网络中将这些实现特定功能的模块称为实体4、连接控制、流控制、报文分段等属于传输层功能5、IP数据报协议标识字段指明了IP数据报封装的协议,当标识字段为 6 时表示封装的是TCP协议6、ICMP报文不包括地址解析报文7、套接字是指IP地址和端口号的组合。
8、SOCKET编程中的全相关是指源端口号、目的端口号、源IP、目的IP、协议9、IP分组的中的TTL值描述,每经过一个路由器,它的值会减1是正确的10、TELNET通过TCP/IP协议模块在客户机和远程登录服务器之间建立一个TCP11、以下提供可靠服务不是UDP协议的特性12、虚拟局域网通常采用交换机端口号、MAC地址、网络层地址或IP广播组地址定义13、办公自动化服务不是网络操作系统提供的服务14、分析IP数据报所携带的TCP内容不是IP路由器应具备的主要功能15、java当中网络编程的接口是在java。
net包当中提供的。
16、会话的建立、维护和交互过程中的同步等属于会话层功能17、在网络层,IP模块根据IP数据报首部中的协议值决定将数据报中的数据交给哪一个模块去处理,当协议值为17,应将数据交给UDP模块处理18、ARP请求帧在物理网络中是以广播方式发送的19、ICMP在重组定时器超时情况下会产生数据报超时报告。
20、回应请求与应答报文的目的是对网络进行诊断和测试,使用它可以了解设备的可达性21、网络的功能主要由各层的协议来完成,互联网技术经过多年的发展形成了现在的TCP/IP协议。
22、为了保证网络的各个功能的相对独立性,以及便于实现和维护,通常将协议划分为多个子协议,并且让这些协议保持一种层次结构,子协议的集合通常称为协议簇。
网络程序设计复习题二1、是一个网络层的协议,它提供了错误报告和其它回送给源点的关于IP 数据报处理情况的消息ICMP2、IP协议的特征是不可靠,无连接3、TCP和UDP协议的相似之处传输层协议4、以下关于TCP滑动窗口说法正确的是滑动窗口机制的窗口大小是可变,从而更加有效利用带宽5、端口号的目的跟踪同一时间网络中的不同连接6、假定您在华为为Quidway路由器上配置了静态域名解析(DNS禁用),使用什么命令查看您配置的域名解析表?show dns7、TFTP服务器使用何种传输层协议,端口号多少?UDP 698、24、服务器一般都是通过特定的端口号来识别应用程序的,这些特定的端口号由IANA统一管理。
请问IANA管理的端口号范围是什么?1~10239、Internet采用的路由选择协议分为和两类。
内部网关协议;外部网关协议10、IP协议是TCP/IP协议簇中的,提供数据传输的最基本服务,是实现网络互联的。
核心协议;基本协议11、socket()函数的返回值是类型。
整数12、由于协议簇中的协议具有上下层关系,由此有称其为。
协议栈13、封装ARP报文时帧类型填,封装RARP报文时帧类型填0x0806;0x803514、BGP是用于不同自治系统之间交换路由信息的。
外部网关协议15、DNS服务器能够接收两种类型的解析:递归解析和解析。
反复16、WinSock编程中需要哪些文件?1)Winsock.dll:winsock.dll是Windows Sockets应用程序接口,用于支持很多Internet和网络相关应用程序。
2)Ws2_32.lib:32位windows socket,版本2用来实现socket网络操作的静态库。
该库对应ws2_32.dll,提供了对以下网络相关API的支持,若使用其中的API,则应该将ws2_32.lib加入工程(否则需要动态载入ws2_32.dll)3)Winsock2.h:winsock版本2头文件,里面包含一些系统定义的宏。
网络程序设计复习题1、为了实现网络的互联,互联网技术必须保证使用不同硬件结构的计算机能够进行通信适用于多种不同的操作系统、能够使用多种分组交换网络硬件2、因特网体系结构委员会的英文简称是ICCB3、协议的实现要落实到一个个具体的硬件模块和软件模块上,在网络中将这些实现特定功能的模块称为实体4、连接控制、流控制、报文分段等属于传输层功能5、IP数据报协议标识字段指明了IP数据报封装的协议,当标识字段为 6 时表示封装的是TCP协议6、ICMP报文不包括地址解析报文7、套接字是指IP地址和端口号的组合。
8、SOCKET编程中的全相关是指源端口号、目的端口号、源IP、目的IP、协议9、IP分组的中的TTL值描述,每经过一个路由器,它的值会减1是正确的10、TELNET通过TCP/IP协议模块在客户机和远程登录服务器之间建立一个TCP11、以下提供可靠服务不是UDP协议的特性12、虚拟局域网通常采用交换机端口号、MAC地址、网络层地址或IP广播组地址定义13、办公自动化服务不是网络操作系统提供的服务14、分析IP数据报所携带的TCP内容不是IP路由器应具备的主要功能15、java当中网络编程的接口是在包当中提供的。
16、会话的建立、维护和交互过程中的同步等属于会话层功能17、在网络层,IP模块根据IP数据报首部中的协议值决定将数据报中的数据交给哪一个模块去处理,当协议值为17,应将数据交给UDP模块处理18、ARP请求帧在物理网络中是以广播方式发送的19、ICMP在重组定时器超时情况下会产生数据报超时报告。
20、回应请求与应答报文的目的是对网络进行诊断和测试,使用它可以了解设备的可达性21、网络的功能主要由各层的协议来完成,互联网技术经过多年的发展形成了现在的TCP/IP协议。
22、为了保证网络的各个功能的相对独立性,以及便于实现和维护,通常将协议划分为多个子协议,并且让这些协议保持一种层次结构,子协议的集合通常称为协议簇。
程序设计基础理论练习题(带答案)程序设计基础理论练习题(带答案)1. 编程语言的发展历程从机器语言到高级语言的发展,现代计算机编程语言的分类和特点。
答案:编程语言的发展经历了多个阶段。
最早的计算机只能使用机器语言进行编程,这是一种由0和1组成的二进制代码。
随着计算机的发展,高级语言逐渐出现。
高级语言通过使用更接近自然语言的语法和结构,使得编程更加易于理解和用户友好。
现代计算机编程语言多种多样,比如C、Java、Python等。
它们各自有着不同的特点和用途。
2. 数据类型与变量不同编程语言中常见的数据类型和变量的定义、使用方法。
答案:不同编程语言中常见的数据类型包括整数、浮点数、布尔值、字符和字符串等。
变量用于存储不同类型的数据。
在大部分编程语言中,变量需要先定义,然后才能使用。
定义变量时需要指定变量名和数据类型。
变量名是用于标识变量的名称,而数据类型决定了变量可以存储的值的种类和范围。
使用变量时可以给其赋值或者读取其值。
3. 运算符常见的运算符有哪些?它们的功能和使用方法是什么?答案:常见的运算符包括算术运算符、比较运算符、逻辑运算符和赋值运算符等。
算术运算符包括加、减、乘、除、取余等,用于执行基本的数学运算。
比较运算符用于比较两个值的大小关系,包括等于、大于、小于等。
逻辑运算符用于处理布尔值,比如与、或、非等。
赋值运算符用于将一个值赋给一个变量。
4. 控制流程程序中常见的控制流程结构,包括条件判断和循环结构。
答案:程序中常见的控制流程包括条件判断和循环结构。
条件判断结构用于根据某个条件的真假来决定执行不同的代码段。
常见的条件判断结构有if语句和switch语句。
循环结构用于反复执行某段代码,直到满足某个条件才停止。
常见的循环结构有while循环、do-while循环和for循环。
5. 函数和模块函数和模块的定义和使用方法,函数的参数传递和返回值。
答案:函数是一段封装了特定功能的代码块,可以被反复调用。
网络程序设计考试大作业题目: 聊天室程序班级:学号:姓名:成绩:网络程序设计考试大作业 (1)一. 所使用的背景知识、主要函数的描述 (3)二. 程序设计思想及程序设计流程框图 (3)三. 主要代码及代码运行结果 (4)1.启动服务器 (4)2.登录 (6)3.注册 (10)4.登录和注册判定 (12)5.进入聊天界面 (13)6.私聊页面17一. 所使用的背景知识、主要函数的描述背景:根据现在最流行的聊天工具QQ, 模仿一部分主要功能来完成。
主要函数:public class Server;服务器的创建。
public class Client;客户端的创建。
public class UserInformation;用户信息的保存和验证。
二. 程序设计思想及程序设计流程框图设计思想:利用socket与server socket在客户端与客户端之间的通信, InputStream InputStreamReader输入输出流进行信息的发送与接收。
程序设计流程:主页面: 输入账号与密码, 点击登录或者注册进入下一页面。
登录:判定是否正确, 正确则进去聊天界面。
注册: 进去注册界面, 成功则返回主页面。
进入聊天室: 能发送信息让在线的所有人看到。
私聊界面:能与一个人单独聊天, 信息只能被双方看到。
三. 主要代码及代码运行结果1.启动服务器代码:public class Server {ServerSocket server ;static int clientNum = 0;// 存放与服务器连接上的对应的Socket, 作用是保存服务器与客户端之间的流, 便于服务器给每个客户端进行回发消息List<Socket> clientConnection = new ArrayList<Socket>();public Server() {try {server = new ServerSocket(9999);System.out .println("服务器已经启动");} catch (IOException e ) {e .printStackTrace();System.out .println("服务器启动失败");}}// 内部类, 监听客户端是否有连接到服务器, 并将此客户端的Socket传递给HandleSocket进行处理, 同时将client存放到List中, 即clientConnection中class SocketListener implements Runnable {public void run() {Socket client;try {while (true) {client = server.accept();// 连接上一个就压入List中, 即clientConnection中clientConnection.add(client);HandleSocket hs = new HandleSocket(client);// 连接上就让HandleSocket去处理new Thread(hs).start();}} catch (IOException e) {System.out.println("客户连接服务器失败");}}}// 内部类处理一个Socket,接收一个Client发送过来的消息, 并且服务器原封不动的返回给所有客户端, 客户端对消息进行过滤class HandleSocket implements Runnable {Socket client;HandleSocket(Socket client) {this.client = client;}public void run() {try {clientNum++;// 启用输入流InputStream is = client.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);System.out.println("第" + clientNum + "个客户端连接进入服务器");boolean flag = true;String s;do {// 对用户发来的消息进行群发给客户端s = br.readLine();System.out.println("接受到一个客户端消息: " + s);for (int i = 0; i < clientConnection.size(); i++) {Socket client = clientConnection.get(i);OutputStream os = client.getOutputStream();PrintStream ps = new PrintStream(os);ps.println(s);}} while (flag);client.close();} catch (IOException e) {System.out.println("有一个客户断开与服务器的连接");}}}界面:2.登录代码:package com.qq.main;import java.awt.Color;import java.awt.Dimension;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPasswordField;import javax.swing.JTextField;import com.qq.regist.Regist;import erInformation;/*** 主界面*/public class Main extends JFrame {//组件的内容private JLabel userId;private JLabel userPassword;private JTextField inputId;private JPasswordField inputPassword;private JButton btLogin;private JButton btRegist;Main() {userId = new JLabel("帐号");userPassword = new JLabel("密码");inputId = new JTextField(6);inputPassword = new JPasswordField();btLogin = new JButton("登陆");btRegist = new JButton("注册");// 设置窗体属性Toolkit tk = Toolkit.getDefaultToolkit();Dimension screenSize = tk.getScreenSize();//得到当前屏幕的长和宽int x = (int) screenSize.getWidth();int y = (int) screenSize.getHeight();this.setBounds((x - 240) / 2, (y - 600) / 2, 240, 600);//窗口显示的大小 , 位置this.setResizable(false);//窗口大小不能改变this.setLayout(null);//默认的格式this.setBackground(Color.BLACK);// 窗口的颜色this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出程序// 设置JLabel属性userId.setBounds(30, 160, 40, 20);userPassword.setBounds(30, 200, 40, 20);// 设置文本域属性inputId.setBounds(90, 160, 100, 20);inputPassword.setBounds(90, 200, 100, 20);inputPassword.setEchoChar('*');//用*显示代替你输入的密码// 设置JButton属性btLogin.setBounds(50, 240, 60, 20);btRegist.setBounds(120, 240, 60, 20);// 注册“登陆”按钮监听器btLogin.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {UserInformation user = new UserInformation();String userName = inputId.getText();String userPassword = new String(inputPassword.getPassword());if (userName.equals("")) {JOptionPane.showMessageDialog(null, "用户名不能为空");} else if ("".equals(userPassword)) {JOptionPane.showMessageDialog(null, "密码不能为空");} else if (user.isExist(userName)&& erInfomation.getProperty(userName).equals(userPassword)) {new AllTalkFrame(userName).setVisible(true);// 判断成功后new一个群聊窗口Main.this.dispose();} else {JOptionPane.showMessageDialog(null, "此用户名不存在或者密码不正确");}}});// 注册“注册”按钮监听器btRegist.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {new Regist();//注册页面}});this.add(userId);this.add(userPassword);this.add(inputId);this.add(inputPassword);this.add(btLogin);this.add(btRegist);this.setVisible(true);}public static void main(String[] args) {new Main();}}界面:3.注册代码:// 注册“提交”按钮的监听器btSubmit.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String userName = inputId.getText();String userPassword = newString(inputPassword.getPassword());String userPasswordConfirm= new String(inputPasswordConfirm.getPassword());System.out.println("您点击了提交按钮");if (userName.equals("")) {JOptionPane.showMessageDialog(null, "用户名不能为空");} else if ("".equals(userPassword)|| "".equals(userPasswordConfirm)) {JOptionPane.showMessageDialog(null, "密码和密码重复都不能为空");} else if (!userPassword.equals(userPasswordConfirm)) {JOptionPane.showMessageDialog(null, "密码和密码重复不一致");} else {UserInformation user = new UserInformation();if (user.isExist(userName)) {JOptionPane.showMessageDialog(null, "此用户名已存在");} else {JOptionPane.showMessageDialog(null, "注册成功");user.insert(userName,userPassword);//UserInformation类Regist.this.dispose();}}}});// 注册“取消”按钮的监听器btCancel.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.out.println("您点击了取消按钮");Regist.this.dispose();}});界面:4.登录和注册判定代码://注册一个用户public void insert(String userName, String userPassword) { try {userInfomation = new Properties();InputStream is;OutputStream os;is = new ("c:/userInfo.properties");os = new ("c:/userInfo.properties", true);userInfomation.load(is);// 将用户名和密码存储到内存中userInfomation.setProperty(userName, userPassword);// 将用户名和密码保存到文件中userInfomation.store(os, null);} catch ( e1) {System.out.println("文件userInfo.properties没有找到 ");} catch (IOException e) {System.out.println("写 userInfo.properties 出错");}}//判断此用户名是否存在public boolean isExist(String userName) {try {userInfomation = new Properties();InputStream is;is = new ("c:/userInfo.properties");userInfomation.load(is);if (userInfomation.containsKey(userName)) {return true;}} catch ( e1) {System.out.println("文件userInfo.properties没有找到 ");} catch (IOException e) {System.out.println("写 userInfo.properties 出错");}return false;}5.进入聊天界面代码:class showOldMessageThread implements Runnable {public void run() {boolean flag = true;while (flag) {try {// 接收群聊服务器端回发过来的消息String serverOutput = client.br.readLine() + "\r\n";if (!serverOutput.startsWith("私聊")&& !serverOutput.startsWith("*")&& !(serverOutput.substring(serverOutput.indexOf(": ") + 1).equals("\r\n"))) {String s1 = serverOutput.replace('说', ' ');String s = s1.replaceAll("�", "\r\n ");oldMessageTextArea.append(s);}// 添加客户端的用户在线列表if (!serverOutput.startsWith("*")&& !serverOutput.startsWith("私聊")&& (serverOutput.indexOf("说") != -1)) {String listName = serverOutput.substring(0,serverOutput.indexOf('说'));// 如果JList中有相同名字的用户, 则不添加, 否则添加if (!users.contains(listName)) {System.out.println("用户" + listName + "上线了");users.add(listName);userList.setListData(users);}}// 判断服务器回发过来的消息是不是以"私聊"开头的, 是的话就提取出这两个用户名if (serverOutput.startsWith("私聊")) {String siliaoName1 = serverOutput.substring(serverOutput.indexOf("*") + 1, serverOutput.indexOf("和"));String siliaoName2 = serverOutput.substring(serverOutput.indexOf("和") + 1, serverOutput.indexOf("\r"));String siliaoBenshen = "";String siliaoDuixiangName = "";if (siliaoName1.equals(clientName)) {siliaoBenshen = siliaoName1;siliaoDuixiangName = siliaoName2;} else {siliaoBenshen = siliaoName2;siliaoDuixiangName = siliaoName1;}// 判断这两个名字中是否有与自己同名的, 有的话就弹出个私聊窗口if (siliaoName1.equals(clientName)|| siliaoName2.equals(clientName)) {new PointToPointTalkFrame(siliaoBenshen + "和"+ siliaoDuixiangName).setVisible(true);}}} catch (IOException e1) {System.out.println("读取服务器端消息出错");}}}}// 注册JList的点击事件, 进入私聊界面userList.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e) {if (e.getClickCount() == 2) {if (erList.getSelectedValue().toString().equals(clientName)) {JOptionPane.showMessageDialog(null, "不能和自己聊天");} else {String PToPMemberName = "私聊"+ "*"+ clientName+ "和"+erList.getSelectedValue().toString();client.ps.println(PToPMemberName);}}}});界面:6.私聊页面代码:// 线程: 只要服务器端有消息, 就将消息显示到oldMessageTextAreaclass showOldMessageThread implements Runnable {public void run() {boolean flag = true;while (flag) {try {// 接收服务器端回发过来的消息String serverOutput = client.br.readLine() + "\r\n";System.out.println("私聊服务器发过来的消息: " + serverOutput);// 将消息中的两个用户名提取出来String s1 = "";if (serverOutput.startsWith("私聊")) {String[] s;if (serverOutput.startsWith("私聊*")) {s = serverOutput.substring(3,serverOutput.indexOf("\r")).split("和");} else {s = serverOutput.substring(2,serverOutput.indexOf("说")).split("和");}for (int i = 0; i < s.length; i++) {s1 = s1 + s[i];}}// 将标题中的两个用户名提取出来,有两种顺序String[] title = clientName.split("和");String s2 = "";for (int i = 0; i < title.length; i++) {s2 = s2 + title[i];}String s3 = "";for (int i = title.length - 1; i >= 0; i--) {s3 = s3 + title[i];}// 判断服务器端返回消息中的两个用户名等于客户端的两个用户名(忽略顺序), 则将消息显示出来(也就是显示在私聊窗口上)if (s1.equals(s2) || s1.equals(s3)) {String ss1 = serverOutput.substring(2, serverOutput.indexOf("和"));String ss2 = serverOutput.substring(serverOutput.indexOf(": "));// 将私聊客户端返回来的一行字符串按"�"进行拆分成多行, 显示在私聊的oldMessageArea中if (ss2.indexOf("�") != -1) {ss2 = ss2.replaceAll("�", "\r\n ");}oldMessageTextArea.append(ss1 + ss2);}} catch (IOException e1) {System.out.println("读取服务器端消息出错");}}}}界面:。
1.TCP/UDP在传输层;IP在网络层;MAC在数据链路层2.NAT的实现方式有三种,即静态转换、动态转换和端口多路复用3.端口号是16位的,范围在0~655354.在套接字通信中,常用套接字类型包括三类:流式套接字、数据报套接字和原始套接字①流式套接字(其类型字段的值是SOCK_STREAM): 提供面向连接的、可靠的字节流服务,应用程序所访问的传输层协议是TCP协议。
②数据报式套接字(其类型字段的值是SOCK_DGRAM): 提供无连接的,不可靠的数据报服务,应用程序所访问的传输层协议是UDP协议。
③原始套接字(其类型字段的值是SOCK_RAW): 允许应用程序直接对较低层的协议,如IP、ICMP进行访问。
5.有状态服务器定义:保存状态信息的服务器优势:减少客户和服务器交换报文的大小;允许服务器快速相应请求无状态服务器定义:不保存任何状态信息的服务器优势:提高协议的可靠性6.并发服务器定义:在一个时刻只处理一个请求的服务器循环服务器定义:在一个时刻可以处理多个请求的服务器7.面向应用的网络编程方法(1)WinInet编程(2)基于WWW应用的网络编程(3)面向SOA的Web Service8.面向原始帧的网络编程方法(1)直接网卡编程技术(2)基于Packet Driver的网络编程方法(3)基于NDIS的网络编程(4)WinPcap编程9.UDP是无连接的;TCP是面向连接的意义:①决定了客户和服务器交互所采用的算法;②决定了下层系统所提供的可靠性等级;面向连接的服务器优点:易于编程缺点:资源消耗问题无连接的服务器优点:无资源消耗问题缺点:编程复杂10.bind和listen函数是非阻塞的11.B/S模型B/S(Browse/Server)模型也叫B/S模式,它是一种基于Web的通信模型,使用HTTP通信。
B/S是一种特殊的C/S模型,特殊之处就在于这种模型的客户端一般是某种流行的浏览器,例如,微软的Internet Explorer。
优点:单台计算机可以访问任何一个Web服务器,不需要针对不同的服务器分别提供专用的客户端软件。
12.客户/服务器模型优点:(1)结构简单(2)支持分布式、并发环境(3)服务器集中管理资源,有利于权限控制和系统安全(4)可扩展性好缺点:(1)缺乏有效的安全性(2)客户负荷过重(3)服务器工作效率低(4)容易造成网络阻塞13.浏览器/服务器模型优点:(1)具有分布性特点,可以随时随地进行查询、浏览等业务处理(2)业务扩展简单方便,通过增加网页即可增加服务器功能(3)维护简单方便(4)开发简单,共享性强缺点:(1)操作时以鼠标为最基本的操作方式,无法满足快速操作的要求(2)页面动态刷新,响应速度明显降低(3)功能弱化,难以实现传统模式下的特殊功能要求14.字节顺序:大端顺序和小端顺序15.Linux中提供的基本I/O功能16.会聚点问题的解决方案1)要求下层通信协议在请求报文到达后自动创建运行程序——底层通讯程序太复杂!2)要求在任何一对进行通信的应用进程中,有一方必须在启动执行后(无限期)等待对方与其联系。
——客户-服务器模型的解决方案17.客户端通信过程:①socket初始化;②创建套接字,指定使用TCP(可靠的传输服务)进行通信;③指定服务器地址和通信端口;④向服务器发送连接请求;⑤进行数据传输;⑥关闭套接字;⑦结束对windows sockets dll的使用。
18.服务器通信过程:①socket初始化;②创建套接字,指定使用TCP(可靠的传输服务)进行通信;③指定本地地址和通信端口;④等待客户端的连接请求;⑤进行数据传输;⑥关闭套接字;⑦结束对windows sockets dll的使用。
19.接收函数的调用结果有很多种完整接收流数据int iResult, recvbuflen;char recvbuf [MSGSZ];do {iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);if ( iResult > 0 )printf("Bytes received: %d\n", iResult);else {if ( iResult == 0 )printf("Connection closed\n");elseprintf("recv failed with error: %d\n", WSAGetLastError());}} while( iResult > 0 );20.接收定长数据int recvn(SOCKET s, char * recvbuf, unsigned int fixedlen){int iResult; //存储单次recv操作的返回值int cnt; //用于统计相对于固定长度,剩余多少字节尚未接收cnt = fixedlen;while ( cnt > 0 ) {iResult = recv(s, recvbuf, cnt, 0);if ( iResult < 0 ){//数据接收出现错误,返回失败printf("接收发生错误: %d\n", WSAGetLastError());return -1;}if ( iResult == 0 ){//对方关闭连接,返回已接收到的小于fixedlen的字节数printf("连接关闭\n");return fixedlen - cnt;}//printf("接收到的字节数: %d\n", iResult);//接收缓存指针向后移动recvbuf +=iResult;//更新cnt值cnt -=iResult;}return fixedlen;}21.接收变长数据int recvvl(SOCKET s, char * recvbuf, unsigned int recvbuflen){int iResult;//存储单次recv操作的返回值unsigned int reclen; //用于存储报文头部存储的长度信息 //获取接收报文长度信息iResult = recvn(s, ( char * )&reclen, sizeof( unsigned int ));if ( iResult !=sizeof ( unsigned int ){//如果长度字段在接收时没有返回一个整型数据就返回(连接关闭)或-1(发生错误)if ( iResult == -1 ){printf("接收发生错误: %d\n", WSAGetLastError());return -1;}else{printf("连接关闭\n");return 0;}}//转换网络字节顺序到主机字节顺序reclen = ntohl( reclen );if ( reclen > recvbuflen ){//如果recvbuf没有足够的空间存储变长消息,则接收该消息并丢弃,返回错误while ( reclen > 0){iResult = recvn( s, recvbuf, recvbuflen );if ( iResult != recvbuflen ){//如果变长消息在接收时没有返回足够的数据就返回(连接关闭)或-1(发生错误)if ( iResult == -1 ){printf("收发生错误:%d\n", WSAGetLastError());return -1;}else {printf("连接关闭\n");return 0;}}reclen -= recvbuflen;//处理最后一段数据长度if ( reclen < recvbuflen )recvbuflen = reclen;}printf("可变长度的消息超出预分配的接收缓存\r\n");return -1;}//接收可变长消息iResult = recvn( s, recvbuf, reclen );if ( iResult != reclen ){//如果消息在接收时没有返回足够的数据就返回(连接关闭)或-1(发生错误)if ( iResult == -1 ) {printf("接收发生错误: %d\n", WSAGetLastError());return -1;}else {printf("连接关闭\n");return 0;}}return iResult;}简答题2、阐述程序、套接字、端口和协议之间的关系程序和套接字的关系:一个程序可以同时使用多个套接字,不同套接字完成不同的传输任务。
多个应用程序可以同时使用同一个套接字,不过这种情况并不常见。
套接字和端口的关系:每个套接字都有一个关联的本地TCP或UDP端口,它用于把传入的分组指引到应该接收它们的应用程序。
一个端口上可能关联多个套接字,流式套接字的服务器上可能同时有监听套接字和连接套接字,它们都与一个TCP的端口号相关联;一个套接字一般只会关联一个唯一的本地端口号。
端口和协议的关系:TCP和UDP的端口号是独立使用的。
3、在基于流式套接字的网络应用程序设计中,假设客户端以8字节-12字节-8字节-12字节的顺序交替发送数据给服务器,请思考,服务器的接收操作每次能够接收到多少字节的数据?为什么?服务器接收操作每次能够接收到的数据长度是不确定的,这是因为TCP传送数据的形态是没有间隔的字节流,数据接收仅与接收调用的时间和当前主机内核缓存中尚未提交应用程序的数据有关,与发送端发送多少次和TCP如何传送没有直接的关系,我们不能准确地预测一个特定的接收操作到底返回多少字节。
4.在服务器和客户的通信过程中,服务器是如何处理多个客户服务请求的呢?1)如果是循环服务器,则服务器在与一个客户建立连接后,其他客户只能等待;当一个客户服务完之后,服务器才会接收另一个客户的服务请求;即循环服务器的通信流程中,蓝色的3个步骤是循环进行的;2)如果是并发服务器,则当服务器与一个客户进行通信的过程中,可以同时接收其他客户的服务请求,并且服务器要为每一个客户创建一个从进程,在从进程中用新创建的套接字与客户交互;即并发服务器的通信流程中蓝色的3个步骤,在与多个客户通信时,是并发执行的;5.为什么客户端没有bind,而服务器端需要?客户端是主动连接,而服务器是等待连接,因此服务器必须需要绑定IP地址和端口号,而客户端不需要。