20145327 《Java程序设计》第十周学习总结

教材学习内容总结

  • 网络编程就是运行在不同计算机中两个程序之间的数据交换。

  • 网络中的每个设备都会有一个唯一的数字标识,这个就是IP地址。在计算机网络中,现在命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数字组成,例如10.0.120.34。

  • 一个IP地址可以对应多个域名,一个域名只能对应一个IP地址。

  • 在实际传输数据以前需要将域名转换为IP地址,实现这种功能的服务器称之为DNS服务器,也就是通俗的说法叫做域名解析。

  • IP地址的使用要比域名通用一些。

  • 在硬件上规定,端口的号码必须位于0-65535之间,每个端口唯一的对应一个网络程序,一个网络程序可以使用多个端口。

  • 通讯的一端发送数据,另外一端反馈数据,网络通讯都基于该模型。

  • 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。

  • 这种网络编程的结构被称作客户端/服务器结构,也叫做Client/Server结构,简称C/S结构。

  • 其实在运行很多程序时,没有必要使用专用的客户端,而需要使用通用的客户端,例如浏览器,使用浏览器作为客户端的结构被称作浏览器/服务器结构,也叫做Browser/Server结构,简称为B/S结构。

  • B/S结构其实也就是一种特殊的C/S结构。

  • 因为各个网络程序之间协议格式的不同,所以才导致了客户端程序都是专用的结构。

  • 在现有的网络中,网络通讯的方式主要有两种:1、 TCP(传输控制协议)方式;2、 UDP(用户数据报协议)方式。在网络通讯中,TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。而UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。

  • 重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则都通过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。TCP方式的速度稍微慢一些,而且传输时产生的数据量要比UDP稍微大一些。

  • 客户端的编程主要由三个步骤实现:1、 建立网络连接;2、 交换数据;3、 关闭网络连接

  • 服务器端的编程由四个步骤实现实现:1、 监听端口;2、 获得连接;3、 交换数据;4、 关闭连接。

  • 一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。

  • 基础的网络类——InetAddress类。该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。

  • 在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以java.net.Socket类代表客户端连接,以java.net.ServerSocket类代表服务器端连接。

  • 在客户端网络编程中,首先需要建立连接,在Java API中以java.net.Socket类的对象代表网络连接,所以建立客户端网络连接,也就是创建Socket类型的对象,该对象代表网络连接,示例如下:

    Socket socket1 = new Socket(“192.168.1.103”,10000);
    
    Socket socket2 = new Socket(“www.sohu.com”,80);
  • socket1实现的是连接到IP地址是192.168.1.103的计算机的10000号端口,而socket2实现的是连接到域名是www.sohu.com的计算机的80号端口,至于底层网络如何实现建立连接,对于程序员来说是完全透明的。如果建立连接时,本机网络不通,或服务器端程序未开启,则会抛出异常。

  • 连接一旦建立,则完成了客户端编程的第一步,紧接着的步骤就是按照“请求-响应”模型进行网络数据交换,在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,代码如下:

    OutputStream os = socket1.getOutputStream(); //获得输出流

    InputStream is = socket1.getInputStream(); //获得输入流

  • 关闭网络连接,释放网络连接占用的系统端口和内存等资源,完成网络操作,示例代码如下:

    socket1.close();
  • 实现服务器端监听的代码为:

    ServerSocket ss = new ServerSocket(10000);

    该代码实现的功能是监听当前计算机的10000号端口,如果在执行该代码时,10000号端口已经被别的程序占用,那么将抛出异常。否则将实现监听。

  • 实现获得连接的代码是:

    Socket socket = ss.accept();
  • 关闭服务器端连接。实现的代码为:
    
       ss.close();
  • 在Java API中,实现UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现,分别是:DatagramSocket与DatagramPacket。

  • UDP方式的建立连接只需要建立一个连接对象即可, 实现的代码为:

     DatagramSocket ds = new DatagramSocket();
  • 实现发送数据的代码如下:

     String s = “Hello”;
    
     String host = “127.0.0.1”;
    
     int port = 10001;
    
     //将发送的内容转换为byte数组
    
      byte[] b = s.getBytes();
    
     //将服务器IP转换为InetAddress对象
    
      InetAddress server = InetAddress.getByName(host);
    
      //构造发送的数据包对象
    
      DatagramPacket sendDp = new DatagramPacket(b,b.length,server,port);
    
      //发送数据
    
      ds.send(sendDp);
  • 实现接收数据以及显示服务器端反馈内容的示例代码如下:

    //构造缓冲数组

    byte[] data = new byte[1024];

    //构造数据包对象

    DatagramPacket received = new DatagramPacket(data,data.length);

    //接收数据

    ds.receive(receiveDp);

    //输出数据内容

    byte[] b = receiveDp.getData(); //获得缓冲数组

    int len = receiveDp.getLength(); //获得有效数据长度

    String s = new String(b,0,len);

    System.out.println(s);

  • 闭连接使用连接对象中的close方法即可,实现的代码如下:

           ds.close();
  • UDP方式的同一个网络连接对象,可以发送到达不同服务器端IP或端口的数据包,这点是TCP方式无法做到的。

  • UDP方式服务器端网络编程需要建立一个连接,该连接监听某个端口,实现的代码为:

    DatagramSocket ds = new DatagramSocket(10010);

  • 服务器端需要获得客户端的IP和客户端使用的端口号,这个都可以从接收到的数据包中获得。示例代码如下:

    //获得客户端的IP

    InetAddress clientIP = receiveDp.getAddress();

    //获得客户端的端口号

    Int clientPort = receiveDp.getPort();

  • 关闭服务器端连接,代码如下:

    ds.close();
  • 由于各种网络程序使用不同的协议格式,所以不同网络程序的客户端之间无法通用。常见协议的格式:HTTP(Hyper Text Transfer Protocol,超文本传输协议)、FTP(File Transfer Protocol,文件传输协议),SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)。

