java网络编程入门以及项目实战

本文涉及的产品
.cn 域名,1个 12个月
简介: 这篇文章是Java网络编程的入门教程,涵盖了网络编程的基础知识、IP地址、端口、通讯协议(TCP和UDP)的概念与区别,并提供了基于TCP和UDP的网络编程实例,包括远程聊天和文件传输程序的代码实现。

java网络编程

1.1概述

地球村:你在西安,你一个美国的朋友!你们之间是怎么交流的?

1.11举个送信件的栗子

信件对方的地址,对方的信息定位到特定个体。自己的地址自己的信息
在这里插入图片描述
有了以上这些要素后不考虑外部环境,这封信理论上就能发送到对方的手里了。
如果考虑外部环境呢?

1.12 计算机网络的定义

将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机网络系统。

1.13网络编程的目的

传播交流信息,数据交换,通信(都是同一个意思)

1.14 想要达到这个效果需要什么?

1.如何准确的定位网络上的一台主机
地址:端口号 栗子如下
192.168.16.124:8080
定位到这个计算机上的某个程序

2.找到了这个主机上的某一程序,如何传输数据呢?
网络编程: TCP/IP协议 C/S架构

1.2网络通信的要素

如何实现网络的通信?

通信双方地址:
iP
端口号
192.168.16.124:5900
规则:网络通信的协议
TCP/IP
在这里插入图片描述

小结:

1.网络编程中有两个主要的问题
如何准确的定位到网络上的一台或多台主机
找到主机之后如何进行通信

2.网络编程中的要素
IP和端口号
网络通信协议 UDP,TCP

3.万物皆对象

1.3、IP地址

1.31 java中的关于ip地址的类

