Java从零开始学习——Java网络编程

Posted kevinsblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java从零开始学习——Java网络编程相关的知识,希望对你有一定的参考价值。

网络编程

1、概述

TCP(电话)、UDP(邮件)

1.1、计算机网络

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

1.2、网络编程目的

数据交换——通信

1.3、网络通信的要素

  1. 通信双方地址——IP地址+端口号(准确定位网络上的一台或多台主机)

  2. 网络通信协议(如何进行通信)

    OSI七层网络模型TCP/IP四层概念模型对应的网络协议
    应用层Application 应用层 HTTPTFTPFTPNFSWAISSMTP
    表示层Presentation 应用层 TelnetRloginSNMPGopher
    会话层Session 应用层 SMTPDNS
    传输层Transport 传输层 Y
    网络层Network 网路层 IPICMPARPRARPAKPUUCP
    数据链接层Data Link 数据链接层 FDDIEthernetArpanetPDNSLIPPPP
    物理层Physical 数据链接层 E

     

javaWeb:网页编程 B/S

网络编程:TCP/IP C/S

 

1.3.1 IP

ip地址:InetAddress

  1. 定位唯一一台网络上的计算机

  2. 127.0.0.1 本机地址Localhost

  3. 分类

    IPV4/IPV6

    IPV4 127.0.0.1 4个字节组成 0~255 42亿

    IPV6 128位 8个无符号整数

    公网(互联网)-私网(局域网)

    192.168.xxx.xxx,专门给组织内部使用

    ABCD类地址

1 //查询本机地址
2 InetAddress ip1 = InetAddress.getByName("127.0.0.1");
3 InetAddress ip2 = InetAddress.getByName("loaclhost");
4 InetAddress ip3 = InetAddress.getLocalHost();
5 ?
6 //查询网站地址
7 InetAddress ip4 = InetAddress.getByName("www.baiu.com");
8 //四个get方法
9 ip4.getHostAddress();

 

1.3.2 端口

端口表示计算机上的一个程序的进程

  1. 不同的进程有不同的端口号,用来区分软件

  2. 0~65535

  3. TCP、UDP 65535*2 单个协议下,端口号不能冲突

  4. 分类

    公有端口 0~1023

    HTTP 80

    HTTPS 443

    FTP 21

    Telent 23

    程序注册端口 1024~491515

    Tomcat 8080

    mysql 3306

    Oracle 1521

    动态、私有 49152~65535

1 #查看所有端口
2 netstat -ano
3 #查看具体端口
4 netstat -ano|findstr "5900"
5 #查看具体端口的进程
6 tasklist|finstr "8696"

 

1 InetSocketAddress port1 = new InetSocketAddress("127.0.0.1",8080);
2 InetSocketAddress port2 = new InetSocketAddress("localhost");
3 ?
4 port1.getAddress();
5 port1.getHostName();
6 port1.getPort();

 

1.3.3 通信协议

协议:约定

网络通信协议:速率、传输码率、代码结构、传输控制等

问题:非常的复杂(通信工程)

大事化小:分层

TCP/IP协议簇:实际上是一组协议

  1. TCP:用户传输协议

  2. UDP:用户数据报协议

出名协议:

  1. TCP:传输

  2. IP:网络互连协议

 

TCP和UDP对比

TCP:打电话

  1. 连接、稳定

  2. 三次握手、四次挥手

 1 至少三次才能保证稳定链接
 2 A:你瞅啥?
 3 B:瞅你咋地?
 4 A:干一场?!
 5 ?
 6 ?
 7 A:我要走了!
 8 B:你真的要走了吗?
 9 B:你真的真要走了吗?
10 A:我真的要走了!
  1. 客户端、服务端

  2. 传输完成、释放链接、效率低

 

UDP:发短信

  1. 不连接、不稳定

  2. 客户端、服务端没有明确的界限

  3. 不管有没有准备好,都可以发给你

  4. 导弹

  5. DDOS:洪水攻击、饱和攻击

 

