网络编程

Posted Zennon

tags:

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

* java.net.InetAddress:此类表示互联网协议 (IP) 地址。
*
* 静态方法:可以获取InetAddress对象
* static InetAddress getLocalHost() 返回本地主机。
* static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
* 非静态的方法:
* String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。
* String getHostName() 获取此 IP 地址的主机名。

* ***********UDP通信的接收端:接收发送端发送的数据,进行拆包
* 和udp相关的类:
* java.net.DatagramPacket:此类表示数据报包。 用来封装数据
* java.net.DatagramSocket:此类表示用来发送和接收数据报包的套接字。
* 套接字:封装了ip地址和端口号的网络对象
*
* 构造方法:
* DatagramPacket(byte[] buf, int length) 构造 DatagramPacket,用来接收长度为 length 的数据包。
* DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。
*
* DatagramSocket的成员方法:
* void receive(DatagramPacket p) 从此套接字接收数据报包。

********* UDP通信的发送端:把数据打包,发送的接收端
* 和udp相关的类:
* java.net.DatagramPacket:此类表示数据报包。 用来封装数据
* java.net.DatagramSocket:此类表示用来发送和接收数据报包的套接字。
* 套接字:封装了ip地址和端口号的网络对象
*
* 构造方法:
* DatagramPacket(byte[] buf, int length, InetAddress address, int port)
* 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
* DatagramSocket()
* 构造数据报套接字并将其绑定到本地主机上任何可用的端口。
* DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。
*
* DatagramSocket类的成员方法:
* void send(DatagramPacket p) 从此套接字发送数据报包。

********** TCP通信的服务器端:和客户端通过3次握手,建立连接;接收客户端发送的数据,给客户端回写数据
* 表示服务器的类:
* java.net.ServerSocket:此类实现服务器套接字。
*
* 构造方法:
* ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
*
* 服务器有一件特别重要的事情,必须的明确是哪个客户端连接的服务器
* 可以使用accept方法获取,请求的客户端对象
* 成员方法:
* Socket accept() 侦听并接受到此套接字的连接。

************ TCP通信的客户端:和服务器建立连接(3次握手),给服务器发送数据,读取服务器回写的数据
* 表示客户端的类:
* java.net.Socket:此类实现客户端套接字(也可以就叫“套接字”)。
*
* 构造方法:
* Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
* Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
*
* 成员方法:
* OutputStream getOutputStream() 返回此套接字的输出流。
* InputStream getInputStream() 返回此套接字的输入流。
* 注意:客户端和服务器进行交互,不能使用自己创建的字节流对象,必须使用Socket中提高的网络流对象




* 创建文件上传案例的服务端:
*
* 明确:
* 数据源:客户端上传的文件
* 数据的目的地:服务的硬盘 d:\\upload\\1.jpg

package cn.itcast.demo05.tcpFileUpload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class TCPServer {
public static void main(String[] args) throws IOException {
//1.创建服务器ServerSocket对象,和系统要指定的端口号
ServerSocket server = new ServerSocket(9999);
//2.使用ServerSocket对象中的方法accept,获取到请求的客户端对象Socket
Socket socket = server.accept();
//3.使用Socket中的方法getInputStream,获取网络字节输入流对象InputStream
InputStream is = socket.getInputStream();
//4.判断服务器硬盘是否有upload文件夹,没有则创建
File file = new File("d:\\upload");
if(!file.exists()){
file.mkdirs();
}

/*
* 自定义一个文件的名称:域名+毫秒值+随机数-->防止文件重名被覆盖
*/
String fileName = "itcast"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";

//5.创建本地字节输出流FileOutputStream,绑定要输出的目的地
//FileOutputStream fos = new FileOutputStream(file+file.separator+"1.jpg");
FileOutputStream fos = new FileOutputStream(file+file.separator+fileName);
//6.使用网络字节输入流对象InputStream中的方法read,读取客户端上传的文件
byte[] bytes = new byte[1024];
int len = 0;
System.out.println("读取客户端的文件");
while((len = is.read(bytes))!=-1){
//7.使用本地字节输出流FileOutputStream中的的write,把读取到的文件,保存的服务器的硬盘上
fos.write(bytes, 0, len);
}
System.out.println("一直等待客户端,写结束标记,执行不到");
//8.使用Socket中的方法getOutputStream,获取网络字节输出流对象OutputStream
//9.网络字节输出流对象OutputStream中的方法write,给客户端回写"上传成功!"
socket.getOutputStream().write("上传成功!".getBytes());
//10.释放资源(FileOutputStream,Socket,ServerSocket)
fos.close();
socket.close();
server.close();
}

}

 

