习题11 课后习题答案
1.常见网络端口有哪些?
答案: 在计算机中操作系统内部使用1-1024保留端口号,所以设计应用程序时需选择除此之外的端口。如:20文件传输协议(默认数据口) 80全球信息网超文本传输协议(www)
2.如何连接和读取URL中的资源?
答案:(1)通过 URLConnection连接WWW
URLopenStream()方法从网络上读取数据,若要输出数据,用类URLConnection,与URL建立连接,然后对其进行读/写操作。
(2)用URL读取WWW数据资源:
在取得一个URL对象后,通过使用URLopenStream()方法,可以获得所需的特定的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.基于TCPUDP协议的通信方式的区别是什么?分别适用于哪些场合?
答案:TCP和UDP协议的通信方式的区别如下表所示:
通信方式
协议
可靠性
数据量
是否需要连接
应用
流式通信
TCP
可靠,有序,无差错,无重复,不会丢失数据
大量数据
需要连接
telnetftp服务
数据报通信
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小时内删除。