1.4 TCP通信机制

客户端

  1. 创建socket,连接服务器

1 Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9999);
  1. 创建输出流os

1 OutputStream os = socket.getOutputStream();
  1. 创建文件读取流fis

1 FileInputStream fis = new FileInputStream(new File("name.file"));
  1. fis读取buffer,os写出文件(管道流)

1 byte[] buffer = new byte[1024];
2 int len;
3 while ((len = fis.read(buffer)) != -1)
4 {
5     os.write(buffer,0,len);
6 }
  1. 通知服务器,传输完毕

1 socket.shutdownOutput();
  1. 创建is接收服务器传输内容,确认服务器接收完毕,关闭资源

 1 InputStream is = socket.getInputStream();
 2 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 3 byte[] buffer2 = new byte[1024];
 4 int len2;
 5 while ((len2 = is.read(buffer2)) != -1)
 6 {
 7     baos.write(buffer2,0,len2);
 8 }
 9 System.out.println(baos.toString());
10 ?
11 baos.close();
12 is.close();
13 fis.close();
14 os.close();
15 socket.close();

 

服务器

  1. 创建ServerSocket服务端口

1 ServerSocket serverSocket = new ServerSocket(9999);
  1. 创建Socket,等待(监听)用户连接Accept

1 Socket socket = serverSocket.accept();
  1. 创建输入流,获取客户端文件

1 InputStream is = socket.getInputStream();
  1. 创建文件输出流

1 FileOutputStream fos = new FileOutputStream(new File("Receive.png"));
2 byte[] buffer = new byte[1024];
3 int len;
4 while ((len = is.read(buffer)) != -1)
5 {
6     fos.write(buffer,0,len);
7 }
  1. 接收完毕,通知客户端可以关闭资源

1 OutputStream os = socket.getOutputStream();
2 os.write("接收完毕,可关闭连接.".getBytes());
3 ?
4 os.close();
5 fos.close();
6 is.close();
7 socket.close();
8 serverSocket.close();

 

1.5 UDP

客户发送端(不需要连接服务器)

 1 //建立Socket
 2 DatagramSocket socket = new DatagramSocket();
 3 ?
 4 //获取控制台输入内容
 5 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
 6 //循环输入
 7 while (true)
 8 {
 9     String data = reader.readLine();
10     byte[] datas =  data.getBytes();
11     int port = 6666;
12     //建立包
13     DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("127.0.0.1",port));
14     //发送包
15     socket.send(packet);
16     //断开连接条件
17     if (data.equals("bye"))
18     {
19         break;
20     }
21 }
22 //关闭资源
23 socket.close();

 

客户接受端

 1 //开放端口
 2 DatagramSocket socket = new DatagramSocket(6666);
 3 //循环接收
 4 while (true)
 5 {
 6     //准备接收packet
 7     byte[] container = new byte[1024];
 8     DatagramPacket packet = new DatagramPacket(container,0,container.length);
 9     socket.receive(packet);
10 
11     //写出包
12     byte[] datas = packet.getData();
13     String ReceiveData = new String(datas,0,datas.length);
14     System.out.println(ReceiveData);
15 
16     //断开连接条件
17     if (ReceiveData.equals("bye"))
18     {
19         break;
20     }
21 }
22 //断开资源
23 socket.close();

 

1.6 Tomcat

服务端

  1. 可自定义服务器

  2. 可用别人的(Tomcat)服务器

 

客户端

  1. 可自定义客户端

  2. 可用别人的(浏览器)客户端

 

以后javaweb主要用别人的服务器

 

1.7 URL

统一资源定位符:定位互联网上的资源

协议://ip地址:端口/项目名/资源

 

以上是关于Java从零开始学习——Java网络编程的主要内容,如果未能解决你的问题,请参考以下文章

Java从零开始学习——Java基础

Java从零开始学习——Java基础

如何从零开始学Java编程

java多线程高并发学习从零开始——初识volatile关键字

从零学Java之编程规范

Java编程没思路写不出代码怎么办