第十周java 学习总结

20145306 java的网络编程

网络概述

 网络编程技术是当前一种主流的编程技术,随着联网趋势的逐步增强以及网络应用程序的大量出现,所以在实际的开发中网络编程技术获得了大量的使用。至于以后的实际修行就要阅读进阶的书籍以及进行大量的实际练习。

###ip地址 域名 为了能够方便的识别网络上的每个设备,网络中的每个设备都会有一个唯一的数字标识,这个就是IP地址。在计算机网络中,命名IP地址的规定是IPv4协 议,协议规定每个IP地址由4个0-255之间的数字组成,如10.0.120.34。每个接入网络的计算机都拥有唯一的IP地址,这个IP地址可能是固 定的,例如网络上各种各样的服务器,也可以是动态的,例如使用ADSL拨号上网的宽带用户,无论以何种方式获得或是否是固定的,每个计算机在联网以后都拥 有一个唯一的合法IP地址。

     由于IP地址不容易记忆,所以为了方便记忆,有创造了另外一个概念——域名(Domain Name),例如sohu.com等。一个IP地址可以对应多个域名,一个域名只能对应一个IP地址。

     在网络中传输的数据,全部是以IP地址作为地址标识,所以在实际传输数据以前需要将域名转换为IP地址,实现这种功能的服务器称之为DNS服务器,也就是通俗的说法叫做域名解析。例如当用户在浏览器输入域名时,浏览器首先请求DNS服务器,将域名转换为IP地址,然后将转换后的IP地址反馈给浏览器,然后再进行实际的数据传输。

     当DNS服务器正常工作时,使用IP地址或域名都可以很方便的找到计算机网络中的某个设备,例如服务器计算机。当DNS不正常工作时,只能通过IP地址访问该设备。所以IP地址的使用要比域名通用一些。

端口

同一个计算机中每个程序对应唯一的端口,这样一个计算机上就可以通过端口区分发送给每个端口的数据了,换句话说,也就是一个计算机上可以并发运行多个网络程序,而不会在互相之间产生干扰。

     在硬件上规定,端口的号码必须位于0-65535之间,每个端口唯一的对应一个网络程序,一个网络程序可以使用多个端口。这样一个网络程序运行在一台计算上时,不管是客户端还是服务器,都是至少占用一个端口进行网络通讯。在接收数据时,首先发送给对应的计算机,然后计算机根据端口把数据转发给对应的程序。

协议

网络编程就是运行在不同计算机中两个程序之间的数据交换。在实际进行数据交换时,为了让接收端理解该数据,那么就需要规定该数据的格式,这个数据的格式就是协议。
按照一种协议格式能够生成唯一的编码,按照该编码可以唯一的解析出发送数据的内容即可。也正因为各个网络程序之间协议格式的不同,所以才导致了客户端程序都是专用的结构。
在实际的网络程序编程中,最麻烦的内容不是数据的发送和接收,因为这个功能在几乎所有的程序语言中都提供了封装好的API进行调用,最麻烦的内容就是协议的设计以及协议的生产和解析,这个才是网络编程中最核心的内容。

网络编程

     有了IP地址和端口的概念以后,在进行网络通讯交换时,就可以通过IP地址查找到该台计算机,然后通过端口标识这台计算机上的一个唯一的程序。这样就可以进行网络数据的交换了。

     但是,进行网络编程时,只有IP地址和端口的概念还是不够的,下面就介绍一下基础的网络编程相关的软件基础知识。

     网络编程就是两个或多个设备之间的数据交换,其实更具体的说,网络编程就是两个或多个程序之间的数据交换,和普通的单机程序相比,网络程序最大的不同就是需要交换数据的程序运行在不同的计算机上,这样就造成了数据交换的复杂。虽然通过IP地址和端口可以找到网络上运行的一个程序,但是如果需要进行网络编程,则还需要了解网络通讯的过程。
     网络通讯基于“请求-响应”模型。
     第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。
