网络编程java(知识总结加示例)

文章目录

  • java网络编程
    • 1、网络基础
      • 网络通信
      • 网络
      • ip地址
      • IP分类:
      • 域名
      • 端口号
      • 网络通信协议
      • TCP 和 UDP
      • InetAdress类
      • Socket
    • 2、TCP/IP编程实战
      • 入门互发消息1字节流:
      • 入门互发消息2字符流(推荐使用)
      • 发送文件(视频,音频,图片均可。此处图片示例):
      • netstat 指令
    • 3、UDP编程实战
      • 基本介绍
      • 基本流程
      • 发送消息实战
    • 4、复习实战
      • TCP发送消息复习:
      • UDP发消息复习
      • TCP发送文件复习

java网络编程

1、网络基础

网络通信

1、概念:两台设备之间通过网络实现数据传输

2、网络通信:将数据通过网络从一台设备传输到另一台设备

3、java.net包下提供了一系列的类或接口,供程序员使用,完成网络通信

网络

概念:两台或多台设备通过一定物理设备连接起来构成了网络
根据网络的覆盖范围不同,对网络进行分类:
局域网:覆盖范围最小,仅仅覆盖一个教室或一个机房
城域网:覆盖范围较大,可以覆盖一个城市
广域网:覆盖范围最大,可以覆盖全国,甚至全球,万维网是广域网的代表

ip地址

概念:用于唯一标识网络中的每台计算机查看ip地址: ipconfig

ip地址的表示形式:点分十进制XX.XX.XX.XX每一个十进制数的范围:0~255
ip地址的组成=网络地址+主机地址,比如:192.168.16.69
iiPv6是互联网工程任务组设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址。

由于IPv4最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍。

IP分类:

域名

1.www.baidu.com

2.好处:为了方便记忆,解决记ip的困难

3.概念:将ip地址映射成域名

端口号

1.概念:用于标识计算机上某个特定的网络程序

2.表示形式:以整数形式,范围0~65535

3.0~1024已经被占用,比如ssh: 22, ftp: 21, smtp: 25 http: 80

4.常见的网络程序端口号: tomcat :8080 mysql:3306 oracle:1521 sqlserver:1433

网络通信协议

协议(tcp/ip)
TCP/IP (Transmission ControlProtocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是lnternet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。

TCP 和 UDP

TCP协议:传输控制协议
1.使用TCP协议前,须先建立TCP连接,形成传输数据通道

2.传输前,采用"三次握手"方式,是可靠的

3.TCP协议进行通信的两个应用进程:客户端、服务端

4.在连接中可进行大数据量的传输

5.传输完毕,需释放已建立的连接,效率低

UDP协议:
1.将数据、源、目的封装成数据包,不需要建立连接

2.每个数据报的大小限制在64K内

3.因无需连接,故是不可靠的

4.发送数据结束时无需释放资源(因为不是面向连接的),速度快

5.举例:厕所通知、发短信

InetAdress类

相关方法:

1.获取本机InetAddress对象getLocalHost

2.根据指定主机名/域名获取ip地址对象getByName

3.获取InetAddress对象的主机名getHostName

4.获取InetAddress对象的地址 getHostAddress

示例代码:

package Javanetwork;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;

public class Api1 {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress inetAddress = InetAddress.getLocalHost();//获取主机名
        System.out.println(inetAddress);
        InetAddress host=InetAddress.getByName("LAPTOP-O6HHE5C1");
        System.out.println(host);
        InetAddress host1=InetAddress.getByName("www.baidu.com");
        System.out.println(host1);
        System.out.println(host1.getHostName());
        System.out.println(Arrays.toString(host1.getAddress()));
        System.out.println(host1.getHostAddress());
    }
}

Socket

基本介绍
1.套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准。

2.通信的两端都要有Socket,是两台机器间通信的端点。

3.网络通信其实就是Socket间的通信。

4.Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。