InetAddress
!](https://ucc.alicdn.com/images/user-upload-01/082748da3e8f4987abcd495be5a0b55c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6aOO5ZC56JC95Y-26Iqx6aOY6I2h,size_20,color_FFFFFF,t_70,g_se,x_16)

1.32一个关键的地址:

本机地址:127.0.0.1和localhost

查询ip地址实践代码

package com.kuang.lession01;

import java.net.InetAddress;
import java.net.UnknownHostException;

//记得类名一致,不然会报错的
public class TestInetAddress {
public static void main(String[] args) {
    try {
        //查询本机地址
        InetAddress inetAddress1=InetAddress.getByName("127.0.0.1");
        System.out.println(inetAddress1);

        InetAddress inetAddress3=InetAddress.getByName("localhost");
        System.out.println(inetAddress3);    

        InetAddress inetAddress4=InetAddress.getLocalHost();
        System.out.println(inetAddress4);

        //查询网络ip地址
        InetAddress inetAddress2=InetAddress.getByName("www.baidu.com");//输入的是一个域名他会返回该域名对应的ip地址
        System.out.println(inetAddress2);

        //常用方法
        System.out.println(inetAddress2.getAddress());//大一地址
        System.out.println(inetAddress2.getCanonicalHostName());//规范的名字
        System.out.println(inetAddress2.getHostAddress());//ip
        System.out.println(inetAddress2.getHostName());//域名或者自己电脑的名字

    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

1.33 ip地址分类

Ipv4/ipv6
IPV4 127.0.0.1,4字节组成。0~255,42亿,30亿在北美,亚洲4亿
IPV6:128位8个无符号整数!比如2001:obb2:aaaa:0015:0000:0000:1aaa:1312
公网(互联网)–私网(局域网)
ABCD类地址
192.168.xx.xx专门给组织内部使用的

小知识:域名是为了方便记忆,每个域名都对应一个IP地址,计算机识别域名映射的IP地址后在去执行操作的。

1.4端口

1.41 端口表示计算机上的一个程序的进程

不同的进程有不同的端口号!用来区分软件!
规定端口号区间:0~65535
其中TCP/UDP不同协议端口号可以相同:TCP/UDP:65535*2 tcp:80 udp:80这是可以的
可是单个协议下,端口号不能冲突

1.42 端口分类

公有端口 0~1024
 HTTP:80
 HTTPS:443
 FTP:21
 Telent:23
程序注册端口:1024 -49151,分配给用户或程序的
Tomcat:8080
MySQL:3306
Oracle:1521
动态、私有:49152~65535

1.43 查询端口实践

netstat -ano //查看所有的端口
在这里插入图片描述

netstat -ano|findstr “5353”查看指定端口端口
注:要确定所有端口里面有5353,不然可能检索了个寂寞
在这里插入图片描述

tasklist|findstr "20568"查看指定端口的进程
在这里插入图片描述

注:要确定该端口有对应进程才行
确认方法如下
Ctrl+shift+ESC 打开任务管理器
在这里插入图片描述

小知识:通过修改hosts C:\Windows\System32\drivers\etc\hosts,可以直接修改127.0.0.1hostsname,的映射名字

网络地址小实践
稍微熟悉java中 InetSocketAddress类的用法

package com.kuang.lession01;

import java.net.InetSocketAddress;

public class TestInetSockeAddress {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        InetSocketAddress socketAddress=new InetSocketAddress("127.0.0.1",8080);
        InetSocketAddress socketAddress1=new InetSocketAddress("localhost",8080);
        System.out.println(socketAddress);
        System.out.println(socketAddress1);


        System.out.println(socketAddress.getAddress());
        System.out.println(socketAddress.getPort());//端口
        System.out.println(socketAddress.getHostName());//地址
    }

}

1.5 通讯协议

协议:约定就好比我们现在说普通话写汉字,你能看懂,如果我划拉的是西班牙语,可能你就看不懂了,更不用说进行通讯了

网络通讯协议:速率,传输码率,代码结构,传输控制…

两个重要协议:
TCP:用户传输协议
UDP:用户数据报协议
在这里插入图片描述

TCP UDP对比

TCP

  • 目的连接,且稳定
  • 连接的三次握手
  • 断开的四次挥手

连接最少需要三次,才能保证稳定连接!断开最少四次才能稳定断开!
连接的三次握手:A:请求连接、B同意连接、AB连接
断开的四次挥手:A:请求断开 B:同意断开 B:断开,A:断开

UDP

  • 不建立连接,也不稳定
  • 客户端,服务端:没有明确的界限
  • 不管有没有准备好,都可以发给你
  • DDOS 饱和攻击

TCP程序实践

以下是一次根据java的网络编程原理实现的远程聊天程序。

远程聊天程序

在这里插入图片描述

客户端
  1. 连接服务器Socket
  2. 发送消息
 package lesson02;
//客户端
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

//客户端
public class TcpClientDemo01 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc =new Scanner(System.in);
        System.out.println("请输入你要发送给服务端的文字:");
        while(true)
        {

            Socket socket=null; //扩大Socket和OutpytStream 的作用域方便最后解决异常抛出情况
            OutputStream os=null;

            String str =sc.next();

            try {//核心
                //1. 要知道服务器的地址,端口号
                InetAddress serverIP=InetAddress.getByName("127.0.0.1");
                int port = 9921;

                //2.创建一个socket连接
                socket=new Socket(serverIP, port);

                //3.发送消息IO流
                os=socket.getOutputStream();

                os.write(str.getBytes());

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                /*
                 * 关闭异常以下是大公司解决异常的基本模板
                 */
                if(os!=null) {
                    try {
                        os.close();
                    } catch (IOException e2) {
                        // TODO: handle exception
                    }
                }
                if(socket!=null)
                {
                    try {
                        socket.close();
                    } catch (IOException e2) {
                        // TODO: handle exception
                    }
                }
            }

        }
    }

}
服务器
  1. 建立服务的端口ServerSocket
  2. 等待用户的链接 accept
  3. 接受用户的消息
package lesson02;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//服务端
public class TcpServerDemo01 {
public static void main(String[] args) {

    ServerSocket serverSocket=null;
    Socket socket=null;
    InputStream is =null;
    ByteArrayOutputStream baos=null;
    try {
        //1.新建一个地址
        serverSocket=new ServerSocket(9921);
        while(true)
        {
        //2.等待客户端连接过来
        socket=serverSocket.accept();
        //3.读取客户端的消息
        is =socket.getInputStream();



        //把输入流通过一个管道接一下
        //管道流
        baos=new ByteArrayOutputStream();//输出到控制台
        byte[]buffer=new byte[1024];
        int len;
        while((len=is.read(buffer))!=-1) {//当没有结束时候将内容都写入baos
            baos.write(buffer,0,len);
        }
        System.out.println(baos.toString());    //输出        
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        //关闭
        e.printStackTrace();
    }finally {
        //关闭资源
        if(baos!=null) {
            try {
                baos.close();
            } catch (IOException e2) {
                // TODO: handle exception
            }
        }
        if(is!=null)
        {
            try {
                is.close();
            } catch (IOException e2) {
                // TODO: handle exception
            }
        }
        if(socket!=null)
        {
            try {
                socket.close();
            } catch (IOException e2) {
                // TODO: handle exception
            }
        }
        if(serverSocket!=null)
        {
            try {
                serverSocket.close();
            } catch (IOException e2) {
                // TODO: handle exception
            }
        }
    }
}
}

注:1.eclipse如何开多个控制台运行?
可以看这个博客:
2.遇到bind:address already in use
怎么办?在这里插入图片描述
解决方法:可以看这个博客

实现远程文件传输

客户端

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

public class TcpClientDemo02 {
    public static void main(String[] args) throws IOException {
        //1.客户端使用本地的字节输入流,读取要上传的文件
        FileInputStream fis = new FileInputStream("D:\\socket\\input\\2.txt");
        //2.客户端使用网络字节输出流,把读取到的文件上传到服务器
        Socket socket = new Socket("127.0.0.1",8687);
        OutputStream os = socket.getOutputStream();
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = fis.read(bytes))!=-1) {
            os.write(bytes, 0, len);
        }
        //解决:上传完文件,给服务器写一个结束标记 void shutdownOutput() 禁止此套接字的输出流
        //对于TCP套接字,任何以前写入的数据都将被法师,并且后面的TCP的正常连接终止序列
        socket.shutdownOutput(); //结束输出流
        //6.客户端使用网络字节输入流,读取服务器回写的数据
        InputStream is = socket.getInputStream();
        while ((len = is.read(bytes))!=-1) {
            System.out.println(new String(bytes,0,len));
        }
        fis.close();
        socket.close();
    }
}

