网络编程

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

网络概述

计算机网络概述

  • IP:每个计算机在联网以后都拥有一个唯一的合法IP地址,就像手机号,在计算机网络中,现在命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数字组成。这个IP地址可能是动态的,也可能是固定的。
  • 域名:一个IP地址可以对应多个域名,一个域名只能对应一个IP地址。域名的概念可以类比手机中的通讯簿,由于手机号码不方便记忆,所以添加一个姓名标识号码。
  • DNS服务器:在网络中传输的数据,全部是以IP地址作为地址标识,所以在实际传输数据以前需要将域名转换为IP地址,实现这种功能的服务器称之为DNS服务器,也就是通俗的说法叫做域名解析。 当DNS服务器正常工作时,使用IP地址或域名都可以很方便的找到计算机网络中的某个设备,例如服务器计算机。当DNS不正常工作时,只能通过IP地址访问该设备。
  • 端口:在同一个计算机中每个程序对应唯一的端口,这样一个计算机上就可以通过端口区分发送给每个端口的数据了。端口的号码必须位于0-65535之间,每个端口唯一的对应一个网络程序,一个网络程序可以使用多个端口。前台总机的电话号码就相当于IP地址,而每个员工的分机号就相当于端口。

    网络编程概述

    网络编程就是两个或多个程序之间的数据交换,基于“请求-响应”模型。在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。

  • 网络编程的一般有两种结构:
    1. 客户端/服务器结构,也叫做Client/Server结构,简称C/S结构。优点是表现力丰富,缺点是通用性差、维护的压力比较大。
    2. 浏览器/服务器结构,也叫做Browser/Server结构,简称为B/S结构。优点是开发的压力比较小,不需要维护客户端。缺点是限制比较大,表现力不强,无法进行系统级操作等。
  • P2P(Point to Point)程序:一种特殊的程序,程序中既包含客户端程序,也包含服务器端程序。
  • 协议(Protocol):协议可以随意编写,只要按照这种协议格式能够生成唯一的编码,按照该编码可以唯一的解析出发送数据的内容即可。也正因为各个网络程序之间协议格式的不同,所以才导致了客户端程序都是专用的结构。

    网络通讯方式

    在现有的网络中,网络通讯的方式主要有两种:

  1. TCP(传输控制协议)方式:进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。
  2. UDP(用户数据报协议)方式:进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。

    网络编程技术

    网络编程步骤

    客户端网络编程步骤

客户端的编程主要由三个步骤实现:

  1. 建立网络连接:在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。
  2. 交换数据:连接建立以后,就可以通过这个连接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。
    根据逻辑需要,可以多次交换数据,但是还是必须遵循请求响应模型。
  3. 关闭网络连接:在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。

    服务器端网络编程步骤

  4. 监听端口:服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。
  5. 获得连接:当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,服务器端和客户端也通过该连接进行数据交换。一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。
  6. 交换数据:服务器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。这个和客户端的数据交换数序不同。服务器端获得的连接和客户端连接是一样的,只是数据交换的步骤不同。当然,服务器端的数据交换也是可以多次进行的。在数据交换完成以后,关闭和客户端的连接。
  7. 关闭连接:当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。

    Java网络编程技术

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

    TCP编程

    在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以java.net.Socket类代表客户端连接,以java.net.ServerSocket类代表服务器端连接。在进行网络编程时,底层网络通讯的细节已经实现了比较高的封装,所以在程序员实际编程时,只需要指定IP地址和端口号码就可以建立连接了。正是由于这种高度的封装,一方面简化了Java语言网络编程的难度,另外也使得使用Java语言进行网络编程时无法深入到网络的底层,所以使用Java语言进行网络底层系统编程很困难,但是由于Java语言的网络编程比较简单,所以还是获得了广泛的使用。

  • Java语言中客户端的实现步骤:

    1. 建立连接:
      Socket socket1 = new Socket(“192.168.1.103”,10000);
      Socket socket2 = new Socket(“www.sohu.com”,80);
    2. 数据交换:
      OutputStream os = socket1.getOutputStream(); //获得输出流
      InputStream is = socket1.getInputStream(); //获得输入流
    3. 关闭网络连接:
      socket1.close();
  • Java语言中服务端的实现步骤:

    1. 监听端口:
      ServerSocket ss = new ServerSocket(10000);
    2. 获得连接:
      Socket socket = ss.accept();
    3. 数据交换:
      socket = serverSocket.accept(); //接收客户端发送内容
      is = socket.getInputStream();
    4. 关闭网络连接:
      ss.close();
  • 如何复用Socket连接?
    建立连接以后,将数据交换的逻辑写到一个循环中。这样只要循环不结束则连接就不会被关闭。
  • 如何使服务器端支持多个客户端同时工作?
    一个服务器端一般都需要同时为多个客户端提供通讯,如果需要同时支持多个客户端,则必须使用前面介绍的线程的概念。简单来说,也就是当服务器端接收到一个连接时,启动一个专门的线程处理和该客户端的通讯。

    UDP编程

  • 主要使用两个类:
  1. DatagramSocket:实现“网络连接”,包括客户端网络连接和服务器端网络连接。虽然UDP方式的网络通讯不需要建立专用的网络连接,但是毕竟还是需要发送和接收数据,DatagramSocket实现的就是发送数据时的发射器,以及接收数据时的监听器的角色。类比于TCP中的网络连接,该类既可以用于实现客户端连接,也可以用于实现服务器端连接。
  2. DatagramPacket:实现对于网络中传输的数据封装。在UDP方式的网络编程中,无论是需要发送的数据还是需要接收的数据,都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等。其实DatagramPacket类的作用类似于现实中的信件,在信件中包含信件发送到的地址以及接收人,还有发送的内容等,邮局只需要按照地址传递即可。在接收数据时,接收到的数据也必须被处理成DatagramPacket类型的对象,在该对象中包含发送方的地址、端口号等信息,也包含数据的内容。和TCP方式的网络传输相比,IO编程在UDP方式的网络编程中变得不是必须的内容,结构也要比TCP方式的网络编程简单一些。
  • Java语言中客户端的实现步骤:

    1. 建立连接:
      DatagramSocket ds = new DatagramSocket();
      或者
      DatagramSocket ds = new DatagramSocket(5000);
    2. 数据交换:
      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);
    3. 关闭网络连接:
      ds.close();
  • Java语言中服务端的实现步骤:

    1. 监听端口:
      DatagramSocket ds = new DatagramSocket(10010);
    2. 数据交换:同客户端,发送时需要端口号
      //获得客户端的IP
      InetAddress clientIP = receiveDp.getAddress();
      //获得客户端的端口号
      Int clientPort = receiveDp.getPort();
    3. 关闭网络连接:
      ds.close();

      网络协议

      网络协议是指对于网络中传输的数据格式的规定。网络协议设计完成以后,在进行网络编程时,就需要根据设计好的协议格式,在程序中进行对应的编码。

  • 客户端程序和服务器端程序需要进行协议处理的代码分别如下:
    1. 客户端程序需要完成的处理为:

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

