• 20145330第十周《Java学习笔记》


    20145330第十周《Java学习笔记》###

    网络编程

    • 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴。在发送和接收数据时,大部分的程序设计语言都设计了专门的API实现这些功能,程序员只需要调用即可。所以,基础的网络编程可以和打电话一样简单。

    13.1 网络概述

    • 网 络编程技术是当前一种主流的编程技术,随着联网趋势的逐步增强以及网络应用程序的大量出现,所以在实际的开发中网络编程技术获得了大量的使用。
    • 13.1.1 计算机网络概述
      • 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。
      • 按照计算机网络的定义,通过一定的物理设备将处于不同位置的计算机连接起来组成的网络,这个网络中包含的设备有:计算机、路由器、交换机等等
      • IP地址和域名很好的解决了在网络中找到一个计算机的问题,但是为了让一个计算机可以同时运行多个网络程序,就引入了另外一个概念——端口(port)。
    • 13.1. 2 网络编程概述
      • 按照前面的介绍,网络编程就是两个或多个设备之间的数据交换,其实更具体的说,网络编程就是两个或多个程序之间的数据交换,和普通的单机程序相比,网络程序最大的不同就是需要交换数据的程序运行在不同的计算机上,这样就造成了数据交换的复杂。虽然通过IP地址和端口可以找到网络上运行的一个程序,但是如果需要进行网络编程,则还需要了解网络通讯的过程。
      • 由于TCP需要建立专用的虚拟连接以及确认传输是否正确,所以使用TCP方式的速度稍微慢一些,而且传输时产生的数据量要比UDP稍微大一些。

    13.2 网络编程技术

    • 13.2.1 网络编程步骤

      • 按照前面的基础知识介绍,无论使用TCP方式还是UDP方式进行网络通讯,网络编程都是由客户端和服务器端组成。当然,B/S结构的编程中只需要实现服务器端即可。所以,下面介绍网络编程的步骤时,均以C/S结构为基础进行介绍。
        • 13.2.1.1 客户端网络编程步骤
          • 1、 建立网络连接
          • 2、 交换数据
          • 3、 关闭网络连接
        • 13.2.1.2 服务器端网络编程步骤
          • 1、 监听端口
          • 2、 获得连接
          • 3、 交换数据
          • 4、 关闭连接
        • 13.2.1.3 小结
          • 总之,无论使用任何语言,任何方式进行基础的网络编程,都必须遵循固定的步骤进行操作,在熟悉了这些步骤以后,可以根据需要进行逻辑上的处理,但是还是必须遵循固定的步骤进行。
    • 13.2.2 Java网络编程技术

      • 首先来介绍一个基础的网络类——InetAddress类。该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。
      • 关于该类的使用,下面通过一个基础的代码示例演示该类的使用,代码如下:
    
    	package inetaddressdemo;
    
    	import java.net.*;
    
    	public class InetAddressDemo {
             public static void main(String[] args) {
                       try{
                                //使用域名创建对象
                                InetAddress inet1 = InetAddress.getByName("www.163.com");
                                System.out.println(inet1);
                                //使用IP创建对象
                                InetAddress inet2 = InetAddress.getByName("127.0.0.1");
                                System.out.println(inet2);
                                //获得本机地址对象
                                InetAddress inet3 = InetAddress.getLocalHost();
                                System.out.println(inet3);
                                //获得对象中存储的域名
                                String host = inet3.getHostName();
                                System.out.println("域名:" + host);
                                //获得对象中存储的IP
                                String ip = inet3.getHostAddress();
                                System.out.println("IP:" + ip);
                       }catch(Exception e){}
             }
    	}
    
    
    • 在该示例代码中,演示了InetAddress类的基本使用,并使用了该类中的几个常用方法,该代码的执行结果是:
    
    	www.163.com/220.181.28.50
    
    	/127.0.0.1
    	chen/192.168.1.100
    	域名:chen
    	IP:192.168.1.100
    
    
    • 说明:由于该代码中包含一个互联网的网址,所以运行该程序时需要联网,否则将产生异常。

    • 13.2.3 TCP编程

    • 在使用TCP方式进行网络编程时,需要按照前面介绍的网络编程的步骤进行,下面分别介绍一下在Java语言中客户端和服务器端的实现步骤。

    • 这就是最基本的网络编程功能介绍。下面是一个简单的网络客户端程序示例,该程序的作用是向服务器端发送一个字符串“Hello”,并将服务器端的反馈显示到控制台,数据交换只进行一次,当数据交换进行完成以后关闭网络连接,程序结束。实现的代码如下:

    
    	package tcp;
    	import java.io.*;
    	import java.net.*;
    
    	public class SimpleSocketClient {
             public static void main(String[] args) {
                       Socket socket = null;
                       InputStream is = null;
                       OutputStream os = null;
                       //服务器端IP地址
                       String serverIP = "127.0.0.1";
                       //服务器端端口号
                       int port = 10000;
                       //发送内容
                       String data = "Hello";
                       try {
                                //建立连接
                                socket = new Socket(serverIP,port);
                                //发送数据
                                os = socket.getOutputStream();
                                os.write(data.getBytes());
                                //接收数据
                                is = socket.getInputStream();
                                byte[] b = new byte[1024];
                                int n = is.read(b);
                                //输出反馈数据
                                System.out.println("服务器反馈:" + new String(b,0,n));
                       } catch (Exception e) {
                                e.printStackTrace(); //打印异常信息
                       }finally{
                                try {
                                         //关闭流和连接
                                         is.close();
                                         os.close();
                                         socket.close();
                                } catch (Exception e2) {}
                       }
             }
    	}
    
    
    • 这是一个简单的功能示例,在该示例中演示了TCP类型的网络客户端基本方法的使用,该代码只起演示目的,还无法达到实用的级别。
      • 实际上,可以通过logging.properties来设定logging组态,这样就很方便。
    • 在Java API中,实现UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现,分别是:
      • l DatagramSocket
        • DatagramSocket类实现“网络连接”,包括客户端网络连接和服务器端网络连接。
      • l DatagramPacket
        • DatagramPacket类实现对于网络中传输的数据封装,也就是说,该类的对象代表网络中交换的数据。

    网络协议

    • 网络协议是指对于网络中传输的数据格式的规定。对于网络编程初学者来说,没有必要深入了解TCP/IP协议簇,所以对于初学者来说去读大部头的《TCP/IP协议》也不是一件很合适的事情,因为深入了解TCP/IP协议是网络编程提高阶段,也是深入网络编程底层时才需要做的事情。

    • 网络协议设计完成以后,在进行网络编程时,就需要根据设计好的协议格式,在程序中进行对应的编码了,客户端程序和服务器端程序需要进行协议处理的代码分别如下。

      • 客户端程序需要完成的处理为
        • 1、 客户端发送协议格式的生成
        • 2、 服务器端反馈数据格式的解析
      • 服务器端程序需要完成的处理为:
        • 1、 服务器端反馈协议格式的生成
        • 2、 客户端发送协议格式的解析
    • 13.2.6小结

      • 关于网络编程基本的技术就介绍这么多,该部分介绍了网络编程的基础知识,以及Java语言对于网络编程的支持,网络编程的步骤等,并详细介绍了TCP方式网络编程和UDP方式网络编程在Java语言中的实现。
    • 13.3.1质数判别示例

      • 该示例实现的功能是质数判断,程序实现的功能为客户端程序接收用户输入的数字,然后将用户输入的内容发送给服务器端,服务器端判断客户端发送的数字是否是质数,并将判断的结果反馈给客户端,客户端根据服务器端的反馈显示判断结果。
    • 总体来说,该程序示例的结构以及功能都与上一个程序比较类似,希望通过比较这两个程序,加深对于网络编程的认识,早日步入网络编程的大门。

    学习中的问题和解决方法

    • 1、如何复用Socket连接?
    • 在前面的示例中,客户端中建立了一次连接,只发送一次数据就关闭了,这就相当于拨打电话时,电话打通了只对话一次就关闭了,其实更加常用的应该是拨通一次电话以后多次对话,这就是复用客户端连接。
    • 2、如何使服务器端支持多个客户端同时工作?
    • 一个服务器端一般都需要同时为多个客户端提供通讯,如果需要同时支持多个客户端,则必须使用前面介绍的线程的概念。简单来说,也就是当服务器端接收到一个连接时,启动一个专门的线程处理和该客户端的通讯。

    学习感受

    总体来说,该程序示例的结构以及功能都与上一个程序比较类似,希望通过比较这两个程序,加深对于网络编程的认识,早日步入网络编程的大门。

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第九周 200/2300 2/19 20/168
    第十周 100/2400 2/21 20/188
  • 相关阅读:
    输入输出那些事
    NYOJ 20
    NYOJ 283
    HDU 1285
    HDU 2639(第K大背包)
    HDU 4288
    对Visual Studio C++ hash_map严谨一点的测试转载
    vc6,vc.net,vc7,vc8,vc9,c,c++,c#的区别与联系
    我在南大的七年刘末鹏
    慎用Visual Studio C++默认的hash_map转载
  • 原文地址:https://www.cnblogs.com/20145330swx/p/5470768.html
Copyright © 2020-2023  润新知