Java(网络编程)
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参考模型:
小结:
- 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
- IP:
- ipv4 / ipv6
示例一:
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
- 公有端口 0~1023
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(网络编程)相关推荐
- java 密钥工厂 desede_20145212 实验五《Java网络编程》
20145212 实验五<Java网络编程> 一.实验内容1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代 ...
- Java学习总结:52(Java网络编程)
Java网络编程 开发第一个网络程序 java.net包提供了网络编程有关的开发工具类,在此包中有一下两个主要的核心操作类. ServerSocket类:是一个封装支持的TCP协议的操作类,主要工作在 ...
- Java - 网络编程(NetWork)
Java - 网络编程(NetWork) 一.java.net包下的 InetAddress 类的使用: > 一个 InetAddress 代表着一个IP地址 > 主要用来查看本机的IP和 ...
- 【Java】 Java网络编程总结
一.网络编程三要素: IP地址:每个设备在网络中的唯一标识. 端口号:每个程序在设备上的唯一标识. 协议:为计算机网络中进行数据交换而建立的规则或约定的集合. UDP: 面向无连接,数据不安全,速度 ...
- Java网络编程笔记5
在Java网络编程笔记4中我们看到了客户端与服务器通信的过程,只是在前面的程序只是单个客户端与服务器通信 的例子. 接下来我们看如何实现多个客户端与服务器通信,对于服务器来说,它要为每个客户端请求的S ...
- 实验五 Java网络编程及安全 实验报告 20135232王玥
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序与设计 班级:1352 姓名:王玥 学号:20135232 成绩: 指导 ...
- NIO详解(一):java网络编程IO总结(BIO、NIO、AIO)
1.基本概念 在Java网络通信中,最基本的概念就是Socket编程了.Socket又称"套接字" 向网络发出请求或者应答网络请求. Socket 和ServerSocket类库位 ...
- 04.Java网络编程(转载)
1.网络编程 1.1计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输. 按照计算机网络的定义,通过一定的物理设备将处于不同位置的计算机连接起来组成的网络,这个网络中包含 ...
- python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...
Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...
- 你所需要的java网络编程大总结
好好学java java知识分享/学习教程免费分享 关注 精彩内容 你所需要的java全套视频教程 你所需要的java电子图书 你所需要的大数据视频教程 你所需要的java练习项目 如 / 梦 上个月 ...
最新文章
- Moving Towards Third‐Generation Sequencing Technologies 迈向第三代测序技术
- php进入目录,php文件,文件夹(目录)操作函数总结
- apache的斜杠问题
- tomcat ajp协议安全限制绕过漏洞_Apache Tomcat文件包含漏洞(CVE20201938)复现
- python安装gdal包_linux下gdal的python包的安装
- PyTorch | 通过torch.arange创建等差数列张量 | torch.arange()如何使用?torch.arange()使用方法 torch.arange()举例说明
- ES6_Set和WeakSet_note
- MFC开发IM-第二十一篇、Unicode转成Utf8
- Foundation 6 – 先进的响应式的前端开发框架
- sql数据库去重语法_数据库去重语句
- 2019年电大计算机应用基础操作题,2019年电大《计算机应用基础》(操作题解题指导.docx...
- 会员积分商城系统的功能介绍
- Element-UI组件实现全局回到顶部功能
- 手工脱壳之 ASPack压缩壳【随机基址】【重定位表加密】
- 新加坡基金会非盈利公司区块链ICO
- Mbit/s vs MB/s vs MiB/s
- 国际专利:是走PCT还是巴黎公约|湾区人工智能
- 心跳机制 heartbeat
- 9个精品AI开源免费实战项目助你掌握AI工程师基本技能
- 20135203齐岳 信息安全系统设计基础期中总结