代码托管截图

20145313 《Java程序设计》第十周学习总结的更多相关文章

  1. 201521123027 <java程序设计>第十周学习总结

    1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 异常: 多线程: 2.书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 ...

  2. Java程序设计第十周学习总结

    Java课程知识梳理: 流的区分; 字符流与字节流的区别: 字节流是直接操作文件本身的,如果没有关闭字节流操作,文件会依然输出内容 而字符流在程序运行之后会发现文件没有任何的内容,这是因为字符流操作的 ...

  3. 20145313张雪纯 《Java程序设计》8周学习总结

    20145313张雪纯 <Java程序设计>8周学习总结 教材学习内容总结 java.util.logging包的优点在于提供了日志功能相关类与接口,不必额外配置日志组件就可以在标准jav ...

  4. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  5. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  6. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  7. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  8. 20145237 《Java程序设计》第九周学习总结

    20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...

  9. 学号 20175212 《Java程序设计》第九周学习总结

    学号 20175212 <Java程序设计>第九周学习总结 教材学习内容总结 一.MySQL数据库管理系统 1.在官网上下载并安装MySQL 2.在IDEA中输入测试代码Connectio ...

  10. 20172325 2018-2019-2 《Java程序设计》第九周学习总结

    20172325 2018-2019-2 <Java程序设计>第九周学习总结 教材学习内容总结 图的定义 图是由顶点集(VertexSet)和边集(EdgeSet)组成,针对图G,顶点集和 ...

随机推荐

  1. LAMP集群项目五 nfs存储的数据实时同步到backupserver

    tar fxzsersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/ mv GNU-Linux-x86 sersync cp sers ...

  2. VUE学习总结

    VUE学习总结 文档:https://cn.vuejs.org/v2/guide/ Webstorm的一些常用快捷键:1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任 ...

  3. UVALive 6933 Virus synthesis(回文树)

    Viruses are usually bad for your health. How about ghting them with... other viruses? In this proble ...

  4. img元素的alt和title的区别?

    alt是图片加载失败时显示在网页上的提示信息: title是鼠标放上面时显示的文字(图片加载失败鼠标放显示的代替文字上时仍然会显示提示信息): 除此之外,alt是img的必要属性,只能用在img.ar ...

  5. C# DataTable和DataRelation

    form2.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...

  6. Exchange Database Status(Copy Status ,Content Index State,QueueLength,Move Status...)

    Copy Status Description Mounted The active copy is online and accepting client connections. Only the ...

  7. 2017 Multi-University Training Contest - Team 5——HDU6095&&HDU6090&&HDU

    HDU6095——Rikka with Competition 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6095 题目意思:抱歉虽然是签到题,现场 ...

  8. time-based DB

    这类时间序列数据库最多,使用也最广泛.一般人们谈论时间序列数据库的时候指代的就是这一类存储.按照底层技术不同可以划分为三类. 直接基于文件的简单存储:RRD Tool,Graphite Whisper ...

  9. Logstash之时区问题的建议和修改---filter---and duplicate resolution.

    2. logstash es duplicate https://logstash.jira.com/browse/LOGSTASH-1875 https://logstash.jira.com/br ...

  10. Yii框架2.0的视图和widgets表单的使用

    2.0的控制器的创建和action方法的添加和1.0的基本是一样的.但我发现他的widgets 的ActiveForm和1.1版本有些不一样的地方. 对于视图基本也是一样的,有render 和 ren ...