5.一般主动发起通信的应用程序属客户端,等待通信请求的为服务端。

网络编程java(知识总结加示例)_第1张图片

2、TCP/IP编程实战

入门互发消息1字节流:

服务端:

package Javanetwork;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class ServerT {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(9999);
        while (true) {
            Socket Skt = server.accept();
            InputStream bis = Skt.getInputStream();
            byte[] buf = new byte[64];
            int length = 0;
            String strs = "";
            System.out.println("ok");
            while ((length = bis.read(buf)) != -1) {
                strs += new String(buf, 0, length);
            }
            System.out.println(strs);

            OutputStream bos = Skt.getOutputStream();
            bos.write("接收完毕".getBytes(StandardCharsets.UTF_8));
            Skt.shutdownOutput();
            bis.close();
            bos.close();
            Skt.close();
        }
    }
}

客户端:

package Javanetwork;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class ClientT {
    public static void main(String[] args) throws IOException {
        Socket s=new Socket(InetAddress.getLocalHost(),9999);

        OutputStream bos = s.getOutputStream();
        int[] arr={3,45,66,12,34};
        String str= Arrays.toString(arr);
        System.out.println(str);
        bos.write(str.getBytes(StandardCharsets.UTF_8));
        bos.write("你好".getBytes(StandardCharsets.UTF_8));
        System.out.println("传输完毕");
        s.shutdownOutput();

        InputStream bis = s.getInputStream();
        byte[] buf=new byte[64];
        int len=0;
        while ((len=bis.read(buf))!=-1){
            System.out.println(new String(buf,0,len));
        }
        bos.close();
        bis.close();
    }
}

运行结果:

入门互发消息2字符流(推荐使用)

服务端:

package Javanetwork;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerT1 {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(9999);
        while (true) {
            Socket Skt = server.accept();
            InputStream bis = Skt.getInputStream();
//            使用字符流读取
            BufferedReader br = new BufferedReader(new InputStreamReader(bis));
            String str= br.readLine();
            System.out.println(str);
//          回消息
            OutputStream bos = Skt.getOutputStream();
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(bos));
            bw.write("接收完毕");
            bw.newLine();
            bw.flush();
            br.close();
            bw.close();
            Skt.close();
        }
    }
}

客户端:

package Javanetwork;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class ClientT1 {
    public static void main(String[] args) throws IOException {
        Socket s=new Socket(InetAddress.getLocalHost(),9999);
//      发送消息
        OutputStream bos = s.getOutputStream();
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(bos));
        bw.write("客户端,你好\n");
        bw.newLine();//插入换行符表示写入内容结束,对方需使用readline来读取
        bw.flush();//数据必须手动刷新,否则数据不会写入通道。
//      接收消息
        InputStream bis = s.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(bis));
        String s1 = br.readLine();
        System.out.println(s1);
        br.close();
        bw.close();
        s.close();
    }
}

发送文件(视频,音频,图片均可。此处图片示例):

服务端:

package FileUpload;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPserver {
    public static void main(String[] args) throws IOException {
        ServerSocket sst = new ServerSocket(8888);
        Socket s=sst.accept();
//        接收文件
        BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
        byte[] arr = Stream2Barr.stream2bytearray(bis);
//      将字节数组转化为源文件
        String  filepath="src\\tx.png";
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filepath));
        bos.write(arr);
        System.out.println("成功接收");
        bos.close();
//      告诉客户端成功接收文件
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bw.write("图片已接收");
        bw.newLine();
        bw.flush();
//      关闭流
        bw.close();
        s.close();
        bis.close();
        sst.close();
    }
}

客户端:

package FileUpload;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

