网络编程基础详解

来源:互联网 发布:备考六级英语听力软件 编辑:程序博客网 时间:2024/06/16 18:34
1.计算机网络:
(1) 概念:把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。
     ① 网络编程的目的:直接或间接地通过网络协议与其它计算机进行通讯。
     ② 网络编程中有两个主要的问题:
          如何准确地定位网络上一台或多台主机;
          找到主机后如何可靠高效地进行数据传输。
(2) 如何实现网络中的主机互相通信:
     ① 通信双方地址
     ② 一定的规则(有两套参考模型)
      TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。
      OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广。 

2.网络通信要素:
(1) 确定通信双方的地址(IP 地址:InetAddress)
     ① IP 地址(hostAddress):202.108.35.210
     ② 域名(hostName):www.atguigu.com(通过DNS域名解析器解析为ip地址,这样写的好处是用户容易记忆)
     说明:① ②是两种不同表示Ip地址的方式
InetAddress:表示一个IP地址
getLocalHost() : 获取本机的InetAddress实例
getByName(String host) : 根据主机名获取InetAddress实例
getHostName() : 获取主机名称
getHostAddress() : 获取主机的地址
//代码示例:
publicclassTestInetAddress {
     publicstaticvoidmain(String[]args)throwsIOException {
         InetAddressinet= InetAddress.getByName("www.baidu.com");
         System.out.println(inet);
         
         System.out.println(inet.getHostName());
         System.out.println(inet.getHostAddress());
         
         InetAddresslocalHost= InetAddress.getLocalHost();
         System.out.println(localHost);
     }
}
//运行结果:
www.baidu.com/220.181.112.244
www.baidu.com
220.181.112.244
LAPTOP-3FNN63N9/192.168.1.30
(2确定通信双方的端口号:端口号标识正在计算机上运行的进程(程序),不同的进程有不同的端口号 。
     被规定为一个 16 位的整数 0~65535。其中,0~1023被预先定义的服务通信占用(如MySql占用端口3306,http占用端口80等)。除非我们需要访问这些特定服务,否则,就应该使用 1024~65535 这些端口中的某一个进行通信,以免发生端口冲突。
        端口号与IP地址的组合得出一个网络套接字(Socket),Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础。
(3) 网络编程
     在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
     Socket就是为网络编程提供的一种机制,又叫套接字编程。Socket需要理解以下几点内容
     通信的两端都有Socket。
     网络通信其实就是Socket间的通信。
     数据在两个Socket间通过IO传输。
     Socket编程一般使用TCP与UDP两种协议。

3.基于TCP协议的网络编程
(1) TCP协议和UDP协议
     ① TCP协议:
      TCP协议通过三次握手协议将客户端与服务器端连接,两端使用各自的Socket对象。Socket对象中包含了IO流,供数据传输。
     即:TCP协议在客户端与服务器端通过Socket组成了IO通道,数据在IO通道中传输,客户端传输的数据成队列方式写出,服务器端接收,同样服务器端传输的数据成队列方式写出,客户端接收。
     ② UDP协议:
     将数据、源、目的封装成数据包,不需要建立连接
     每个数据报的大小限制在64K内
     因无需连接,故是不可靠的
     发送数据结束时无需释放资源,速度快l
(2) Socket
     利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准。
     通信的两端都要有Socket,是两台机器间通信的端点 。
     网络通信其实就是Socket间的通信。
     Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
     一般主动发起通信的应用程序属客户端,等待通信请求的为服务端 。
(3) 基于Socket的TCP编程
     ① Java语言的基于套接字编程分为服务端编程和客户端编程,其通信模型如图所示:

     ② Socket类的常用方法

     ③ ServerSocket类的常用方法

     ④ 客户端Socket的工作过程包含以下四个基本的步骤:

     ⑤ 服务器程序的工作过程包含以下四个基本的步骤:


⑥ 代码示例 :从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端。并关闭相应的连接。
//从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端。并关闭相应的连接  public class TestTCP3 {        @Test     public void client() throws IOException{         Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 9898);         FileInputStream fis = new FileInputStream("1.jpg");         OutputStream os = s.getOutputStream();         byte[] b = new byte[1024];         int len = 0;         while((len = fis.read(b)) != -1){              os.write(b, 0, len);         }         s.shutdownOutput();         //接收反馈         InputStream in = s.getInputStream();         while((len = in.read(b)) != -1){              System.out.println(new String(b, 0, len));         }         in.close();         os.close();         fis.close();         s.close();     }     @Test     public void server() throws IOException{         ServerSocket ss = new ServerSocket(9898);         Socket s = ss.accept();         InputStream in = s.getInputStream();         FileOutputStream fos = new FileOutputStream("2.jpg");         byte[] b = new byte[1024];         int len = 0;         while((len = in.read(b)) != -1){              fos.write(b, 0, len);         }         s.shutdownInput();         //发送反馈         OutputStream os = s.getOutputStream();         os.write("接收成功".getBytes());         os.close();         fos.close();         in.close();         s.close();         ss.close();     }}
4.基于UDP协议的网络编程
UDP:将数据源和目的封装到数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快。
(1) 服务器端:

(2) 客户端:

(3) 代码示例:
public class TestUDP {     @Test     public void send() throws IOException{         String str = "使用UDP协议发送数据给接收端!";         DatagramSocket ds = new DatagramSocket();         int i = 0;         while(i <= 100){              byte[] buf = str.getBytes(); //每个包中数据不能大于 64 kb              DatagramPacket dp = new DatagramPacket(buf, 0, buf.length, InetAddress.getByName("127.0.0.1"), 9898);              ds.send(dp);              System.out.println("发送端发送了第 " + i++ + " 个数据");         }         ds.close();     }     @Test     public void receive() throws IOException{         DatagramSocket ds = new DatagramSocket(9898);         byte[] buf = new byte[1024];         int i = 0;         while(i <= 100){              try {                  Thread.sleep(50);              } catch (InterruptedException e) {              }              DatagramPacket dp = new DatagramPacket(buf, buf.length);              ds.receive(dp);              System.out.println(new String(dp.getData(), 0, dp.getLength()));              System.out.println("接收端接收了第" + i++ + "个数据");         }         ds.close();     }}
5.TCP与UDP的区别:
(1) 基于连接与无连接;
(2) 对系统资源的要求(TCP较多,UDP少);
(3) UDP程序结构较简单;
(4) 流模式与数据报模式 ;
(5) TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

6.URL编程(统一资源定位符)
     URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一资源的地址。通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。
      URL的基本结构由5部分组成: <传输协议>://<主机名>:<端口号>/<文件名>
                                               例如:http://192.168.1.100:8080/helloworld/index.jsp
(1) 初始化URL对象的几种方式:
     为了表示URL,java.net 中实现了类 URL,我们可以通过下面的构造器来初始化一个 URL 对象:
public URL (String spec):通过一个表示URL地址的字符串可以构造一个URL对象。
     例如:URL url = new URL ("http://www. atguigu.com/");
public URL(URL context, String spec):通过基 URL 和相对 URL 构造一个 URL 对象。
     例如:URL downloadUrl = new URL(url, “download.html")
public URL(String protocol, String host, String file);
     例如:new URL("http", "www.atguigu.com", “download. html");
public URL(String protocol, String host, int port, String file);
     例如: URL gamelan = new URL("http", "www.atguigu.com", 80, “download.html");
(2) 获取URL属性的几种方式:
     类URL的构造方法都声明抛出非运行时异常,必须要对这一异常进行处理,通常是用 try-catch 语句进行捕获。
     一个URL对象生成后,其属性是不能被改变的,但可以通过它给定的方法来获取这些属性:
public String getProtocol(  )     获取该URL的协议名
public String getHost(  )           获取该URL的主机名
public String getPort(  )            获取该URL的端口号
public String getPath(  )           获取该URL的文件路径
public String getFile(  )             获取该URL的文件名
public String getRef(  )             获取该URL在文件中的相对位置
public String getQuery(   )        获取该URL的查询名
public class TestURL {     /*         public String getProtocol(  )     获取该URL的协议名         public String getHost(  )         获取该URL的主机名         public String getPort(  )         获取该URL的端口号         public String getPath(  )         获取该URL的文件路径         public String getFile(  )         获取该URL的文件名         public String getRef(  )          获取该URL在文件中的相对位置         public String getQuery(   )       获取该URL的查询名      */     @Test     public void test1() throws IOException{          URL url = new URL("http://localhost:8080/examples/myTest.txt");          System.out.println("getProtocol() :"+url.getProtocol());          System.out.println("getHost() :"+url.getHost());          System.out.println("getPort() :"+url.getPort());          System.out.println("getPath() :"+url.getPath());          System.out.println("getFile() :"+url.getFile());          System.out.println("getQuery() :"+url.getQuery());         /*InputStream in = url.openStream();         byte[] b = new byte[1024];         int len = 0;         while((len = in.read(b)) != -1){              System.out.println(new String(b, 0, len));         }         in.close();*/         /*URLConnection urlc = url.openConnection();         InputStream in = urlc.getInputStream();         byte[] b = new byte[1024];         int len = 0;         while((len = in.read(b)) != -1){              System.out.println(new String(b, 0, len));         }         in.close();*/     }}
(3) 针对HTTP协议的URLConnection类
     URL的方法 openStream():能从网络上读取数据 。
     若希望输出数据,例如向服务器端的 CGI (公共网关接口-Common Gateway Interface-的简称,是用户浏览器和服务器端的应用程序进行连接的接口)程序发送一些数据,则必须先与URL建立连接,然后才能对其进行读写,此时需要使用 URLConnection 。
     URLConnection:表示到URL所引用的远程对象的连接。当与一个URL建立连接时,首先要在一个 URL 对象上通过方法 openConnection() 生成对应的 URLConnection 对象。如果连接过程失败,将产生IOException。
URL netchinaren = new URL ("http://www.atguigu.com/index.shtml");URLConnectonn u = netchinaren.openConnection( );
7.小结:
(1) 位于网络中的计算机具有唯一的IP地址,这样不同的主机可以互相区分。
(2) 客户端-服务器是一种最常见的网络应用程序模型。服务器是一个为其客户端提供某种特定服务的硬件或软件。客户机是一个用户应用程序,用于访问某台服务器提供的服务。端口号是对一个服务的访问场所,它用于区分同一物理计算机上的多个服务。套接字用于连接客户端和服务器,客户端和服务器之间的每个通信会话使用一个不同的套接字。TCP协议用于实现面向连接的会话。
(3) Java 中有关网络方面的功能都定义在 java.net 程序包中。Java 用 InetAddress 对象表示 IP 地址,该对象里有两个字段:主机名(String) 和 IP 地址(int)。
(4) 类 Socket 和 ServerSocket 实现了基于TCP协议的客户端-服务器程序。Socket是客户端和服务器之间的一个连接,连接创建的细节被隐藏了。这个连接提供了一个安全的数据传输通道,这是因为 TCP 协议可以解决数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题,它保证数据可靠的传送。
(5) 类 URL 和 URLConnection 提供了最高级网络应用。URL 的网络资源的位置来同一表示 Internet 上各种网络资源。通过URL对象可以创建当前应用程序和 URL 表示的网络资源之间的连接,这样当前程序就可以读取网络资源数据,或者把自己的数据传送到网络上去。
原创粉丝点击