Java网络编程

编辑时间:2021/03/27

读完本节:大概花费29钟,共2909词

文章目录

  • Java网络编程
    • 1.网络编程概述
    • 2.通信信息要素
    • 3.TCP网络编程
    • 4.UDP网络编程
    • 5.URL编程
      • ***STAY ANGER!!!***

1.网络编程概述

  1. Java从语言级上提供了对网络应用程序的支持,Java提供的网络类库,可以实现便捷的网络连接,联网的底层细节被隐藏Java的本机安装系统里,由JVM进行控制,并且Java实现了一个跨平台的网络库,用户面对的是一个统一的网络编程环境
  2. 计算机网络:把分布在不同地理区域的计算机与专门的外部设备用通信线路互联成一个规模大、功能强的网络系统,从而使众多的计算机可以方便的相互传递信息、共享硬件、软件、数据信息等资源。
  3. 网络编程的目的:直接或间接的通过网络协议与其他计算机实现数据交换,进行通讯
  4. 网络编程中存在的两个主要问题:
    1. 问题一:如何准确的定位网络上一台主机或多台主机;定位主机上特定的应用
    2. 问题二:找到主机之后如何可靠高效的进行数据传输

2.通信信息要素

  1. IP和端口号:通过双方的IP和端口号实现在网络中准确的定位信息交互的节点

  2. 网络通信协议:作为一定的规则确保主机连接之后能够高效或可靠的进行数据传输,这些规则即通信协议。

    1. 通信协议对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。

    2. 通过通信协议分层的思想解决了通信设计内容很多带来的麻烦;在指定协议时,把复杂成分分解成一些简单的成分,再将它们符合起来。最常用的符合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。各层之间互不影响,利于系统的开发和扩展

    3. 网络通信协议的层次模型:

  3. 通信要素:IP和端口号

    1. IP地址:InetAddress

      1. 唯一的标识Internet上的计算机(通信实体)
      2. 本地回环地址(hostAddress):127.0.0.1;主机名(hostName):localhost
      3. IP地址分类方式1:IPv4和IPv6
        1. IPv4:4个字节组成,4个0-255.大概42亿,以点分十进制表示,目前已用尽
        2. IPv6:128位(16字节组成),写成8个无符号整数,每个整数用四个十六进制位表示,树枝间用冒号分隔,
      4. IP地址分类方式2:公网地址(万维网使用)和私有地址(局域网使用)
        1. 192.168.开头的就是私有地址,范围从192.168.0.0~192.168.255.255,专门为组织机构内部使用
      5. 实例化InetAddress的两个方法:getByName(String host)、getLocalHost();两个常用的方法getHostName()、getHostAddress()
      import java.net.InetAddress;
      import java.net.UnknownHostException;/*** @Author: xuehai.XUE* @MailBox: xuehai.xue@qq.com* @Date: 2021/3/27 20:31* @Description:*/
      public class InetAddressTest {public static void main(String[] args) {try {InetAddress inet1 = InetAddress.getByName("192.168.137.1");System.out.println(inet1);InetAddress inet2 = InetAddress.getByName("5gbsoh.com");System.out.println(inet2);} catch (UnknownHostException e) {e.printStackTrace();}}
      }
      
    2. 端口号:用于标识正在计算机上运行的进程

      1. 不同的进程由不同的端口号,两个进程的端口号相同会造成端口冲突
      2. 端口号被规定成16位的整数:0~65535
      3. 端口分类:
        1. 公认端口:0~1023。被预先定义的服务通信占用(如:HTTP占用端口80,FTP占用端口21,Telnet占用端口23)
        2. 注册端口:1024~49151。分配给用户进程或应用程序。(如:Tomcat占用端口8080,MySQL占用端口3306,Oracle占用端口1521等)
        3. 动态/私有端口:49152~65535
    3. 端口号和IP地址的组合得出一个网络套接字:Socket

  4. 通信要素:网络协议

    1. TCP/IP协议簇:

      1. 传输层协议中有两个非常重要的协议:

        1. 传输控制协议TCP:(Transmission Control Protocol)
        2. 用户数据报协议UDP:(User Datagram Proticol)
      2. TCP/IP以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议
      3. IP(Internet Protocol)协议是网络层的主要协议,支持王建互联的数据通信
      4. TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层、IP层、传输层和应用层
    2. TCP和UDP

      1. TCP协议:

        1. 使用TCP协议前,需要建立TCP连接,形成传输数据通道

        2. 传输前,采用“三次握手”方式,点对点通信,是可靠的

        3. TCP协议进行通信的两个应用进程:客户端、服务端(B/S)

        4. 在连接中可进行大量数据的传输

        5. 传输完毕,需要释放已建立的连接(四次挥手),效率低

      2. UDP协议:

        1. 将数据、源、目的封装成数据包,不需要建立连接
        2. 每个数据包的大小限制在64k内
        3. 发送不管对方是否准备好,接收方收到也不确认,故UDP是不可靠的
        4. 可以广播发送
        5. 发送数据结束时无需释放资源,开销小,速度快