public class TCPclient {
    public static void main(String[] args) throws IOException {
        Socket s=new Socket(InetAddress.getLocalHost(),8888);
//        文件写入
        String filename="C:\\Users\\lenovo\\Desktop\\2022秋季学期\\头像.png";
        BufferedInputStream bis1 = new BufferedInputStream(new FileInputStream(filename));
        byte[] arr = Stream2Barr.stream2bytearray(bis1);
        bis1.close();
//        获取输出流,将arr数据发送给服务端
        BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
        bos.write(arr);
        s.shutdownOutput();//设置结束标记
//        接收服务端消息
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String s1 = br.readLine();
        System.out.println(s1);

//        关闭流
        br.close();
        bos.close();
        s.close();
    }
}

工具类:

package FileUpload;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public  class Stream2Barr {
    /*
     * 读取文件变为字节数组,将输入流转换为字节数组
     * */
    public static byte[] stream2bytearray(InputStream is) throws IOException {
        ByteArrayOutputStream bos=new ByteArrayOutputStream();
        byte[] b=new byte[1024];
        int len=0;
        while ((len=is.read(b))!=-1){
            bos.write(b,0,len);
        }
        byte[] arr=bos.toByteArray();
        bos.close();
        return arr;
    }
}

netstat 指令

  1. netstat -an:可以查看当前主机网络情况,包括端口监听情况和网络连接情况。

  2. netstat -an | more: 可以分页显示。

  3. 要求在dos控制台下执行。

3、UDP编程实战

基本介绍

1.类 DatagramSocket和 DatagramPacket实现了基于UDP 协议网络。

2.UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。

3.DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。

4.UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接。

基本流程

1.核心的两个类/对象 DatagramSocket与DatagramPacket

2.建立发送端,接收端(没有服务端和客户端概念)

3.发送数据前,建立数据包/报DatagramPacket

4.调用DatagramSocket的发送、接收方法

5.关闭DatagramSocket

发送消息实战

网络编程java(知识总结加示例)_第2张图片

1号:

package Javanetwork;

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class UDPsend {
    public static void main(String[] args) throws IOException {
//
        DatagramSocket ds = new DatagramSocket(9998);
//        将发送数据包装 发送
        byte[] data="hello,明天吃火锅吗?".getBytes(StandardCharsets.UTF_8);
        System.out.println("我:hello,明天吃火锅吗?");
        DatagramPacket packet =
                new DatagramPacket(data,data.length, InetAddress.getByName("192.168.31.68"),9999);
//      发送
        ds.send(packet);
//      接收
        byte[] buf=new byte[1024];
        DatagramPacket packet1=new DatagramPacket(buf,buf.length);
        ds.receive(packet1);
        byte[] data1=packet1.getData();
        System.out.print("对方:");
        System.out.println(new String(data1,0,packet1.getLength()));
        ds.close();
    }
}

2号

package Javanetwork;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UDPreceive {
    public static void main(String[] args) throws IOException {
//        接收端
        DatagramSocket ds = new DatagramSocket(9999);
//        接收包
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
//        接收数据进行填充
        ds.receive(packet);
//        拆包
        int len=packet.getLength();
        byte[] data=packet.getData();
        System.out.print("对方:");
        System.out.println(new String(data,0,len));
//     发送
        byte[] data1="好呀".getBytes(StandardCharsets.UTF_8);
        System.out.println("我:好呀");
        DatagramPacket p =
                new DatagramPacket(data1, data1.length, InetAddress.getByName("192.168.31.68"),9998);
        ds.send(p);
        ds.close();
    }
}

4、复习实战

TCP发送消息复习:

服务端:

package Javanetwork;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Stest {
    public static void main(String[] args) throws IOException {
        ServerSocket s = new ServerSocket(9990);
        Socket sk=s.accept();
        BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
        String s1 = br.readLine();
        System.out.println(s1);

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
        if (!s1.equals("name")){
            bw.write("你说啥呢?");
            bw.newLine();
            bw.flush();
        }else {
            bw.write("我是nova");
            bw.newLine();
            bw.flush();
        }
        String s2 = br.readLine();
        System.out.println(s2);
        if (!s2.equals("hobby")){
            bw.write("你说啥呢?");
            bw.newLine();
            bw.flush();
        }else {
            bw.write("编写java程序");
            bw.newLine();
            bw.flush();
        }
    }
}

