201521123055 《Java程序设计》第13周学习总结

1. 本章学习总结

Ax7mca8.jpg

2. 书面作业

1. 网络基础

1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同?

1.2 telnet bbs.newsmth.net,上面这条命令连接的是远程主机的什么端口号?

1.3 telnet cec.jmu.edu.cn 80,尝试回答:你从屏幕看到一些什么内容?返回的内容是不是cec.jmu.edu.cn的主页内容?尝试使用GET /index HTTP/1.0命令,会返回什么?详见实验任务书题目1。

1.4 启动ConnectionWatcher, 然后启动若干个可以联网的程序(如QQ, telnet,浏览器等),查看本机上有什么程序联网,使用了什么端口?QQ占用了什么端口和那些远程IP进行交互,这些IP分布地在那里?使用了什么协议进行通信?

1.5 编写网络程序必不可少的几个信息是什么?

1.1

Rb9b1qY.png

从上比较发现,在数据包的接发时间上二者有着较大的区别。cec.jmu.edu.cn是内网,在LAN中传输速度基本只取决于物理设备的传输速度,外网的话考虑到学校的接入带宽以及使用人数等,自然速度不如内网。

1.2

ep7FXcc.png

abD7Bq8.png

Telnet默认端口为23

1.3

输入后回车,接着按ctrl+]进入Telnet界面

FLPSeKu.png

UAVfLs9.png

报405错误,不能用GET方法访问?再尝试一下

souxVox.png

不知为啥就行了。。

用在线HTTP命令模拟结果:

Z4oCdiR.png

这里结果是报301,链接转移???

反正结果就是返回页面的html代码,看得懂的自然就知道是个网页,至于报错问题要再研究研究。

1.4

对QQ进行交互的IP进行查找

j8uqSIh.png

这个我猜大概是腾讯那边保存信息的服务器,当发给不在线的用户信息或文件时采用TCP协议传输,先保存在服务器上。
还有一个TCP协议连接的是这个IP地址:

0cGdDu6.png
讲道理这个我是没懂。。。

而一般的用户之间的通信采用的是UCP协议传输数据,由于UCP能穿透绝大多数的代理服务器,而且基于我国的网络状况,QQ选择UCP而不是TCP作为主要传输协议。

1.5

通信方式,协议类型,端口号等等

2. 编写TCP客户端程序

2.1 参照SocketTest.java编写一个简单的连接远程服务器小程序Client.java,可以接收并显示服务器发送的信息。启动时需要首先在控制台指定远程主机IP与端口号。(截图,出现自己学号)

2.2 将程序中的网址改成bbs.newsmth.net,端口号改为23,再次观察返回结果?尝试执行telnet bbs.newsmth.net 23,对比返回结果。

2.3 将程序中的网址改成cec.jmu.edu.cn,端口号改为80进一步观察返回结果。没有任何返回结果,为什么?怎么操作

2.4 启动网络调试助手,将其设置为TCP Server,并启动,如下图所示

