网络编程
Posted 球球啦啦啦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程相关的知识,希望对你有一定的参考价值。
一、定义:可在网络间通信
二、网络通信3要素:
A:IP地址 公共地址 私有地址
B:端口号 设备进场地址,(软件之间连接的编号)
C:通信协议:UDP协议 不需连接,不区分客户端和服务端,速度快 不可靠。 TCP协议 要连接 区分客户端和服务端 效率 低 可靠
三、InetAddress类的常用方法:
static InetAddress getByname(String name);//通过主机名/IP地址构建一个InetAddress对象
Static getHostAddress();//返回IP地址
getHostName();//返回主机名
四、UDP协议:
发送端:创建发送端Socket对象->创建数据并打包->发送数据->释放资源
DatagramSocket:用来发送接收数据,基于UDP
DatagramSocket():
DatagramSocket(int port):
DatagramPacket(byte[] buf,int length,InetAddres address,int port)
接受端:创建接收端Socket对象->接收数据->解析数据->输出数据->释放资源
//发送端 public class UDPIPsendss { public static void main(String[] args) throws IOException { DatagramSocket dgs = new DatagramSocket(); //发送的内容 String s = "hello"; //转成字节数组 byte[] by = s.getBytes(); //获取字节数组长度 int len = by.length; //获取发送的地址 InetAddress iad = InetAddress.getByName("127.0.0.1"); //指定设备端口号 int port = 8888; //打包 DatagramPacket p = new DatagramPacket(by, len, iad, port); //发送数据 dgs.send(p); //释放资源 dgs.close(); } } //接受端 public class UDPipReceive { public static void main(String[] args) throws IOException { //创建接收到对象,并给定端口号 DatagramSocket ds = new DatagramSocket(8888); //创建一个包用来存接收到的信息 byte[] by = new byte[1024]; int length = by.length; DatagramPacket dp = new DatagramPacket(by, length); //将信息传入包 ds.receive(dp);//阻塞 //获取发送端地址 InetAddress adress = dp.getAddress(); //获取接收到的数据 byte[] b = dp.getData(); //获取接收到的长度 int len = dp.getLength(); //打印信息 System.out.println("-->"+adress.getHostAddress()); System.out.println(new String(b,0,len)); //释放资源 ds.close(); } }
注意事项:A:端口号错误,可发送,无异常,接收不到,B:端口号不能重复
五、TCP协议:
创建发送端(客户端)Socket对象->获取输出流对象->发送数据->释放资源
创建接受端(服务端)Socket对象(确认端口号)->监听(阻塞)->创建输入流对象->获取数据->输出对象->释放资源(可不关)
ServerSocket(int port);
Socket accept();
//发送端 public class TcpSends { public static void main(String[] args) throws IOException { //创建发送端Socket对象 Socket s = new Socket(InetAddress.getByName("127.0.0.1"),9999); //创建输出流 OutputStream os =s.getOutputStream(); String ss = "hello"; //发送数据 os.write(ss.getBytes()); //释放资源 os.close(); } } //接受端 public class TcpReceive { public static void main(String[] args) throws IOException { //创建接受端(服务端)Socket对象(确认端口号) ServerSocket ss = new ServerSocket(9999); //监听(阻塞) Socket s = ss.accept(); //创建输入流对象 InputStream is = s.getInputStream(); //准备一个数组用来存放接收到的字节 int len; byte[] by = new byte[1024]; //获取数据 len = is.read(by); InetAddress iad = s.getLocalAddress(); System.out.println("client-->"+iad); //输出接收到的信息 System.out.println(new String(by,0,len)); s.close(); } }
小案例
//客户端读取本地一个图片并发送,服务端接收并存储 public class TCPSendZong { public static void main(String[] args) throws IOException { //创建Socket对象,给出发送的目的地址和端口号 Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 8888); //创建输出流 OutputStream os = s.getOutputStream(); //提升至高效输出流 BufferedOutputStream bos = new BufferedOutputStream(os); //创建高效输入流,读取本地图片 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\魔女\\Desktop\\学习途.png")); //读取数据 byte[] by = new byte[1024]; int len = by.length; while((len = bis.read(by))!=-1){ //发送 bos.write(by,0,len); } //释放资源 s.close(); bos.close(); bis.close(); } } public class TCPSerZong { public static void main(String[] args) throws IOException { //创建服务端的Socket对象 ServerSocket ss = new ServerSocket(8888); //服务端获取Socket对象,接收 Socket s = ss.accept(); //创建输入流 InputStream is = s.getInputStream(); //提高输入流高效级别 BufferedInputStream bis = new BufferedInputStream(is); //创建输出流将接收到的图片保存到本地 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D://a.png")); //接收到的信息 byte[] by = new byte[1024]; int len; while((len=bis.read(by))!=-1){ //写入本地地址 bos.write(by,0,len); } //释放资源 s.close(); bis.close(); bos.close(); } }
以上是关于网络编程的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装