package cn.itcast.demo05.tcpFileUpload;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TCPClient {
public static void main(String[] args) throws IOException {
//1.创建本地字节输入流FileInputStream对象,绑定要读取的数据源
FileInputStream fis = new FileInputStream("c:\\1.jpg");
//2.创建客户端对象Socket,封装服务器的ip地址和端口号
Socket socket = new Socket("127.0.0.1", 9999);
//3.使用Socket中的方法getOutputStream,获取网络字节输出流对象OutputStream
OutputStream os = socket.getOutputStream();
//4.使用本地字节输入流FileInputStream对象中的方法read读取本地的文件
byte[] bytes = new byte[1024];//存储读取到的字节
int len = 0;//每次读取到的有效字节个数
while((len = fis.read(bytes))!=-1){
//5.使用网络字节输出流对象OutputStream中的方法write,把读取到的文件上传到服务器
os.write(bytes, 0, len);
}

/*
* void shutdownOutput() 禁用此套接字的输出流。
* 已经把文件上传完毕,结束流,同时会给服务器写结束标记
*/
socket.shutdownOutput();

//6.使用使用Socket中的方法getInputStream,获取网络字节输入流对象InputStream
InputStream is = socket.getInputStream();
//7.使用网络字节输入流对象InputStream中的方法read读取服务器回写的数据
System.out.println("111111111111111");
while((len = is.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
System.out.println("客户端等待服务器回写的数据,也会进入到阻塞,也看不到");
//8.释放资源(FileInputStream,Socket)
fis.close();
socket.close();
}
}

 

 

知识点总结
?IP地址:用来唯一表示我们自己的电脑的,是一个网络标示
?端口号: 用来区别当前电脑中的应用程序的
?UDP: 传送速度快,但是容易丢数据,如视频聊天,语音聊天
?TCP: 传送稳定,不会丢失数据,如文件的上传、下载
?UDP程序交互的流程
?发送端
1,创建DatagramSocket对象
2,创建DatagramPacket对象,并封装数据
3,发送数据
4,释放流资源
?接收端
1,创建DatagramSocket对象
2,创建DatagramPacket对象
3,接收数据存储到DatagramPacket对象中
4,获取DatagramPacket对象的内容
5,释放流资源
?TCP程序交互的流程
?客户端
1,创建客户端的Socket对象
2,获取Socket的输出流对象
3,写数据给服务器
4,获取Socket的输入流对象
5,使用输入流,读反馈信息
6,关闭流资源
?服务器端
1,创建服务器端ServerSocket对象,指定服务器端端口号
2,开启服务器,等待着客户端Socket对象的连接,如有客户端连接,返回客户端的Socket对象
3,通过客户端的Socket对象,获取客户端的输入流,为了实现获取客户端发来的数据
4,通过客户端的输入流,获取流中的数据
5,通过客户端的Socket对象,获取客户端的输出流,为了实现给客户端反馈信息
6,通过客户端的输出流,写数据到流中
7,关闭流资源

以上是关于网络编程的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

使用 Pygments 检测代码片段的编程语言

面向面试编程代码片段之GC

如何在 Django Summernote 中显示编程片段的代码块?