2.1

    //201521123055
    Scanner sc=new Scanner(System.in);
    String host;
    int port;
    host=sc.next();
    port=sc.nextInt();

    try
    {
        Socket s = new Socket(host, port);
        try
        {
            InputStream inStream = s.getInputStream();
            Scanner in = new Scanner(inStream);

            while (in.hasNextLine())
            {
                String line = in.nextLine();
                System.out.println(line);
            }
        }
        finally
        {
            s.close();
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

2.2

hap2c3Y.png

丑的不忍直视。。出现乱码大概是编码问题

2.3

需要模拟HTTP请求得到响应才有输出。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.ArrayList;

//201521123055
public class Client {

    public static void main(String[] args) {
        try {
            Socket socket = new Socket("cec.jmu.edu.cn", 80);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            StringBuffer buffer = new StringBuffer();
            buffer.append("GET http://cec.jmu.edu.cn:80 HTTP/1.1\r\n");
            buffer.append("Host: cec.jmu.edu.cn:80\r\n");
            buffer.append("UserAgent: IE8.0\r\n");
            buffer.append("Connection: Keep-Alive\r\n");
            buffer.append("\r\n");
            writer.write(buffer.toString());
            writer.flush();

            BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line = null;
            ArrayList<String> result=new ArrayList<>();
            while((line=reader.readLine())!=null){
                result.add(line);
            }

            for(int i=0;i<result.size();i++)
            {
                System.out.println(result.get(i));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

结果:

    HTTP/1.1 200 OK
    Date: Sat, 20 May 2017 07:04:23 GMT
    Server: VAppServer/6.0.0
    X-Frame-Options: SAMEORIGIN
    Vary: User-Agent,Accept-Encoding
    Content-Type: text/html;charset=UTF-8
    Content-Length: 1361
    Set-Cookie: JSESSIONID=12DA269DB605E1D31115D7D6AA74960B; Path=/; HttpOnly
    Keep-Alive: timeout=5, max=100
    Connection: Keep-Alive
    Content-Language: zh-CN
    
    
    
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" />
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no">
    <link rel="stylesheet" Content-type="text/css" href="/system/resource/code/auth/auth.css" />    
        <title>系统提示</title>
    </head>
    <body leftmargin="0" topmargin="0">
        
    <table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td class="prompt">
          <div class="promptOne">系统发生错误</div>
          <div class="promptTwo">抱歉</div>
          <div class="promptThere">可能是由下列问题导致的:</div>
          <p>当前页面发生错误, 请联系管理员(错误标识码:RAD65),或稍后重试</p>
          <br><br>
                                <input type="button" onclick="javascript:history.go(-1);" value="返回上一页">&nbsp;&nbsp;&nbsp;&nbsp;
                                <input type="button" onclick="javascript:window.opener=null;window.open('','_self');window.close();" value="关闭当前窗口">
                                
                                
            
        </td>
      </tr>
    </table>    
    </body>
</html>

2.4

以end为结束符

pai44Ij.png

2.5

之前是模拟GET请求,需要交互的话采用POST请求。

3. ServerSocket与TCP服务器

3.1 简易单线程MenuServer,题目3.1-3.4。(关键代码及运行截图,包含学号)可以使用网络调试助手,将其设置为TCP Client(IP与端口填你的MenuServer的IP与端口),连接你的MenuServer。其中的文件搜索功能为选做。

3.2 多线程MenuServer(截图证明你这个是多线程服务器,使用telnet连接)。

3.1

    //201521123055
    public void menu(Socket socket,String order,PrintWriter writer)
    {

        writer.println("1.显示服务器当前时间 ");
        writer.println("2.您的IP ");
        writer.println("3.文件搜索 ");
        writer.println("4.退出菜单");

        BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line=null;
        while(!(line=in.readLine()).equals("quit"))
        {
            if(line.equals("1"))
            {
                Date date=new Date();
                DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String time=format.format(date);
                writer.println(time);
            }
            else if(line.equals("2"))
            {
                String ip = InetAddress.getLocalHost().getHostAddress();
                writer.println(ip);
            }
            else if(line.equals("4"))
            {
                return;
            }

    }
        
}

3.2

//201521123055
ServerSocket serverSocket=new ServerSocket(8190);
while(n<3)
{

    Socket socket=serverSocket.accept();
    Runnable runnable=new MenuServer();
    Thread thread=new Thread(runnable);
    n++;
}

4. UDP服务器

4.1 改造3.1或3.2,将其改造成基于UDP的MenuServer。(运行界面代码截图,包含学号)。可以使用网络调试助手,将其设置为UDP,要填本机IP与端口也要填远程服务器的IP与端口。

4.1

 //201521123055
    try {
        InetAddress address = InetAddress.getLocalHost();
        int port = 8190;

        DatagramSocket socket = new DatagramSocket(port, address);

        byte[] buf = new byte[1024];  
        DatagramPacket packet = new DatagramPacket(buf, buf.length); 

        socket.receive(packet);  

        String getMsg = new String(buf, 0, packet.getLength());
        System.out.println("客户端发送的数据为:" + getMsg);

        Menu();
        BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line=null;
        while(!(line=in.readLine()).equals("quit"))
        {
            if(line.equals("1"))
            {
                Date date=new Date();
                DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String time=format.format(date);
                writer.println(time);
            }
            else if(line.equals("2"))
            {
                String ip = InetAddress.getLocalHost().getHostAddress();
                writer.println(ip);
            }
            else if(line.equals("4"))
            {
                return;
            }


            InetAddress clientAddress = packet.getAddress();
        int clientPort = packet.getPort();  
        SocketAddress sendAddress = packet.getSocketAddress();
        String feedback = "Received";
        byte[] backbuf = feedback.getBytes();
        DatagramPacket sendPacket = new DatagramPacket(backbuf, backbuf.length, sendAddress);
        socket.send(sendPacket);  

        socket.close();   

    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch(IOException e) {
        e.printStackTrace();
    }


}

5. 论述题:网络程序与流

5.1 前面编写的程序用到了大量的流的相关知识。简述,编写网络程序时应当选择什么样的流?Java网络编程、流之间的关系。场景如:简单的文字聊天、文件传输、应用层协议服务器,如QQ、聊天室、网络游戏。

程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。所有文件的储存是都是字节的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件时,也是一个字节一个字节地读取以形成字节序列。字符流予以修饰。

6. 代码阅读

6.1 修改程序,在GUI界面中某个地方显示自己的学号,然后运行该程序(截图、出现学号)。简述这个程序的主要功能。

6.2 画出源代码的结构图(各个类的依赖关系)。并简要说明各个类的功能。

6.3 简述这个程序有什么不足之处及改进方法.

6.1

yHNx6ii.png

完成服务端与客户端的交互。

6.2

V51NKKy.jpg

客户端界面,客户端监听,客户端线程读取
服务端界面,服务端监听,服务端线程读取

6.3

没有很好地表明信息来源,服务端发送消息显示无换行(或根本不用显示在服务端)

3. 码云

wsIlrMu.png

转载于:https://www.cnblogs.com/wkfg/p/6885714.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值