Java网络编程

来源:互联网 发布:刷yy币软件 编辑:程序博客网 时间:2024/06/09 20:15

一、网络编程概述

  ①Java是Internet上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。
  ②Java提供的网络类库,可以实现无痛的网络连接,网络的底层细节被隐藏在Java的本机安装系统里,由JVM进行控制。并且Java实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。

二、网络的目的

  直接或间接地通过网络协议与其它计算机进行通讯。

三、要想实现网络传输,需要考虑以下两个问题

  问题一:要想实现网络传输,需要考虑的问题有哪些?
 1.使用IP地址定位互联网上一台主机;使用端口号定位一个应用。
 2.要想是想网络传输,要先创建一个 InetAddress  类,我们通过以下方法建立 InetAddress  类:
    ①InetAddress inet = InetAddress.getByName(host);  //这里 host 指的是主机的IP地址
    ②InetAddress inet1 = InetAddress.getLocalHost();    //获取本机的InetAddress对象
 3.①String hostName = inet.getHostName();  //获取域名
    ②String hostAddress = inet.getHostAddress();//返回主机IP地址
  问题二:如何才能进行可靠的、高效的数据传输?
  要使实现可靠、高效的数据传输,必须通过网络通信协议。根据下图,了解网络通信协议:
  
   在java.net包中提供了两种常见的网络协议的支持:
    ①TCP:TCP是传输控协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称为TCP/IP。
    ②UDP:UDP是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。

   TCP和UDP的优缺点:
    1、TCP协议
    ①使用TCP协议前,须建立TCP链接,形成传输数据通道。
    ②传输前,采用“三次握手”方式,是可靠的。
    ③TCP协议进行通信的两个应用进程:客户端、服务端。
    ④在连接中可进行大数据量的传输。
    ⑤传输完毕,需释放已建立的连接,效率低。
   2.UDP协议
    ①将数据、源、目的封装成数据包,不需要建立连接。
    ②每个数据报的大小限制在64K内。
    ③因无需连接,故是不可靠的。
    ④发送数据结束时无需释放资源,速度快。

四、Socket 编程

  套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。

  当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行进行通信。

  java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。

