Java(网络编程)

参考视频:1、什么是计算机网络(狂神)

1. 概述

  • 地球村
  • TCP:打电话
  • UDP:发短信

计算机网络:

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

网络编程的目的:

  • 数据交换

网络编程需要什么:

  • 如何准确的定位网络上的一台主机?

    • 192.168.16.124:端口,定位到这个计算机上的某个资源
  • 找到了主机,如何传输数据?
    • JavaWeb:网页编程:B/S
    • 网络编程:TCP/IP:C/S

2. 网络通信的要素

如何实现网络的通信?

  • 通信双方地址:

    • ip
    • 端口号
    • 192.168.16,124:5900
  • 规则:网络通信的协议
    • TCP/IP参考模型:

      小结:
  • 网络编程中有两个主要问题:
    • 如何准确的定位到网络上的一台或者多台主机
    • 找到主机之后如何进行通信
  • 网络编程中的要素:
    • IP 和 端口号:IP
    • 网络通信协议:UDP,TCP
  • 万物皆对象

3. IP

ip地址: InetAddress

  • 唯一定位一台网络上计算机
  • 127.0.0.1:本机 localhost
  • ip地址的分类
    • ipv4 / ipv6

      • IPV4 127.0.0.1,4个字节组成。0~255,42亿。30E北美,4E亚洲。2011年用尽。
      • IPV6 2014:0bb2:aaaa:0520:0000:0000:1aaa:1314!,128位。8个无符号数!
    • 公网(互联网) / 私网(局域网)
      • ABCD类地址
      • 192.168.xx.xx,专门给组织内部使用
    • 域名:记忆IP问题!
      • IP:www.vip.com

示例一:

package com.zach.lesson01;import java.net.InetAddress;
import java.net.UnknownHostException;//测试IP
public class TestInetAddress {public static void main(String[] args) {try {//查询本机地址InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");System.out.println(inetAddress1);InetAddress inetAddress3 = InetAddress.getByName("localhost");System.out.println(inetAddress3);InetAddress inetAddress4 = InetAddress.getLocalHost();System.out.println(inetAddress4);//查询网站ip地址InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");System.out.println(inetAddress2);//常用方法System.out.println(inetAddress2.getAddress());System.out.println(inetAddress2.getCanonicalHostName());//规范的名字System.out.println(inetAddress2.getHostAddress());//ipSystem.out.println(inetAddress2.getHostName());//域名,或者自己电脑的名字} catch (UnknownHostException e) {e.printStackTrace();}}
}

4. 端口

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

  • 不同的进程有不同的端口号!用来区分软件!
  • 被规定 0~65535
  • TCP,UDP:65535*2
    • tcp:80,udp:80,单个协议下,端口号不能冲突。
  • 端口分类
    • 公有端口 0~1023

      • HTTP : 80
      • HTTPS : 443
      • FTP : 21
      • Telent : 23
    • 程序注册端口:2014~49151,分配用户或者程序
      • Tomcat : 8080
      • MySQL : 3306
      • Oracle : 1521
    • 动态、私有:49152~65535
 netstart -ano   //#查看所有端口netstart -ano|findstr "5900" //#查看指定的端口tasklist|findstr "8696" //#查看指定端口的进程ctrl+shift+ESC

示例一:

package com.zach.lesson01;import java.net.InetSocketAddress;public class TestInetSocketAddress {public static void main(String[] args) {InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 8080);InetSocketAddress inetSocketAddress2 = new InetSocketAddress("localhost", 8080);System.out.println(inetSocketAddress);System.out.println(inetSocketAddress2);System.out.println(inetSocketAddress.getAddress());System.out.println(inetSocketAddress.getHostName());//地址System.out.println(inetSocketAddress.getPort());//端口}
}

5. 通信协议

协议:约定,例如约定讲普通话,统一文字等
网络通信协议:速率,传输码率,代码结构,传输控制等
问题:非常复杂
大事化小:分层

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

  • 重要的协议:

    • TCP:用户传输协议
    • UDP:用户数据报协议
  • 出名的协议:
    • TCP:用户传输协议
    • IP:网络互联协议

TCP和UDP对比

  • TCP:打电话

    • 连接,稳定
    • 三次握手,四次挥手
    • 客户端、服务端
    • 传输完成,释放连接,效率低
  • UDP:发短信
    • 不连接,不稳定
    • 客户端、服务器:没有明确界限
    • 不管有没有准备好,都可以发给你
    • “导弹”

6. TCP

  • 客户端