服务端

package lesson03;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServerDemo02 {
    public static void main(String[] args) throws IOException {
        //3.服务器使用网络字节输入流,读取客户端上传的文件
        ServerSocket ss = new ServerSocket(8687);
        Socket socket = ss.accept();
        InputStream is = socket.getInputStream();
        //判断服务器文件夹中是否已经上传过
        File file = new File("D:\\socket\\output");
        if (!file.exists()) {
            file.mkdir();
        }
        //4.服务器使用本地字节输出流,把读取到的文件,保存到服务器的硬盘上
        FileOutputStream fos = new FileOutputStream(file+"\\2.txt");
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = is.read(bytes))!= -1) {
            fos.write(bytes,0,len);

        }
        //5.服务器使用网络字节输出流,给客户端回写一个“上传成功”
        OutputStream os = socket.getOutputStream();
        os.write("上传成功".getBytes());
        fos.close();
        socket.close();
        ss.close();
    }
}

UDP编程实例:

利用UDP实现远程聊天

UdpReceiveDemo.java

package UdpChat;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpReceiveDemo {
public static void main(String[] args) throws Exception {
    DatagramSocket socket=new DatagramSocket(6668);
    while(true) {
    //2、准备接受包裹
    byte[] datas=new byte[1024];
    DatagramPacket packet=new DatagramPacket(datas,0,datas.length);
    socket.receive(packet);//阻塞式接受

    //3、输出包裹并准备断开连接 bye
    byte[] data=packet.getData();
    String receiveData=new String(data,0,data.length);
    System.out.println(receiveData);

    if(receiveData.trim().equals("bye")) {//不加trim会由于发出来的包里面含有大量空格导致无法比较,需要删掉空格
        break;
    }        
    }
    socket.close();
}
}

UdpSenderDem.java