*网络通讯方式
TCP(传输控制协议)方式
TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。
UDP(用户数据报协议)方式
UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。
以上两种传输方式都是实际的网络编程中进行使用,重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则都通过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。

##网络编程的步骤 ###客户端网络编程 建立网络连接

   客户端网络编程的第一步都是建立网络连接。在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。

  交换数据

  连接建立以后,就可以通过这个连接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。

  根据逻辑需要,可以多次交换数据,但是还是必须遵循请求响应模型。

   关闭网络连接

  在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。

### 服务器端网络编程 服务器端(Server)是指在网络编程中被动等待连接的程序,服务器端一般实现程序的核心逻辑以及数据存储等核心功能。服务器端的编程步骤和客户端不同,是由四个步骤实现,依次是: 监听端口

  服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。

  这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。

  获得连接

  当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换。

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

  交换数据

  服务器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。简单来说,就是先接收再发送,这个和客户端的数据交换数序不同。

    其实,服务器端获得的连接和客户端连接是一样的,只是数据交换的步骤不同。

   当然,服务器端的数据交换也是可以多次进行的。

  在数据交换完成以后,关闭和客户端的连接。

  关闭连接

   当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。
   总之,无论使用任何语言,任何方式进行基础的网络编程,都必须遵循固定的步骤进行操作,在熟悉了这些步骤以后,可以根据需要进行逻辑上的处理,但是还是必须遵循固定的步骤进行。
   基础的网络类——InetAddress类
   TCP编程

    按照前面的介绍,网络通讯的方式有TCP和UDP两种,其中TCP方式的网络通讯是指在通讯的过程中保持连接,有点类似于打电话,只需要拨打一次号码(建立一次网络连接),就可以多次通话(多次传输数据)。这样方式在实际的网络编程中,由于传输可靠,类似于打电话,如果甲给乙打电话,乙说没有听清楚让甲重复一遍,直到乙听清楚为止,实际的网络传输也是这样,如果发送的一方发送的数据接收方觉得有问题,则网络底层会自动要求发送方重发,直到接收方收到为止。

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

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

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

  Socket socket1 = new Socket(“192.168.1.103”,10000);

     Socket socket2 = new Socket(“www.sohu.com”,80);
     连接一旦建立,则完成了客户端编程的第一步,紧接着的步骤就是按照“请求-响应”模型进行网络数据交换,在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可。示例代码如下:

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

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

     最后当数据交换完成以后,关闭网络连接,释放网络连接占用的系统端口和内存等资源,完成网络操作,示例代码如下:

     socket1.close();
     在服务器端程序编程中,由于服务器端实现的是被动等待连接,所以服务器端编程的第一个步骤是监听端口,也就是监听是否有客户端连接到达。实现服务器端监听的代码为:

     ServerSocket ss = new ServerSocket(10000);
     通过获得连接,使得客户端的连接在服务器端获得了保持,另外使得服务器端的端口释放出来,可以继续等待其它的客户端连接。 实现获得连接的代码是:

     Socket socket = ss.accept();
     最后,在服务器端通信完成以后,关闭服务器端连接。实现的代码为:

     ss.close();
时间: 2024-12-15 01:42:04

第十周java 学习总结的相关文章

第十周java学习总结

目录 第十周java学习总结 学习内容 代码上传截图 代码链接 第十周java学习总结 学习内容 第12章 Java多线程机制 主要内容 Java中的线程 Thread类与线程的创建 线程的常用方法 线程同步 协调同步的线程 线程联合 GUI线程 计时器线程 重点和难点 重点:多线程的概念:如何创建多线程 难点:理解多线程机制 进程与线程 操作系统与进程 程序是一段静态的代码,它是应用软件执行的蓝本. 进程是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过程,这个过程也是进

20145307第十周JAVA学习报告

