习题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时可以使用ive()来实现类似于监听的功能。因为receive()是阻塞的函数,当它返回时,缓冲区里已经填满了接收到的一个数据报,并且可以从该数据报得到发送方的各种信息,这一点跟accept()是很相似的,因而可以根据读入的数据报来决定下一步的动作,这就达到了跟网络监听相似的效果。
7.基于TCP和UDP协议的通信方式的区别是什么?分别适用于哪些场合?
答案:TCP和UDP协议的通信方式的区别如下表所示:
通信方式 | 协议 | 可靠性 | 数据量 | 是否需要连接 | 应用 |
流式通信 | TCP | 可靠,有序,无差错,无重复,不会丢失数据 | 大量数据 | 需要连接 | ,telnet,ftp服务 |
数据报通信 | UDP | 不可靠, 会丢失数据 | java程序设计考试题少量数据 | 无连接,每个数据报包括源地址和目标地址 | 时间服务,ping程序 |
流式通信,主要应用于大量数据的可靠传输。
数据报通信,主要用于不需要保证传输正确性的情况,是一种不需要建立连接的协议。
8.参照书中例子,编程实现一个简单的TCP通信过程。
参考答案:
(1)本实例是一个TCP服务器端程序,在getserver()方法中建立服务器套接字,调用getClientMessage()方法获取客户端信息。
代码如下:
public class MyTcp{ //创建类MyTcp
private BufferedReader reader; //创建BufferedReader对象
private ServerSocket server; //创建ServerSocket对象
private Socket socket; //创建Socket对象socket
void getserver(){
try{
server = new ServerSocket(8998); //实例化Socket对象
System.out.println(“服务器套接字已经创建成功”); //输出信息
while(true){ //如果套接字是连接状态
System.out.println(“等待客户机的连接”); //输出信息
socket = server.accept(); //实例化Socket对象
reader= new BufferedReader(new InputStreamReader(socket.getInputStream()));
//实例化BufferedReader对象
getClientMessage(); //调用getClientMessage()方法
}
}catch(Exception e){
e.printStackTrace(); //输出异常信息
}
}
private void getClientMessage(){
try{
while(true){ //如果套接字是连接状态
System.out.println(“客户机:”+adLine()); //获得客户端信息
}
}catch(Exception e){
e.printStackTrace(); //输出异常信息
}
try{
if(reader!=null){
reader.close(); //关闭流
}
if(socket!=null){
socket.close(); //关闭套接字
}
}catch(IOException e){
e.printStackTrace();
}
}
public static void main(String[] args){ // 主方法
MyTcp tcp = new MyTcp(); //创建本类对象
server(); //调用方法
}
}
运行结果图示省略
(2)客户端程序,实现将用户在文本框中输入的信息发送至服务器端,并将文本框中输入的信息显示在客户端的文本域中。
代码如下:
public class MyClien extends JFrame{ //创建类继承JFrame类
private PrintWriter writer; //声明PrintWriter类对象
Socket socket; //声明Socket对象
private JTextArea ta = new JTextArea(); //创建JTextArea对象
private JTextField tf = new JTextField (); //创建JTextField对象
Container cc; //声明Container对象
public MyClien(String title){ //构造方法
super(title); //调用父类的构造方法
cc = ContentPane(); //实例化对象
cc.add(ta,”North”); //将文本域放在窗体的上部
cc.add(tf,”South”); //将文本域放在窗体的下部
tf.addActionListener(new ActionListener()){ //绑定事件
public void actionPerformed(ActionEvent e){
writer.Text()); //将文本框中信息写入流
ta.Text()+’\n’); //将文本框中信息显示在文本域中
tf.setText(“”); //将文本框清空
}
});
}
Public void connect(){ //连接套接字方法
ta.append(“尝试连接\n”); //文本域中提示信息
try{ //捕捉异常
socket = new Socket(“192.168.1.122”,8998); //实例化Socket对象
write = new OutputStream(),true); //获得输出流对象
ta.append(“完成连接\n”); //文本域中提示信息
}catch(Exception e){
e.printStackTrace(); //输出异常信息
}
}
public static void main(String[] args){ //主方法
MyClien clien = new MyClien(“向服务器送数据”); //创建本例对象
clien.setBounds(300,260,340,220); //设置窗体位置和大小
clien.setVisible(true); //将窗体显示
t(); 调用连接方法
}
}
运行结果示意图省略
9.参照书中例子,使用Socket编程来获取Email。
参考答案:代码如下:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论