package UdpChat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class UdpSenderDemo {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket=new DatagramSocket(8888);

        while(true) {
        //2、准备数据
        BufferedReader  reader=new BufferedReader(new InputStreamReader(System.in));

        String data=reader.readLine();
        byte[] datas=data.getBytes();
        DatagramPacket packet=new DatagramPacket(datas, 0,datas.length,new InetSocketAddress("localhost",6668));

        //3、发送数据
        socket.send(packet);
        if(data.equals("bye")) {
            break;
        }
        }

        socket.close();
    }
}
相关文章
|
12天前
|
监控 安全 数据安全/隐私保护
智能家居安全入门:保护你的网络家园
本文旨在为初学者提供一份简明扼要的指南,介绍如何保护自己的智能家居设备免受网络攻击。通过分析智能家居系统常见的安全漏洞,并提供实用的防御策略,帮助读者建立起一道坚固的数字防线。
|
14天前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
54 6
|
14天前
|
算法 Java 开发者
Java 编程入门:从零到一的旅程
本文将带领读者开启Java编程之旅,从最基础的语法入手,逐步深入到面向对象的核心概念。通过实例代码演示,我们将一起探索如何定义类和对象、实现继承与多态,并解决常见的编程挑战。无论你是编程新手还是希望巩固基础的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
2天前
|
Java 程序员
Java中的异常处理:从入门到精通
在Java编程的世界中,异常处理是保持程序稳定性和可靠性的关键。本文将通过一个独特的视角—把异常处理比作一场“捉迷藏”游戏—来探讨如何在Java中有效管理异常。我们将一起学习如何识别、捕捉以及处理可能出现的异常,确保你的程序即使在面对不可预见的错误时也能优雅地运行。准备好了吗?让我们开始这场寻找并解决Java异常的冒险吧!
|
4天前
|
机器学习/深度学习 人工智能 TensorFlow
神经网络入门到精通:Python带你搭建AI思维,解锁机器学习的无限可能
【9月更文挑战第10天】神经网络是开启人工智能大门的钥匙,不仅是一种技术,更是模仿人脑思考的奇迹。本文从基础概念入手,通过Python和TensorFlow搭建手写数字识别的神经网络,逐步解析数据加载、模型定义、训练及评估的全过程。随着学习深入,我们将探索深度神经网络、卷积神经网络等高级话题,并掌握优化模型性能的方法。通过不断实践,你将能构建自己的AI系统,解锁机器学习的无限潜能。
10 0
|
14天前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
36 0
|
14天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)入门
【8月更文挑战第31天】在人工智能的浪潮中,深度学习以其强大的数据处理能力成为时代的宠儿。本文将引导你走进深度学习的核心组件之一——卷积神经网络(CNN),并带你一探其背后的奥秘。通过简明的语言和直观的代码示例,我们将一起构建一个简易的CNN模型,理解它在图像处理领域的应用,并探索如何利用Python和TensorFlow实现它。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇通往深度学习世界的大门。
|
14天前
|
Java 程序员 UED
Java 中的异常处理:从入门到精通
【8月更文挑战第31天】在Java编程的世界中,异常处理是保持应用稳定性的重要机制。本文将引导你理解异常的本质,学会如何使用try-catch语句来捕获和处理异常,并探索自定义异常类的魅力。我们将一起深入异常的世界,让你的代码更加健壮和用户友好。
|
14天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习入门:使用Python和TensorFlow构建你的第一个神经网络
【8月更文挑战第31天】 本文是一篇面向初学者的深度学习指南,旨在通过简洁明了的语言引导读者了解并实现他们的第一个神经网络。我们将一起探索深度学习的基本概念,并逐步构建一个能够识别手写数字的简单模型。文章将展示如何使用Python语言和TensorFlow框架来训练我们的网络,并通过直观的例子使抽象的概念具体化。无论你是编程新手还是深度学习领域的新兵,这篇文章都将成为你探索这个激动人心领域的垫脚石。
|
14天前
|
机器学习/深度学习 自动驾驶 算法框架/工具
深度学习中的卷积神经网络(CNN)入门
【8月更文挑战第31天】 本文旨在通过浅显易懂的方式,引导初学者步入卷积神经网络(CNN)的神秘世界。我们将从CNN的基础概念出发,逐步深入到其在图像处理中的应用实例,最后通过一个简单的Python代码示例,展示如何实现一个基础的CNN模型。无论你是编程新手还是深度学习领域的初探者,这篇文章都将为你打开一扇了解和掌握CNN的大门。