教材学习中的问题和解决过程

本周代码托管截图

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 100/100 1/2 20/20
第二周 250/350 1/3 20/40
第三周 500/850 1/4 25/65
第四周 500/1350 1/5 20/85
第五周 550/1900 1/6 20/105
第六周 600/2500 2/8 20/125
第七周 500/3000 2/10 20/145
第八周 400/3400 3/13 15/160
第九周 100/3500 2/15 15/175
第十周 500/4000 2/17 25/200

参考资料

最新文章

  1. #8.11.16总结#CSS常用样式总结(二)
  2. BZOJ2458: [BeiJing2011]最小三角形
  3. TFT LCD 参数详解
  4. windows下apache配置https
  5. 【随记】数据库还原失败System.Data.SqlClient.SqlError: 无法执行 BACKUP LOG,因为当前没有数据库备份
  6. sublime text 2代码片段(Snippet)功能的使用
  7. Java 二分查找
  8. 各种开发语言示例调用HTTP接口(示例中默认HTTP接口编码为gb2312)
  9. python科学计算_numpy_线性代数/掩码数组/内存映射数组
  10. HX711初步处理记录
  11. 单向循环链表C语言实现
  12. 视频显著性检测-----Predicting Video Saliency using Object-to-Motion CNN and Two-layer Convolutional LSTM
  13. 解决space-between最后一排问题
  14. Jenkins之使用Pyinstaller构建Python应用程序
  15. JSR 规范目录
  16. Linux服务器部署系列之七—OpenLDAP篇
  17. vertical-align负值和margin-bottom负值的区别
  18. SAS8.1安装步骤(附图)
  19. LeetCode第[84]题(Java):Largest Rectangle in Histogram(最大的矩形柱状图)
  20. MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled

热门文章

  1. 160526、高并发之LVS搭建负载均衡
  2. linux 修改用户密码
  3. Linux 搭建Git服务器
  4. Python3中的urlencode和urldecode
  5. HBase-MR
  6. 转!!mybatis xml 传值 if test判断
  7. 13.Query for Null or Missing Fields-官方文档摘录
  8. awk经常使用字符串处理函数
  9. 出现 Request Entity Too Large问题的解决方法
  10. nodejs获取参数的方法