java习题及答案第11章 习题参考答案.docx
- 文档编号:9369950
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:16
- 大小:20.95KB
java习题及答案第11章 习题参考答案.docx
《java习题及答案第11章 习题参考答案.docx》由会员分享,可在线阅读,更多相关《java习题及答案第11章 习题参考答案.docx(16页珍藏版)》请在冰点文库上搜索。
java习题及答案第11章习题参考答案
习题11课后习题答案
1.常见网络端口有哪些?
答案:
在计算机中操作系统内部使用1-1024保留端口号,所以设计应用程序时需选择除此之外的端口。
如:
20文件传输协议(默认数据口),80全球信息网超文本传输协议(www)。
2.如何连接和读取URL中的资源?
答案:
(1)通过URLConnection连接WWW:
用URL的openStream()方法从网络上读取数据,若要输出数据,用类URLConnection,与URL建立连接,然后对其进行读/写操作。
(2)用URL读取WWW数据资源:
在取得一个URL对象后,通过使用URL的openStream()方法,可以获得所需的特定的WWW资源。
3.什么是套接字?
有哪几种套接字?
答案:
套接字Socket是网络通信的应用程序接口,可以实现客户机与服务器之间的通信。
常用的TCP/IP协议的3种套接字类型有:
流套接字(SOCK_STREAM);数据包套接字(SOCK_DGRAM);原始套接字(SOCK_RAW)。
流套接字用于提供面向连接、可靠的数据传输服务。
该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。
数据包套接字提供了一种无连接的服务。
该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。
原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据包套接字)的区别在于:
原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据包套接字只能读取UDP协议的数据。
因此,如果要访问其他协议发送数据必须使用原始套接字。
4.简述TCP套接字的实现过程?
答案:
实现TCP套接字基本步骤分为服务器端和客户端两部分。
(1)服务器端步骤
创建套接字;绑定套接字;设置套接字为监听模式,进入被动接收连接请求状态;接收请求,建立连接;读/写数据;终止连接。
(2)客户端步骤
创建套接字;与远程服务器程序连接;读/写数据;终止连接。
5.UDP套接字读/写函数与TCP的有何区别?
答案:
TCP套接字中使用recv()和send()函数传输数据;
UDP套接字使用无连接的协议,使用sendto()函数发送数据,在函数调用中要指明目的地址,使用recvfrom()函数接收数据,也需要在参数中指明地址。
6.UDP数据报通信中如何实现监听的?
答案:
UDP的Socket编程是不提供监听功能的,也就是说通信双方更为平等,面对的接口是完全一样的。
但是为了用UDP实现客户/服务器结构,在使用UDP时可以使用DatagramSocket.receive()来实现类似于监听的功能。
因为receive()是阻塞的函数,当它返回时,缓冲区里已经填满了接收到的一个数据报,并且可以从该数据报得到发送方的各种信息,这一点跟accept()是很相似的,因而可以根据读入的数据报来决定下一步的动作,这就达到了跟网络监听相似的效果。
7.基于TCP和UDP协议的通信方式的区别是什么?
分别适用于哪些场合?
答案:
TCP和UDP协议的通信方式的区别如下表所示:
通信方式
协议
可靠性
数据量
是否需要连接
应用
流式通信
TCP
可靠,有序,无差错,无重复,不会丢失数据
大量数据
需要连接
,telnet,ftp服务
数据报通信
UDP
不可靠,
会丢失数据
少量数据
无连接,每个数据报包括源地址和目标地址
时间服务,ping程序
流式通信,主要应用于大量数据的可靠传输。
数据报通信,主要用于不需要保证传输正确性的情况,是一种不需要建立连接的协议。
8.参照书中例子,编程实现一个简单的TCP通信过程。
参考答案:
(1)本实例是一个TCP服务器端程序,在getserver()方法中建立服务器套接字,调用getClientMessage()方法获取客户端信息。
代码如下:
publicclassMyTcp{//创建类MyTcp
privateBufferedReaderreader;//创建BufferedReader对象
privateServerSocketserver;//创建ServerSocket对象
privateSocketsocket;//创建Socket对象socket
voidgetserver(){
try{
server=newServerSocket(8998);//实例化Socket对象
System.out.println(“服务器套接字已经创建成功”);//输出信息
while(true){//如果套接字是连接状态
System.out.println(“等待客户机的连接”);//输出信息
socket=server.accept();//实例化Socket对象
reader=newBufferedReader(newInputStreamReader(socket.getInputStream()));
//实例化BufferedReader对象
getClientMessage();//调用getClientMessage()方法
}
}catch(Exceptione){
e.printStackTrace();//输出异常信息
}
}
privatevoidgetClientMessage(){
try{
while(true){//如果套接字是连接状态
System.out.println(“客户机:
”+reader.readLine());//获得客户端信息
}
}catch(Exceptione){
e.printStackTrace();//输出异常信息
}
try{
if(reader!
=null){
reader.close();//关闭流
}
if(socket!
=null){
socket.close();//关闭套接字
}
}catch(IOExceptione){
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args){//主方法
MyTcptcp=newMyTcp();//创建本类对象
tcp.getserver();//调用方法
}
}
运行结果图示省略
(2)客户端程序,实现将用户在文本框中输入的信息发送至服务器端,并将文本框中输入的信息显示在客户端的文本域中。
代码如下:
publicclassMyClienextendsJFrame{//创建类继承JFrame类
privatePrintWriterwriter;//声明PrintWriter类对象
Socketsocket;//声明Socket对象
privateJTextAreata=newJTextArea();//创建JTextArea对象
privateJTextFieldtf=newJTextField();//创建JTextField对象
Containercc;//声明Container对象
publicMyClien(Stringtitle){//构造方法
super(title);//调用父类的构造方法
cc=this.getContentPane();//实例化对象
cc.add(ta,”North”);//将文本域放在窗体的上部
cc.add(tf,”South”);//将文本域放在窗体的下部
tf.addActionListener(newActionListener()){//绑定事件
publicvoidactionPerformed(ActionEvente){
writer.println(tf.getText());//将文本框中信息写入流
ta.append(tf.getText()+’\n’);//将文本框中信息显示在文本域中
tf.setText(“”);//将文本框清空
}
});
}
Publicvoidconnect(){//连接套接字方法
ta.append(“尝试连接\n”);//文本域中提示信息
try{//捕捉异常
socket=newSocket(“192.168.1.122”,8998);//实例化Socket对象
write=newPrintWriter(socket.getOutputStream(),true);//获得输出流对象
ta.append(“完成连接\n”);//文本域中提示信息
}catch(Exceptione){
e.printStackTrace();//输出异常信息
}
}
publicstaticvoidmain(String[]args){//主方法
MyClienclien=newMyClien(“向服务器送数据”);//创建本例对象
clien.setBounds(300,260,340,220);//设置窗体位置和大小
clien.setVisible(true);//将窗体显示
clien.connect();调用连接方法
}
}
运行结果示意图省略
9.参照书中例子,使用Socket编程来获取Email。
参考答案:
代码如下:
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.*;
import.*;
importjava.io.*;
publicclassMailGetextendsApplet
{
publicvoidinit()
{
//{{INIT_CONTROLS
setLayout(null);
setSize(540,393);
label1=newjava.awt.Label(“Server”);
label1.setBounds(60,48,48,12);
add(label1);
label2=newjava.awt.Label(“User”);
label2.setBounds(60,72,48,12);
add(label2);
label3=newjava.awt.Label(“Passwd”);
label2.setBounds(48,96,48,12);
add(label3);
txtServer=newjava.awt.TextField();
txtServer.setBounds(108,48,324,23);
add(txtServer);
txtUser=newjava.awt.TextField();
txtUser.setBounds(108,72,324,22);
add(txtUser);
txtPass=newjava.awt.TextField();
txtPass.setEchoChar(‘*’);
add(txtPass);
cmdGet=newjava.awt.Button();
cmdGet.setActionCommand(“button”);
cmdGet.setLabel(“button”);
cmdGet.setLabel(“Get”);
cmdGet.setLBounds(444,48,68,60);
cmdGet.setBackground(newColor(12632256));
add(cmdGet);
txtReply=newjava.awt.TextArea();
txtReply.setBounds(60,144,415,213);
add(txtReply);
//}}
ActionlAction=newAction();
cmdGet.addActionListener(lAction);
}
//{{DECLARE_CONTROLS
java.awt.Labellabel1;
java.awt.Labellabel2;
java.awt.Labellabel3;
java.awt.TextFieldtxtServer;
java.awt.TextFieldtxtUser;
java.awt.TextFieldtxtPass;
java.awt.ButtoncmdGet;
java.awt.TextAreatxtReply;
//}}
classActionimplementsjava.awt.event.ActionListener
{
publicvoidactionPerformed(java.awt.event.ActionEventevent){
Objectobject=event.getSource();
if(object==cmdGet){
GetMail(event);
}
}
}
PublicvoidGetMail(java.awt.event.ActionEventevt){
StringsHostName;
intnPort=110;
StringsReply;
sHostName=txtServer.getText();
try{
SocketsktConn=newSocket(sHostName,nPort);
PrintStreamps=newPrintStream(sktConn.getOutputStream());
sReply=getReply(sktConn);
if(sReply.indexOf(“+ERR”)==-1){
txtReply.append(sReply+”\n”);
ps.println(“USERzhangsan”);//用户名
txtReply.append(getReply(sktConn)+”\n”);
ps.println(“PASS”+txtPass.getText());//口令
txtReply.append(getReply(sktConn)+”\n”);//得到邮件内容
ps.println(“QUIT”);//退出
txtReply.append(getReply(sktConn)+”\n”);
}catch(IOExceptione){
System.out.println(e.getMessage);
}
}
StringgetReply(SocketsktConn){
try{
BufferedReaderoutgoing=newBufferedReader(newInputStreamReader(sktConn.getInputStream()));
returnoutgoing.readLine();
}catch(IOExceptione){
returne.getMessage();
}
}
publicstaticvoidmain(String[]args){
Framef=newFrame(“Draw”);
Appletp=newMailGet();
p.init();
p.start();
f.add(p);
f.setSize(400,300);
f.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){System.exit(0);}
});
f.show();
}
}
截图省略
10.参照书中例子,编程实现一个简单的UDP通信过程。
参考答案:
例:
主机不断的重复播出节目预报,可以保证加入到同一组的主机随时可接收到广播信息。
接收者将正在接收的信息放在一个文本域中,并将接收的全部信息放在另一个文本域中。
(1)广播主机程序不断的向外发出广播信息,代码如下:
publicclassWeatherextendsThread{//创建类,该类为多线程执行程序
Stringweather=“节目预报:
八点有大型晚会,请收听”;//需要发出的广播信息
intport=9898;//定义端口
InetAddressiaddress=null;//创建InetAddress对象
MulticastSocketsocket=null;//声明多点广播套接字
Weather(){//构造方法
try{
iaddress=InetAddress.getByName(“224.255.10.0”);//实例化InetAddress,指定地址
socket=newMulticastSocket(port);//实例化多点广播套接字
socket.setTimeToLive
(1);//指定发送范围是本地网络
socket.joinGroup(iaddress);//加入广播
}catch(Exceptione){
e.printStackTrace();//输出异常信息
}
}
publicvoidrun(){//run()方法
while(true){
DatagramPacketpacket=null;//声明DatagramPacket对象
bytedata[]=weather.getBytes();//声明字节数组
packet=newDatagramPacket(data,data.length,iaddress,port);//将数据打包
System.out.println(newString(data));//将广播信息输出
try{
socket.send(packet);//发送数据
sleep(3000);//线程休眠
}catch(Exceptione){
e.printStackTrace();//输出异常信息
}
}
}
publicstaticvoidmain(String[]args){//主方法
Weatherw=newWeather();//创建本类对象
w.start();//启动线程
}
}
运行结果示意图省略
(2)接收广播程序:
当单击“开始接收”按钮时,开始接收主机播出的信息;当单击“停止接收”按钮时,系统会停止接收广播主机播出的信息。
代码如下:
publicclassReceiveextendsJFrameimplementsRunnable,ActionListener{
intport;//定义int型变量
InetAddressgroup=null;//声明InetAddress对象
MulticastSocketsocket=null;//创建多点广播套接字对象
JButtonince=newJButton(“开始接收”);//创建按钮对象
JButtonstop=newJButton(“停止接收”);
JTextAreainceAr=newJTextArea(10,10);//显示接收广播的文本域
JTextAreainced=newJTextArea(10,10);
Threadthread;//创建Thread对象
booleanb=false;//创建boolean型变量
publicReceive(){//构造方法
super(“广播数据报”);//调用父类方法
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
thread=newThread(this);//创建线程对象
ince.addActionListener(this);//绑定按钮ince的单击事件
stop.addActionListener(this);//绑定按钮stop的单击事件
inceAr.setForeground(Color.blue);//指定文本域中文字颜色
JPanelnorth=newJPanel();//创建JPanel对象
north.add(ince);将按钮添加到面板north上
north.add(stop);
add(north,BorderLayout.NORTH);//将north放置在窗体的上部
JPanelcenter=newJPanel();//创建面板对象center
center.setLayout(newGridLayout(1,2));//设置面板布局
center.add(inceAr);//将文本域添加到面板上
center.add(inced);
add(center,BorderLayout.CENTER);//设置面板布局
validate();//刷新
port=9898;//设置端口号
try{
group=InetAddress.getByName(“224.225.10.0”);//指定接收地址
socket=newMulticastSocket(port);//绑定多点广播套接字
socket.joinGroup(group);//加入广播组
}catch(Exceptione){
e.printStackTrace();//输出异常信息
}
setBounds(100,50,360,380);//设置布局
setVisible(true);//将窗体设置为显示状态
}
publicvoidrun(){//run()方法
while(true){
bytedata[]=newbyte[1024];//创建byte数组
DatagramPacketpacket=null;//创建DatagramPacket对象
packet=newDatagramPacket(data,data.length,group,port);//待接收的数据包
try{
socket.receive(packet);//接收数据包
Stringmessage=newString(packet.getData(),0,packet.getLength());
//获取数据包中内容
inceAr.setText(“正在接收的内容:
\n”+message);//将接收内容显示在文本域中
inced.append(message+”\n”);//每条信息为一行
}catch(Exceptione){
e.printStackTrace();//输出异常信息
}
if(b==true)//当变量等于true时,退出循环
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java习题及答案第11章 习题参考答案 java 习题 答案 11 参考答案