五、基于TCP_IP协议的网络编程

 以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:
  ①服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
  ②服务器调用 ServerSocket 类 的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
  ③服务器正在等待时,一个客户端实例化一个Socket对象,指定服务器名称和端口号来请求连接。
  ④Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
  ⑤在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
  ⑥连接建立后,通过使用I/O流在进行通信。每一个 socket 都有一个输出流和一个输入流。客户端的输出流连接到服务器端的输入流,而客户端的输入 流连接到服务器端的输出流。

  下面我们通过一个TCP编程的例子来模仿一下客户端与服务端的交互:(注:以下代码的异常处理要严格按照 try-catch-finally 代码块处理,本例为节省代码长度,不做处理
  客户端代码:
//1.创建一个 Socket 对象,通过构造器指明服务端的IP地址以及接收程序的端口号Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9090);//2.getOutputStream():发送数据,方法返回 OutputStream 的对象OutputStream os = socket.getOutputStream();//3.具体的输出流程os.write("我是客户端请多关照!".getBytes());//4.关闭相应的流和 Socket 的对象os.close();socket.close();
  服务端代码:
//1.创建一个 ServerSocket 对象,通过构造器指明自身的端口号serverSocket = new ServerSocket(9090);//2.调用其accept()方法,返回一个 Socket 的对象s = serverSocket.accept();//3.调用 Socket 对象的getInputStream()方法获取一个从客户端发送过来的输入流is = s.getInputStream();//4.对获取的输入流进行的操作byte[] b = new byte[20];int len;while ((len = is.read(b)) != -1) {    String str = new String(b, 0, len);    System.out.println(str);}System.out.println("收到来自于" + s.getInetAddress().getHostAddress() + "的连接");//5.关闭相应的流以及 Socket、ServerSocket 的对象is.close();s.close();serverSocket.close();

六、基于UDP_IP协议的网络编程

  1.UDP网络通信
   ①类 DatagramSocket 和 DatagramPacket 实现了基于UDP协议的网络程序。
   ②UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不确定什么时候可以抵达
   ③DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
   ④UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的链接。
  2.UDP网络通信流程:
   ①DatagramSocket 和 DatagramPacket。
   ②建立发送端,接收端。
   ③建立数据包。
   ④调用 Scoket 的发送、接收方法。
   ⑤关闭 Scoket。
  3.发送端与接收端是两个独立的运行程序。  
  
  下面我们通过一个UDP编程的例子来模仿一下发送端和接收端的交互:(注:以下代码的异常处理要严格按照 try-catch-finally 代码块处理,本例为节省代码长度,不做处理
  发送端代码:
//1.这里我们创建一个空参的 DatagramSocket 对象,我们将IP地址和端口号放到数据报中DatagramSocket ds = new DatagramSocket();//2.准备好要发送的数据byte[] b = "你好,我是要发送的数据".getBytes();/** * 创建一个数据报,每一个数据报不能大于64k,都记录着数据信息、发送端IP、端口号以及要发送到的接收端的IP、端口号 * DatagramPacket(byte buf[], int offset, int length, InetAddress address, int port) * @param   buf      包数据。 * @param   offset   包数据偏移量。 * @param   length   包数据长度。 * @param   address  目的套接字地址。 * @param   port     目的端口号。*/DatagramPacket packet = new DatagramPacket(b, 0, b.length, InetAddress.getByName("127.0.0.1"), 9090);//4.调用 Scoket 的发送方法ds.send(packet);//5.关闭 Scoketds.close();
  接收端代码:
//1.创建一个 DatagramSocket 对象,此处需要有端口号这个参数,指明使用哪个应用来接收信息DatagramSocket ds = new DatagramSocket(9090);//2.创建一个数组byte[] b = new byte[1024];//3.创建一个数据报来接收发送端发过来的数据信息DatagramPacket packet = new DatagramPacket(b, 0, b.length);//4.调用 Scoket 的接收方法ds.receive(packet);//5.通过字符串输出一下,来看一下接收的信息是否正确String str = new String(packet.getData(), 0, packet.getLength());System.out.println(str);//6.关闭 Scoketds.close();
  这样就能实现一个简单的UDP的网络通信。

七、URL编程

  1.URL:URL全称统一资源定位符,它表示 Internet 上某一资源的地址。通过URL我们可以访问 Internet 上的各种网络资源,比如常见的www,ftp站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其它资源。
  2.URL的基本结构有5部分组成:
   ①<传输协议>://<主机名>:<端口号>/<文件名>
   例如:https://192.168.100.189:8080/helloworld.index.jsp
  3.创建URL对象:URL url = new URL(String spec); //此处的 spec 为文件的路径
   例如:http://127.0.0.1:8080/examples/hello.txt
  4.获取属性的方法
   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的查询名
  5.①URL的方法openStream():能从网上读取数据
  ②若希望输出数据,例如向服务端的程序发送一些数据,则必须先与URL建立连接,然后才能对其进行读写,此时需要使用 URLConnection。
  ③URLConnection:表示到URL所引用的远程对象的连接。当与一个URL建立连接时,首先要在一个URL对象上通过方法openConnection()生成对应的 URLConnection 对象。如果连接过程失败,将产生IOException。

  下面我们分析一个URL编程的例子:(注:以下代码的异常处理要严格按照 try-catch-finally 代码块处理,本例为节省代码长度,不做处理)、
  此处我们使用本地的 Tomcat 服务器上的资源进行测试:先启动好本地 Tomcat 服务器,新建一个hello.txt 文件

//创建一个URL对象URL url = new URL("http://127.0.0.1:8080/examples/hello.txt");//如何将服务端的资源读取进来openStreamInputStream is = url.openStream();byte[] b = new byte[20];int len;while ((len = is.read(b)) != -1) {    //打印在控制台上    String str = new String(b, 0, len);    System.out.println(str);}//如果既有数据的输入又有数据的输出则考虑使用URLConnection//将在服务器 hello.txt 文件中读取出来的信息保存到 abc.txt 文件中URLConnection urlConn = url.openConnection();InputStream is1 = urlConn.getInputStream();FileOutputStream fos = new FileOutputStream(new File("abc.txt"));byte[] b1 = new byte[20];int len1;while ((len1 = is1.read(b1)) != -1) {    fos.write(b1, 0, len1);}is.close();fos.close();is1.close();
 这样就能将文件里面的内容打印在控制台中了,如果本地 Tomcat 服务器中放的资源是视频文件,我们可以创建一个接收视频文件的流来接收此文件,就能做到将视频文件下载到本地。其实我们对于URL编程并不陌生,我们经常使用的迅雷就是使用了URL编程的知识来实现的,通过一个URL地址来下载网络服务器上的资源。好啦,快点动手试一试吧。

1 0