    • 连接服务器 Socket
    • 发送消息
package com.zach.lesson02;import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;//客户端
public class TcpClientDemo01 {public static void main(String[] args) {Socket socket = null;OutputStream os = null;try {//1. 要知道服务器的地址InetAddress serverIP = InetAddress.getByName("127.0.0.1");int port = 9999;//端口号//2. 创建一个socket连接socket = new Socket(serverIP,port);//3. 发送消息 IO流os = socket.getOutputStream();os.write("你好,欢迎学习狂神说Java".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();}}}}
}
  • 服务器端

    • 建立服务的端口 ServerSocket
    • 等待用户的链接 accept
    • 接收用的信息
package com.zach.lesson02;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;//服务器
public class TcpServerDemo01 {public static void main(String[] args) {ServerSocket serverSocket = null;Socket socket = null;InputStream is = null;ByteArrayOutputStream baos = null;try {//1. 我需要有一个地址serverSocket = new ServerSocket(9999);while (true){//2. 等待客户端连接过来socket = serverSocket.accept();//3. 读取客户端的消息is = socket.getInputStream();//管道流baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while ((len=is.read(buffer))!=-1){baos.write(buffer,0,len);}System.out.println(baos.toString());}} catch (IOException e) {e.printStackTrace();}finally {//关闭资源(先开后关)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 (serverSocket!=null) {try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}}
}

文件上传(到服务器):
客户端:

package com.zach.lesson02;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;public class TcpClientDemo02 {public static void main(String[] args) throws IOException {//1. 创建一个SocketSocket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);//2. 创建一个输出流OutputStream os = socket.getOutputStream();//3. 文件流-读取文件FileInputStream fis = new FileInputStream(new File("zach.jpg"));//4. 文件流-写出文件byte[] buffer = new byte[1024];int len;while ((len=fis.read(buffer))!=-1){os.write(buffer,0,len);}//4.01 通知服务器,客户端已经结束赖socket.shutdownOutput();//我已经传输完了//4.1 确定服务器接收完毕,才能够断开连接InputStream inputStream = socket.getInputStream();//String byte[]ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer2 = new byte[1024];int len2;while((len2=inputStream.read(buffer2))!=-1){baos.write(buffer2,0,len2);}System.out.println(baos.toString());//5. 关闭资源baos.close();inputStream.close();fis.close();os.close();socket.close();}
}

服务器端:

package com.zach.lesson02;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class TcpServerDemo02 {public static void main(String[] args) throws IOException {//1. 创建服务ServerSocket serverSocket = new ServerSocket(9000);//2. 监听客户端的连接Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接//3. 获取输入流InputStream is = socket.getInputStream();//4. 文件输出FileOutputStream fos = new FileOutputStream("receive.jpg");byte[] buffer = new byte[1024];//重复的代码片段(9 行长)int len;while ((len = is.read(buffer)) != -1) {fos.write(buffer,0,len);}//4.1 通知客户端我接收完毕了OutputStream os = socket.getOutputStream();os.write("服务器接收完毕,可以断开。".getBytes());//关闭资源fos.close();is.close();socket.close();serverSocket.close();}
}


Tomcat

  • 服务端

    • 自定义 S
    • Tomcat服务器 S :Java后台开发!
  • 客户端
    • 自定义 C
    • 浏览器 B

官网下载Tomcat9.0,解压后bin目录下点击startup.bat,开启服务器。

乱码修复: 文件夹conf -> 文件logging.properties -> UTF-8改成GBK
java.util.logging.ConsoleHandler.encoding = GBK

7. UDP

7.1 发送消息

客户端:(实际上是发送端send)

package com.zach.lesson03;import java.net.*;//不需要连接服务器
public class UdpClientDemo01 {public static void main(String[] args) throws Exception {//1. 建立一个SocketDatagramSocket socket = new DatagramSocket();//2. 建个包String msg = "你好,服务器。";//发送给谁InetAddress localhost = InetAddress.getByName("localhost");int port = 9090;//数据,数据的长度起始,要发送给谁DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);//3. 发送包socket.send(packet);//4. 关闭流socket.close();}
}

服务器端:(实际上是接收端receive)

package com.zach.lesson03;import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UdpServerDemo01 {public static void main(String[] args) throws Exception {//开放端口DatagramSocket socket = new DatagramSocket(9090);//接收数据包byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);socket.receive(packet);//阻塞接收System.out.println(packet.getAddress().getHostAddress());System.out.println(new String(packet.getData(),0, packet.getLength()));//关闭连接socket.close();}
}

7.2 循环发送消息

package com.zach.chat;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;public class UdpSenderDemo01 {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(8888);//准备数据:控制台读取 System.inBufferedReader reader = new BufferedReader(new InputStreamReader(System.in));while (true){String data = reader.readLine();byte[] data2 = data.getBytes();DatagramPacket packet = new DatagramPacket(data2,0,data2.length,new InetSocketAddress("localhost",6666));socket.send(packet);if (data.equals("bye")){break;//本地退出}}socket.close();}
}

7.3 循环接收消息

package com.zach.chat;import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UdpReceiveDemo01 {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(6666);while (true){//准备接收包裹byte[] container = new byte[1024];DatagramPacket packet = new DatagramPacket(container,0, container.length);socket.receive(packet);//阻塞式接收包裹//断开连接 byebyte[] data = packet.getData();String receiveData = new String(data,0, packet.getLength());//data.length读取数据时会出现很多方框System.out.println(receiveData);//读取接收的数据 如果有方框可以+.trim()试试if (receiveData.equals("bye")){break;//远程退出}}socket.close();}
}

7.3 循环收发消息

  • 在线咨询:两个人都可以是发送方,也都可以是接收方。
  • 多线程+网络编程

示例一:
TalkSend实现类:

package com.zach.chat;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;public class TalkSend implements Runnable{DatagramSocket socket = null;BufferedReader reader = null;private int fromPort;private String toIP;private int toPort;public TalkSend(int fromPort, String toIP, int toPort) {this.fromPort = fromPort;this.toIP = toIP;this.toPort = toPort;try {socket = new DatagramSocket(fromPort);reader = new BufferedReader(new InputStreamReader(System.in));} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {while (true){try {String data = reader.readLine();byte[] data2 = data.getBytes();DatagramPacket packet = new DatagramPacket(data2,0,data2.length,new InetSocketAddress(this.toIP,this.toPort));socket.send(packet);if (data.equals("bye")){break;}} catch (IOException e) {e.printStackTrace();}}}
}

TalkReceive实现类:

package com.zach.chat;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class TalkReceive implements Runnable{DatagramSocket socket = null;private int port;private String msgFrom;public TalkReceive(int port, String msgFrom) {this.port = port;this.msgFrom = msgFrom;try {socket =  new DatagramSocket(port);} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {while (true){try {//准备接收包裹byte[] container = new byte[1024];DatagramPacket packet = new DatagramPacket(container,0,container.length);socket.receive(packet);//阻塞式接收包裹//断开连接 byebyte[] data = packet.getData();String receiveData = new String(data,0, packet.getLength());//data.lengthSystem.out.println(msgFrom+":"+receiveData);if (receiveData.equals("bye")){break;}} catch (IOException e) {e.printStackTrace();}}socket.close();}
}

TalkStudent类:

package com.zach.chat;public class TalkStudent {public static void main(String[] args) {//开启两个线程new Thread(new TalkSend(1234,"localhost",9999)).start();new Thread(new TalkReceive(8888,"老师")).start();}
}

TalkTeacher类:

package com.zach.chat;public class TalkTeacher {public static void main(String[] args) {//开启两个线程new Thread(new TalkSend(4321,"localhost",8888)).start();new Thread(new TalkReceive(9999,"学生")).start();}
}

  • 使用终端黑窗口开启线程:(cmd或者powershell)
1. 进入自己的类:cd  IdeaProjects\networkprogramming\out\production\networkprogramming2. 运行学生的Talk类:java com.zach.chat.TalkStudent3. 在另一个窗口运行老师的Talk类:java com.zach.chat.TalkTeacherchcp 65001  //设置为utf-8编码,实测有变化,但没用。改了很多地方(pc、IDEA等)多个编码为utf-8仍然出现问题。已放弃治疗。

8. URL

  • https://www.baidu.com/

  • 统一资源定位符:定位资源的,定位互联网上的某一个资源

  • DNS 域名解析:www.baidu.com 解析成ip地址: xxx.x…x…x

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

示例一:

package com.zach.lesson04;import java.net.MalformedURLException;
import java.net.URL;//http://localhost:8080/zach/SecFile.txt
public class URLDemo01 {public static void main(String[] args) throws MalformedURLException {URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=kuangshen&password=123");System.out.println(url.getProtocol());//协议System.out.println(url.getHost());//主机ipSystem.out.println(url.getPort());//端口System.out.println(url.getPath());//文件System.out.println(url.getFile());//全路径System.out.println(url.getQuery());//参数}
}

示例二:

package com.zach.lesson04;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;//http://localhost:8080/zach/SecFile.txt//https://m801.music.126.net/20220328192159/9a071e84b97d89b14ed3eb1146242bdc/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/8896211173/fb9f/3635/03d1/d96d288bc561ccf36ea8fb6394fb4311.m4a
public class UrlDown {public static void main(String[] args) throws IOException {//1. 下载地址URL url = new URL("https://m801.music.126.net/" +"20220328192159/9a071e84b97d89b14ed3eb1146242bdc/" +"jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/8896211173/fb9f/3635/03d1/" +"d96d288bc561ccf36ea8fb6394fb4311.m4a");//2. 连接到这个资源 HTTPHttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();InputStream inputStream = urlConnection.getInputStream();FileOutputStream fos = new FileOutputStream("岁月神偷.m4a");byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer))!=-1){fos.write(buffer,0,len);//写出这个数据}fos.close();inputStream.close();urlConnection.disconnect();//断开连接}
}

—————— THE END ——————

Java(网络编程)相关推荐

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

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

  2. Java学习总结:52(Java网络编程)

    Java网络编程 开发第一个网络程序 java.net包提供了网络编程有关的开发工具类,在此包中有一下两个主要的核心操作类. ServerSocket类:是一个封装支持的TCP协议的操作类,主要工作在 ...

  3. Java - 网络编程(NetWork)

    Java - 网络编程(NetWork) 一.java.net包下的 InetAddress 类的使用: > 一个 InetAddress 代表着一个IP地址 > 主要用来查看本机的IP和 ...

  4. 【Java】 Java网络编程总结

     一.网络编程三要素: IP地址:每个设备在网络中的唯一标识. 端口号:每个程序在设备上的唯一标识. 协议:为计算机网络中进行数据交换而建立的规则或约定的集合. UDP: 面向无连接,数据不安全,速度 ...

  5. Java网络编程笔记5

    在Java网络编程笔记4中我们看到了客户端与服务器通信的过程,只是在前面的程序只是单个客户端与服务器通信 的例子. 接下来我们看如何实现多个客户端与服务器通信,对于服务器来说,它要为每个客户端请求的S ...

  6. 实验五 Java网络编程及安全 实验报告 20135232王玥

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序与设计         班级:1352 姓名:王玥 学号:20135232 成绩:             指导 ...

  7. NIO详解(一):java网络编程IO总结(BIO、NIO、AIO)

    1.基本概念 在Java网络通信中,最基本的概念就是Socket编程了.Socket又称"套接字" 向网络发出请求或者应答网络请求. Socket 和ServerSocket类库位 ...

  8. 04.Java网络编程(转载)

    1.网络编程 1.1计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输. 按照计算机网络的定义,通过一定的物理设备将处于不同位置的计算机连接起来组成的网络,这个网络中包含 ...

  9. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...

    Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...

  10. 你所需要的java网络编程大总结

    好好学java java知识分享/学习教程免费分享 关注 精彩内容 你所需要的java全套视频教程 你所需要的java电子图书 你所需要的大数据视频教程 你所需要的java练习项目 如 / 梦 上个月 ...

最新文章

  1. Moving Towards Third‐Generation Sequencing Technologies 迈向第三代测序技术
  2. php进入目录,php文件,文件夹(目录)操作函数总结
  3. apache的斜杠问题
  4. tomcat ajp协议安全限制绕过漏洞_Apache Tomcat文件包含漏洞(CVE20201938)复现
  5. python安装gdal包_linux下gdal的python包的安装
  6. PyTorch | 通过torch.arange创建等差数列张量 | torch.arange()如何使用?torch.arange()使用方法 torch.arange()举例说明
  7. ES6_Set和WeakSet_note
  8. MFC开发IM-第二十一篇、Unicode转成Utf8
  9. Foundation 6 – 先进的响应式的前端开发框架
  10. sql数据库去重语法_数据库去重语句
  11. 2019年电大计算机应用基础操作题,2019年电大《计算机应用基础》(操作题解题指导.docx...
  12. 会员积分商城系统的功能介绍
  13. Element-UI组件实现全局回到顶部功能
  14. 手工脱壳之 ASPack压缩壳【随机基址】【重定位表加密】
  15. 新加坡基金会非盈利公司区块链ICO
  16. Mbit/s vs MB/s vs MiB/s
  17. 国际专利:是走PCT还是巴黎公约|湾区人工智能
  18. 心跳机制 heartbeat
  19. 9个精品AI开源免费实战项目助你掌握AI工程师基本技能
  20. 20135203齐岳 信息安全系统设计基础期中总结

热门文章

  1. 窗口置顶工具v2.3.0
  2. 【我不熟悉的html】p标签不能嵌套块元素(p、div等)
  3. 考勤软件之:考勤排班规则
  4. 软考高项笔记(一):进度类计算
  5. kafka外网映射 公司有公网ip kafka外网访问 kafka外网配置
  6. 移动互联网应用的阶段学习总结
  7. 实验5-11 空心的数字金字塔 (15 分)
  8. 金字塔原理(麦肯锡)-要点汇总
  9. hadoop实现自动打包并提交到集群(完全自动)
  10. 使用elastic job管理调度定时任务