学些的教程地址:狂神说Java 网络编程
本篇笔记的md文件:百度网盘,提取码:0ku7,如有需要可以下载使用,但不可用于付费商用
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
——百度百科
如何实现网络的通信
通信双方地址:
规则:网络通信的协议
TCP / IP 参考模型
TCP 协议:交互的,就像打电话
UDP 协议:广播性质的,只负责发送,不管对方接不接收
唯一定位一台网络上计算机
127.0.0.1:本机ip地址 (或:localhost)
IP 地址分类
IPv4 / IPv6
127.0.0.1
。每个字节代表0~255。约42亿个2011:2011:2011:2011:2011:2011:2011:2011!
公网 (互联网) - 私网(局域网)
域名:记忆 IP 问题
此类表示Internet协议(IP)地址。 ——Jdk1.8 API
端口表示计算机上的一个程序的进程
不同的进程有不同的端口号,用来区分软件
端口范围:0~65535
TCP,UDP:65535 * 2,也就是说TCP有65536个,UDP有63356个。同一个协议下端口号不能冲突
端口分类
公有端口:0~1023
程序注册端口:1024~49151,分配给用户或者程序
动态、私有:49152~65535
常用查询语句
netstat -ano #查看所有的端口
netstat -ano|findstr"5900" #查看指定的端口
tasklist|findstr "8696" #查看指定端口的进程
#Ctrl + shift + ESC 调出任务管理器
协议:约定,就好比我们说的都是普通,这就是协议
网络通信协议:速率、传输码率、代码结构、传输控制。。。
采用分层策略
其中IP:网络互连协议。TCP和IP实际上是一层协议
TCP:类比为打电话
需要互连,稳定
三次握手、四次挥手
客户端、服务端(主从)
UDP:类比为发短信
不连接、不稳定
客户端、服务端:没有明确界定
不管有没有准备好,都可以发给你
DDOS:洪水攻击
ServerSocket:服务连接
本示例实现客户端向与服务端通信
示例:先启动服务器端,再启动客户端,在客户端的控制台输入文本信息回车,服务器端就能接收并打印接收到的文本。
客户端输入exit
关闭服务器端。客户端输入exit()
关闭客户端。如果客户端连不到服务器端抛出异常并捕获输出:服务器中断!
public static void main(String[] args) {
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("开始监听!");
while (true) {
Socket accept = serverSocket.accept();
is = accept.getInputStream();
int len = 0;
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
if ("exit".equals(baos.toString())) {
System.out.println("侦听停止,退出服务器端!");
break;
} else {
System.out.println("> " + baos.toString());
}
accept.close();
}
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
// IO 流关闭
}
}
public static void main(String[] args) {
BufferedReader br = null;
OutputStream os = null;
try {
System.out.println("启动客户端");
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 9999;
while (true) {
System.out.print("> ");
br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
if("exit()".equals(str)) {
System.out.println("退出客户端");
break;
}
Socket socket = new Socket(address, port);
os = socket.getOutputStream();
os.write(str.getBytes());
socket.close();
}
} catch (ConnectException e) {
System.out.println("服务器中断!");
} catch (Exception e) {
e.printStackTrace();
} finally {
// IO 流关闭
}
}
本示例实现客户端向与服务端发送文件
示例:先启动服务器端,再启动客户端,客户端将本地的文件发送给服务器端,服务端将文件保存至磁盘中
需要先准备一个文件
public static void main(String[] args) {
ServerSocket socket = null;
InputStream is = null;
FileOutputStream fos = null;
try {
// 1. 创建服务
socket = new ServerSocket(9000);
// 2. 监听客户端的连接,一直处于阻塞状态,等待客户端连接
Socket accept = socket.accept();
// 3. 获取输入流
is = accept.getInputStream();
// 4. 文件输出流
fos = new FileOutputStream(new File("d:/b/234.jpg"));
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.flush();
accept.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
// IO 流关闭
}
}
public static void main(String[] args) {
Socket socket = null;
InputStream is = null;
OutputStream os = null;
try {
socket = new Socket("127.0.0.1", 9000);
is = new FileInputStream(new File("d:/a/123.jpg"));
os = socket.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// IO 流关闭
}
}
不需要连接服务器,只需要知道对方地址就可以
DatagramSocket:数据报连接
没有界定的客户端和服务器端,都可以发送数据,也都可以接收数据
public static void main(String[] args) {
DatagramSocket socket = null;
try {
// 1. 创建一个Socket
socket = new DatagramSocket(8090);
// 2. 创建发送的包
String msg = "你好, UDP!";
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 9090;
DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, address, port);
// 3. 发送包
socket.send(packet);
} catch (Exception e) {
e.printStackTrace();
} finally {
// IO 流关闭
}
}
此时不需要接收端,都能执行,并不需要对方响应
public static void main(String[] args) {
DatagramSocket socket = null;
try{
// 创建数据报连接
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().getHostName());
System.out.println(packet.getPort());
System.out.println(new String(packet.getData()));
} catch (Exception e) {
e.printStackTrace();
} finally {
// IO 流关闭
}
}
https://www.tqazy.com
统一资源定位符:定位资源的,定位互联网上的某一个资源
DNS 域名解析:
协议://ip地址:端口/项目名/资源
Java 类:URL
这是一个下雨白噪音的.m4a
public static void main(String[] args) throws Exception {
// 1.下载地址
URL url = new URL("https://rainymood.com/audio1112/0.m4a");
// 2.连接到这个资源 HTTP
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream is = urlConnection.getInputStream();
FileOutputStream fos = new FileOutputStream("d:/123.m4a");
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.flush();
}
本文完。
这里的网络编程只是最简单最基础的部分,更多的以后我用到了学到了会继续更新
祝君有所收获,完结撒花!
如果您想关注更多,可以点击以下链接:
回到学习路线