• (十六)网络编程


    一、网络基础

    1. 网络通信

    (1)网络通信:将数据通过网络从一台设备传输到另一台设备

    (2)java.net 包下提供了一系列的类或接口,完成网络通信

     2. IP 地址 

    (1)概念:用于唯一标识网络中的每台计算机/主机

    (2)查看ip地址:ipconfig

    (3)ip地址的表示形式:点分十进制 XX.XX.XX.XX(4个字节,8位)

    (4)每一个十进制数的范围:0~255

    (5)ip地址的组成 = 网络地址 + 主机地址,比如:192.168.16.69

    (6)IPV6 是互联网工程任务组设计的用于替代 IPV4 的下一代IP协议,其地址数量号称可
    为全世界的每一粒沙子编上一个地址

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

    3. 域名

    将 IP 地址映射成域名

    4. 端口号

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

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

    (3)0~1024已经被占用

    5. 网络通信协议

    5.1 TCP/IP协议

    【Transmission Control Protocol / Internet Protocol】

    传输控制协议/因特网互联协议,又叫网络通讯协议。

    这个协议是 Internet 最基本的协议、Internet 国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。

     

    5.2 TCP和UDP

    TCP协议:传输控制协议
    (1)使用TCP协议前,须先建立 TCP 连接,形成传输数据通道
    (2)传输前,采用”三次握手“方式,是可靠的
    (3)TCP协议进行通信的两个应用进程:客户端、服务端
    (4)在连接中可进行大数据量的传输
    (5)传输完毕,需释放已建立的连接,效率低

    UDP协议:用户数据协议
    (1)将数据、源、目的封装成数据包,不需要建立连接
    (2)每个数据报的大小限制在64K内
    (3)因无需连接,故是不可靠的
    (4)发送数据结束时无需释放资源(因为不是面向连接的),速度快

    6. InetAddress类

    1. public static void main(String[] args) throws Exception {
    2. //1.获取本机InetAddress对象
    3. InetAddress localHost = InetAddress.getLocalHost();
    4. System.out.println(localHost); // yiry/192.168.1.5
    5. //2.根据指定主机名获取ip地址对象
    6. InetAddress host1 = InetAddress.getByName("yiry");
    7. System.out.println(host1); // yiry/192.168.1.5
    8. //3.根据指定域名获取ip地址对象
    9. InetAddress host2 = InetAddress.getByName("www.baidu.com");
    10. System.out.println(host2); // www.baidu.com/183.232.231.172
    11. //4.获取 InetAddress对象的主机名
    12. String hostName = host2.getHostName();
    13. System.out.println(hostName);// www.baidu.com
    14. //5.获取 InetAddress对象的地址
    15. String hostAddress = host2.getHostAddress();
    16. System.out.println(hostAddress);// 183.232.231.172
    17. }

    二、Socket

    1. Socket 基本介绍


    (1)套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准
    (2)通信的两端都要有 Socket,是两台机器间通信的端点
    (3)网络通信其实就是 Socket 的通信。
    (4)Socket 允许程序把网络连接当成一个流,数据在两个 Socket 间通过 IO 传输。
    (5)一般主动发起通信的应用程序属客户端,等待通信请求的为服务端

    2. 应用案例1-字节流

    2.1 服务端

    1. public static void main(String[] args) throws IOException {
    2. // 在本机的 9999 端口监听,等待连接
    3. ServerSocket serverSocket = new ServerSocket(9999);
    4. // 没有客户端连接 9999 端口时,程序会阻塞,等待连接
    5. Socket socket = serverSocket.accept();
    6. System.out.println("服务端:" + socket.getClass());
    7. InputStream is = socket.getInputStream();
    8. byte[] buf = new byte[1024];
    9. int readLen = 0;
    10. while ((readLen = is.read(buf)) != -1) {
    11. System.out.println(new String(buf, 0, readLen));
    12. }
    13. is.close();
    14. socket.close();
    15. serverSocket.close();
    16. }

    2.2 客户端

    1. public static void main(String[] args) throws Exception {
    2. Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
    3. System.out.println("客户端:" + socket.getClass());
    4. OutputStream os = socket.getOutputStream();
    5. os.write("hello,server".getBytes());
    6. os.close();
    7. socket.close();
    8. }

    3. 应用案例2-字节流(互发)

    设置写入结束标记

    【socket.shutdownOutput();】

    3.1 服务端

    1. public static void main(String[] args) throws IOException {
    2. // 在本机的 9999 端口监听,等待连接
    3. ServerSocket serverSocket = new ServerSocket(9999);
    4. // 没有客户端连接 9999 端口时,程序会阻塞,等待连接
    5. Socket socket = serverSocket.accept();
    6. System.out.println("服务端:" + socket.getClass());
    7. InputStream is = socket.getInputStream();
    8. byte[] buf = new byte[1024];
    9. int readLen = 0;
    10. while ((readLen = is.read(buf)) != -1) {
    11. System.out.println(new String(buf, 0, readLen));
    12. }
    13. OutputStream os = socket.getOutputStream();
    14. os.write("hello,client".getBytes());
    15. socket.shutdownOutput();
    16. os.close();
    17. is.close();
    18. socket.close();
    19. serverSocket.close();
    20. }

    3.2 客户端

    1. public static void main(String[] args) throws Exception {
    2. Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
    3. System.out.println("客户端:" + socket.getClass());
    4. OutputStream os = socket.getOutputStream();
    5. os.write("hello,server".getBytes());
    6. socket.shutdownOutput();
    7. InputStream is = socket.getInputStream();
    8. byte[] buf = new byte[1024];
    9. int readLen = 0;
    10. while ((readLen = is.read(buf))!= -1){
    11. System.out.println(new String(buf,0,readLen));
    12. }
    13. is.close();
    14. os.close();
    15. socket.close();
    16. }

    4. 应用案例3-字符流

    设置写入结束标记

    【bufferedWriter.newLine();】

    4.1 服务端

    1. public static void main(String[] args) throws IOException {
    2. // 在本机的 9999 端口监听,等待连接
    3. ServerSocket serverSocket = new ServerSocket(9999);
    4. // 没有客户端连接 9999 端口时,程序会阻塞,等待连接
    5. Socket socket = serverSocket.accept();
    6. System.out.println("服务端:" + socket.getClass());
    7. InputStream is = socket.getInputStream();
    8. BufferedReader br = new BufferedReader(new InputStreamReader(is));
    9. String s = br.readLine();
    10. System.out.println(s);
    11. OutputStream os = socket.getOutputStream();
    12. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
    13. bw.write("hello,client");
    14. bw.newLine();
    15. bw.flush();
    16. bw.close();
    17. br.close();
    18. socket.close();
    19. serverSocket.close();
    20. }

    4.2 客户端

    1. public static void main(String[] args) throws Exception {
    2. Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
    3. System.out.println("客户端:" + socket.getClass());
    4. OutputStream os = socket.getOutputStream();
    5. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
    6. bw.write("hello,server");
    7. // 插入一个换行符,表示结束标记
    8. bw.newLine();
    9. // 字符流需要刷新
    10. bw.flush();
    11. InputStream is = socket.getInputStream();
    12. BufferedReader br = new BufferedReader(new InputStreamReader(is));
    13. String s = br.readLine();
    14. System.out.println(s);
    15. br.close();
    16. bw.close();
    17. socket.close();
    18. }

    5. 应用案例4-将客户端的图片,上传到服务端,服务端回复消息

    5.1 工具类

    1. public class StreamUtils {
    2. /*
    3. 将输入流转换成byte[],即把文件的内容读入到byte[]
    4. */
    5. public static byte[] streamToByteArray(InputStream is) throws IOException {
    6. ByteArrayOutputStream bos = new ByteArrayOutputStream();
    7. byte[] b = new byte[1024];
    8. int len;
    9. while ((len = is.read(b)) != -1) {
    10. bos.write(b, 0, len);
    11. }
    12. byte[] array = bos.toByteArray();
    13. bos.close();
    14. return array;
    15. }
    16. /*
    17. 将InputStream 转换成 String
    18. */
    19. public static String streamToString(InputStream is) throws IOException {
    20. BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    21. StringBuilder builder = new StringBuilder();
    22. String line;
    23. while ((line = reader.readLine()) != null) {
    24. builder.append(line + "\r\n");
    25. }
    26. return builder.toString();
    27. }
    28. }

    5.2 服务端

    1. public class Server_04 {
    2. public static void main(String[] args) throws IOException {
    3. ServerSocket serverSocket = new ServerSocket(8888);
    4. // 等待连接
    5. Socket socket = serverSocket.accept();
    6. InputStream is = socket.getInputStream();
    7. BufferedInputStream bis = new BufferedInputStream(is);
    8. // 文件对应的字节数组
    9. byte[] bytes = StreamUtils.streamToByteArray(bis);
    10. String filepath = "src\\ces1.jpg";
    11. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filepath));
    12. bos.write(bytes);
    13. bos.close();
    14. OutputStream os = socket.getOutputStream();
    15. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
    16. bw.write("服务端收到图片");
    17. bw.flush();
    18. socket.shutdownOutput();
    19. bw.close();
    20. bis.close();
    21. socket.close();
    22. serverSocket.close();
    23. }
    24. }

    5.3 客户端

    1. public class Client_04 {
    2. public static void main(String[] args) throws Exception {
    3. String filepath = "d:\\ces.jpg";
    4. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filepath));
    5. // 文件对应的字节数组
    6. byte[] bytes = StreamUtils.streamToByteArray(bis);
    7. Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
    8. OutputStream os = socket.getOutputStream();
    9. BufferedOutputStream bos = new BufferedOutputStream(os);
    10. bos.write(bytes);
    11. // 结束标记
    12. socket.shutdownOutput();
    13. InputStream is = socket.getInputStream();
    14. String s = StreamUtils.streamToString(is);
    15. System.out.println(s);
    16. is.close();
    17. bis.close();
    18. bos.close();
    19. socket.close();
    20. }
    21. }

    三、netstat 指令(P675)

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

    (2)netstat-anmore可以分页显示

    (3)要求在dos控制台下执行

    四、UDP 网络编程(P677)


     

  • 相关阅读:
    c#linq表达式
    IMX6ULL移植篇-boot 命令的学习
    Epoller
    面向对象【static关键字】
    纯粹的四位奇数
    接口测试 Mock 实战(二) | 结合 jq 完成批量化的手工 Mock
    文件管理 如何操作复制前删除原先目标文件夹中的文件
    号码吉凶查询易语言代码
    灵魂一问:一个Java文件的执行全部过程你确定都清楚吗?
    Java 与 Go:数字和字符串的相互转换
  • 原文地址:https://blog.csdn.net/yirenyuan/article/details/126799423