客户端:

package Javanetwork;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class Ctest {
    public static void main(String[] args) throws IOException {
        Socket s=new Socket(InetAddress.getLocalHost(),9990);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bw.write("name");
        bw.newLine();
        bw.flush();
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String s1 = br.readLine();
        System.out.println(s1);
        bw.write("hobby");
        bw.newLine();
        bw.flush();
        String s2 = br.readLine();
        System.out.println(s2);
//        关闭流
        bw.close();
        br.close();
        s.close();
    }
}

UDP发消息复习

接收端:

package Javanetwork;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

public class UtestR {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(8888);
//        收信息
        byte[] bytes=new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
        ds.receive(packet);
        String s1=new String(packet.getData(),0,packet.getLength());
        System.out.println(s1);
//        回消息
        byte[] data;
        if ("四大名著是哪些?".equals(s1)){
            data="红楼梦、西游记、水浒传、三国演义".getBytes(StandardCharsets.UTF_8);
        }else {
            data="你说啥?".getBytes(StandardCharsets.UTF_8);
        }
        DatagramPacket d = new DatagramPacket(data,0,data.length, InetAddress.getByName("192.168.31.68"),8081);
        ds.send(d);
        ds.close();
    }
}

发送端:

package Javanetwork;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

public class UtestS {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(8081);
//        发信息
        byte[] data="四大名著是哪些?".getBytes(StandardCharsets.UTF_8);
        DatagramPacket d = new DatagramPacket(data,0,data.length, InetAddress.getByName("192.168.31.68"),8888);
        ds.send(d);
//        收消息
        byte[] bytes=new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
        ds.receive(packet);
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        ds.close();
    }
}

TCP发送文件复习

服务端:

package Javanetwork;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Fileserver {
    public static void main(String[] args) throws IOException {
//        等待连接
        ServerSocket ss=new ServerSocket(9991);
        Socket s=ss.accept();
//        接收消息 字节流
        BufferedInputStream bis1 = new BufferedInputStream(s.getInputStream());
        int len1=0;
        byte[] bytes1=new byte[1024];
        while ((len1=bis1.read(bytes1))!=-1){
            System.out.println(new String(bytes1,0,len1));
        }

//        发送文件
//                将源文件转化为字节数组
        String filename="C:\\Users\\lenovo\\Desktop\\新的图片\\视频\\123.mp4";
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filename));
        byte[] data=new byte[1024];
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        int len=0;
        while ((len=bis.read(data))!=-1){
            bs.write(data,0,len);
        }
        byte[] bytes = bs.toByteArray();
//                字节流发送字节数组
        BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
        bos.write(bytes);
        s.shutdownOutput();//设置结束标记//关键
//        关闭流
        bos.close();
        bs.close();
        s.close();
        ss.close();
    }
}

客户端:

package Javanetwork;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;


public class Fileclient {
    public static void main(String[] args) throws IOException {
        Socket s=new Socket(InetAddress.getLocalHost(),9991);
//        发送需求 字符流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bw.write("高山流水");
        bw.newLine();
        bw.flush();//关键
        s.shutdownOutput();//关键
//        接收转化文件
        BufferedInputStream br = new BufferedInputStream(s.getInputStream());
        byte[] data=new byte[1024];
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        int len=0;
        while ((len=br.read(data))!=-1){
            bs.write(data,0,len);
        }
        byte[] bytes = bs.toByteArray();
//        将字节数组转化为文件写入
        String filename="src\\qq.mp4";
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filename));
        bos.write(bytes);
        System.out.println("接收成功");
//        关闭流
        bs.close();
        bos.close();
        bw.close();
        s.close();
    }
}

你可能感兴趣的:(javaSE,网络,java,开发语言)