教材学习内容总结 Java的网络编程 1.计算机网络概述 (1)路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控制等,通过光纤.网线等连接将设备连接起来,从而形成了一张巨大的计算机网络. (2)网络最主要的优势在于共享:共享设备和数据,现在共享设备最常见的是打印机. (3)IP地址:为了能够方便的识别网络上的每个设备,网络中的每个设备的唯一的数字标识.现在命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数字组成,例如10.0.120.34.IP

20145307陈俊达第六周JAVA学习总结

20145307陈俊达第六周JAVA学习总结 知识点梳理 第十章节 S1 ·若要将数据从来源中取出,可以使用输入串流:若要将数据写入目的地,可以使用输出串流.在java中,输入串流代表对象为java.in.InputStream的实例:输出串流代表对象为java.io.Outputstream的实例. ·在来源与目的地都不知道的情况下可以设计一个通用的dump()方法,该方法接受InputStream与OutputStream实例,分别代表读取数据的来源.输出的目的地. ·每次从Inputstr

第五周JAVA学习笔记(五)

将指定目录下的所有文件显示到列表框(JList)组件中, :效果图如下:                  import java.awt.BorderLayout; import java.io.File; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JScrollPane; public class kuang { public st

第五周Java学习总结(补)

第五周java学习内容(补) 学习内容: File类方法的操作 public String getName() public boolean canRead() public boolean canWrite() ...... 匿名类try-catch的用法. 创建目录与目录的删除. 文件输入流输出流 ...... 代码截图: 由于是第五周和第六周的代码混合到一起了,所以代码截图截图内容包括了第五周和第六周代码的总和,第六周代码由于时间紧张,并没有全敲,望请谅解. 遇到的问题: Q:在学习匿名类

第七周Java学习总结

第七周Java学习总结: 代码截图: 数据库中遇到的问题: 在下载完MySQL后,解压压缩包,再打开command+r的cmd.exe后使用mysql-5.7.21-winx64\binmysql --initialize-insecure后,出现拒绝访问的情况,在仔细核对后解决了权限的问题. 之后下载xammp,使用老师给的链接发现下载错误,而在百度搜索下载是只有32位,不过下载下来之后并不影响操作. 学习内容 1.MySQL数据库管理系统. 2.链接MySQL数据库. 3.查询操作 4.更新

第十周Java总结

第十周Java总结 在整个IO包中,实际就是分为字节流和字符流但是除了这两个流之外,还存在一组字节流-字符流的转化类 OutputStreamWriter:是Witer的子类,将输出的字符流变为字节流,即:将一个字符流的输出对象变成字节流输出对象 InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输出对象变成字符流输出对象 bis:内存的输入流 bos:内存的输出流 Character.toLowerCase(c):将字符变为小写 PipedO

第六周java学习总结

学号 20175206 <Java程序设计>第六周学习总结 教材学习内容总结 第七章: 主要内容 内部类 匿名类 异常类 断言 重点和难点 重点:内部类和异常类的理解 难点:异常类的使用 第十章: 主要内容 File类 文件字节输入.输出流 文件字符输入.输出流 缓冲流 随机流 数组流 数据流 对象流 序列化与对象可隆 使用Scanner解析文件 文件锁 重点和难点 重点:通过文件流读写数据,各种数据流的区别.掌握流的连接思想. 难点:流的连接思想及各种数据流的使用. 代码调试中的问题和解决过

暑假第一周Java学习心得

因为上周由于在学校忙于小学期的任务,所以忘记了发布博客,所以计划在第二周结束的时候再补上第一周的学习内容. (1)本周在学校几乎每天都在学习,除了每天下午下了课会和同学出去打篮球外,几乎每天都在都在编程.本周安装了java 的开发工具创建了saluton程序. (2)下周准备认真预习java语言,同时复习C++学习class语句,main语句,大括号,学习在变量中储存信息,保存编写好的程序,将程序编译为class文件, ,学习构造一个应用程序,并向程序传递参数,学习使用Java类库,并在程序中创