3.TCP网络编程

  1. 例1,实现客户端发送信息给服务端,服务端将数据显示在控制台上

    import org.junit.Test;import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;/*** @Author: xuehai.XUE* @MailBox: xuehai.xue@qq.com* @Date: 2021/3/27 21:07* @Description: 客户端发送信息给服务端,服务端将数据显示在控制台上*/
    public class TCPTest {@Testpublic void client(){Socket socket = null;OutputStream os = null;try {//1. 创建Socket对象,指明服务器端的IP和端口号InetAddress inet = InetAddress.getByName("192.168.137.1");socket = new Socket(inet,12131);//2. 获取一个输出流,用于输出数据os = socket.getOutputStream();//3. 写出数据操作os.write("c'est la vie".getBytes());} catch (IOException e) {e.printStackTrace();} finally {if(os != null){try {os.close();} catch (IOException e) {e.printStackTrace();}}if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}@Testpublic void server(){ServerSocket ss = null;Socket socket = null;InputStream is = null;ByteArrayOutputStream baos = null;try {//1. 创建服务器端的ServerSocket,指明自己的端口号ss = new ServerSocket(12131);//2. 调用accept()表示接收来自于客户端的socketsocket = ss.accept();//3. 获取输入流is = socket.getInputStream();//不建议,可能会有乱码
    //        byte[] buffer = new byte[1024];
    //        int len;
    //        while ((len = is.read(buffer)) != -1){//            String str = new String(buffer,0,len);
    //            System.out.println(str);
    //        }//4. 读取输入流中的数据baos = new ByteArrayOutputStream();byte[] buffer = new byte[5];int len;while ((len = is.read(buffer)) != -1){baos.write(buffer,0,len);}System.out.println(baos.toString());System.out.println("收到了来自于:" + socket.getInetAddress().getHostAddress());} catch (IOException e) {e.printStackTrace();} finally {//5. 关闭资源if(baos != null){try {baos.close();} catch (IOException e) {e.printStackTrace();}}if(is != null){try {is.close();} catch (IOException e) {e.printStackTrace();}}if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}if(ss != null){try {ss.close();} catch (IOException e) {e.printStackTrace();}}}}
    }
    

  2. 从客户端发送文件给服务器端,服务端保存到本地,并输出”你还在等什么呢?“。并返回“c’est la vie”给客户端。并关闭相应的连接

    import org.junit.Test;import java.io.*;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;/*** @Author: xuehai.XUE* @MailBox: xuehai.xue@qq.com* @Date: 2021/3/27 21:32* @Description: 从客户端发送文件给服务器端,服务端保存到本地。并返回“发送成功”给客户端。并关闭相应的连接*/
    public class TCPTest1 {@Testpublic void client(){Socket socket = null;OutputStream os = null;FileInputStream fis = null;InputStream is = null;ByteArrayOutputStream baos = null;try {//1.socket = new Socket(InetAddress.getByName("192.168.137.1"),31674);//2.os = socket.getOutputStream();//3.fis = new FileInputStream(new File("UnlimitedProgress.jpg"));//4.byte[] buffer = new byte[1024];int len;while ((len = fis.read(buffer)) != -1){os.write(buffer,0,len);}//重要:关闭数据的输出,否则服务端会一直等待客户端结束输出数据socket.shutdownOutput();//5. 接收来自服务端的数据,并显示到控制台上is = socket.getInputStream();baos = new ByteArrayOutputStream();byte[] bufferr = new byte[20];int len1;while ((len1 = is.read(bufferr)) != -1){baos.write(bufferr,0,len1);}System.out.println(baos.toString());} catch (IOException e) {e.printStackTrace();} finally {//5.if(baos != null){try {baos.close();} catch (IOException e) {e.printStackTrace();}}if(is != null){try {is.close();} catch (IOException e) {e.printStackTrace();}}if(fis != null){try {fis.close();} catch (IOException e) {e.printStackTrace();}}if(os != null){try {os.close();} catch (IOException e) {e.printStackTrace();}}if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}@Testpublic void server(){ServerSocket ss = null;Socket socket = null;InputStream is = null;FileOutputStream fos = null;try {//1.ss = new ServerSocket(31674);//2.socket = ss.accept();//3.is = socket.getInputStream();//4.fos = new FileOutputStream(new File("UnlimitedProgress_bak1.jpg"));//5.byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1){fos.write(buffer,0,len);}//6. 服务器给予客户端反馈OutputStream os = socket.getOutputStream();os.write("c'est la vie".getBytes());System.out.println("你还在等什么呢?");} catch (IOException e) {e.printStackTrace();} finally {//7.if(fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}if(is != null){try {is.close();} catch (IOException e) {e.printStackTrace();}}if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}if(ss != null){try {ss.close();} catch (IOException e) {e.printStackTrace();}}}}}
    

4.UDP网络编程

  1. 类DatagramSocket和DatagramPackePacket实现了基于UDP协议的网络程序,

  2. UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达

  3. DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端IP地址和端口号

  4. UDP协议中每个数据报都给出了完整的地址信息,因此无需建立发送方和接收方的连接。

    import org.junit.Test;import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;/*** @Author: xuehai.XUE* @MailBox: xuehai.xue@qq.com* @Date: 2021/3/27 22:29* @Description:*/
    public class UDPTest {@Test/** 发送器 */public void sender(){DatagramSocket socket = null;try {socket = new DatagramSocket();String str = "使用UDP方式发送的消息";byte[] data = str.getBytes();InetAddress inet = InetAddress.getByName("127.0.0.1");DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,9090);socket.send(packet);} catch (IOException e) {e.printStackTrace();} finally {if(socket != null){socket.close();}}}@Test/** 接收器 */public void receiver(){DatagramSocket socket = null;try {socket = new DatagramSocket();byte[] buffer = new byte[100];DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);socket.receive(packet);System.out.println(new String(packet.getData(), 0, packet.getLength()));} catch (IOException e) {e.printStackTrace();} finally {if(socket != null){socket.close();}}}
    }
    

5.URL编程

  1. URL类(Uniform Resourse Locator):统一资源定位符,表示Internet上某一资源的地址
  2. 它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源,比如最常见的WWW,ftp,站点。浏览器通过解析给定的URL资源可以在网络上查找相应的文件或其他资源
  3. URL的基本结构由5部分构成:
    1. <传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
    2. #片段名:即锚点
    3. 参数列表格式:参数名=参数值&参数名=参数值&…&参数名=参数值
  4. 为了表示URL,java.net中实现了类URL。我们可以通过下面的构造器来初始化一个URL对象:
    1. public URL(String spec):通过一个表示URL地址的字符串可以构造一个URL对象。
    2. public URL(URL context, String spec):通过基URL和相对URL构造一个URL对象
    3. public URL(String potocol, String host, String file)
    4. public URL(String potocol, String host, int port, String file)
  5. URL类的构造器都声明抛出非运行时异常,必须要对这一异常进行处理,通常是使用try-catch语句进行捕获
  6. URL类常用的方法:一个URL对象生成后,其属性是不能被改变的,但可以通过它给定的方法获取这些属性
    1. public String getProtocol():获取该URL的协议名
    2. public String getHost():获取该URL的主机名
    3. public String getPort():获取该URL的端口号
    4. public String getPath():获取该URL的文件路径
    5. public String getFile():获取该URL的文件名
    6. public String getQuery():获取该URL的查询名

STAY ANGER!!!

20210327Java网络编程相关推荐

  1. Linux网络编程--进程间通信(一)

    进程间通信简介(摘自<Linux网络编程>p85) AT&T 在 UNIX System V 中引入了几种新的进程通讯方式,即消息队列( MessageQueues),信号量( s ...

  2. C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口。

    C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口. 最近接触了C#Socket网络编程,试着做了试试(*^__^*) 实现多个客户端和服务端互相发送消息 发送文件 抖动窗口功能 ...

  3. java基于http协议编程_Java中基于HTTP协议网络编程

    java中为我们的网络支持提供了java.net包,能够使我们以编程的方式来访问Web服务功能,这篇博客,就跟大家分享一下,Java中的网络编程的知识,主要是学习下该java.net包下的API. U ...

  4. java 密钥工厂 desede_20145212 实验五《Java网络编程》

    20145212 实验五<Java网络编程> 一.实验内容1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代 ...

  5. Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...

  6. android 网络编程实现,Android开发使用HttpURLConnection进行网络编程详解【附源码下载】...

    本文实例讲述了Android开发使用HttpURLConnection进行网络编程.分享给大家供大家参考,具体如下: --HttpURLConnection URLConnection已经可以非常方便 ...

  7. Linux网络编程实例分析

    最近由于工作原因需要温习一下Linux网络编程的部分基础知识,因此对之前写的Socket网络通信的代码进行了进一步优化和拓展,在不关闭一次Socket连接的基础上,对服务端加入循环读写的功能,同时加入 ...

  8. C语言网络编程:多路IO select实现多客户端

    文章目录 阻塞式的服务器程序 多线程服务器程序 非阻塞式服务器程序 基于事件响应的服务器程序 事件响应服务器程序的实现`select` 阻塞式的服务器程序 我们接触过最多的最基础的网络通信模型为TCP ...

  9. C语言网络编程:close或者shutdown断开通信连接

    文章目录 前言 close函数介绍 shutdown函数介绍 前言 这里在主要通过实例进行描述close函数在网络编程中的使用 TCP编程模型中客户端或者服务器只要主动通过close发起断开连接的请求 ...

最新文章

  1. 提高C++性能的编程技术笔记:虚函数、返回值优化+测试代码
  2. python前面+r
  3. 三个基于.net的浏览器内核使用的比较
  4. Adobe air 安装软件解析
  5. eclipse安卓工程的构建、配置连接模拟器、安卓工程结构介绍
  6. linux运维之道基础命令,Linux运维之道(7)——Linux管理类命令
  7. TreeView节点的演练 c# 1614840318
  8. js高级(类和对象)
  9. 成为谷歌的java程序员首先要做到这五点!
  10. CDA数据分析师Level_1大纲最全解析
  11. 教你如何养微信小号,什么样的号可以群爆粉?
  12. 【计算机系统结构】第3章 流水线技术问答题
  13. java权限控制是什么_论Java访问权限控制的重要性
  14. 简单阅读golang的net/http包和Negroni的源码
  15. Android的gps定位
  16. 电脑计算机界面打开后无法缩小,技术编辑演示win10系统iE网页界面大小无法缩放的办法...
  17. Snapseed玩出新高度,分分钟让你成p图大神! 转
  18. You may have an infinite update loop in a component render function问题解决
  19. 如何防止游戏检测出模拟器_如何用手机玩PSP游戏 PPSSPP模拟器 高清PSP模拟器 最新已付费黄金版...
  20. 【每天一个java设计模式(十八)】 - 观察者模式

热门文章

  1. 基于《高级计算机图形学原理与实践》(西安科技大学)的学习笔记(一、二)
  2. 10005---CSS语法
  3. 台式计算机颜色如何矫正,win10电脑显示器颜色不对如何调整|win10系统校正显示器色调的三种方法...
  4. 黑苹果忘记密码解决办法
  5. 什么是单工通信、半双工通信、全双工通信?3种通信方式的区别是什么?
  6. 笔记本添加外置显示器
  7. Oracle 查询临时表空间
  8. Python进行微信公众号开发
  9. 华为新旗舰鸿蒙,华为新旗舰6月即将登场!鸿蒙系统+液态镜头,比Mate40更难购买...
  10. 微信小程序踩坑之微信支付提示商户未开通支付权限