Java基础之网络编程

简介: Java基础之网络编程

基本概念

IP:每个电脑都有一个IP地址,在局域网内IP地址是可变的。


网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据的传输格


式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守,最终完成数据交换。


TCP协议(传输控制协议):是面向连接的传输层协议,应用程序在使用TCP之前,必须先建立TCP连接,在传输数据完毕后,必须释放已经建立的连接(跟打电话是否类似)。TCP可以保证从一端将数据传送至连接的另一端时,数据能够准确送达,而且送到的数据的排列顺序和送出时的顺序相同。


UDP协议(用户数据报协议):是无连接的通信协议,不保证可靠的数据传输,但能够向若干个目标发送数据,接收发自若干个源的数据。(在线影片,下载文件)。


端口(Port):如果把IP地址比作一间房子 ,端口就是出入这间房子的门。


套接字(Socket)用于将应用程序与端口连接起来,类似于连接电器与电线的插座。


在Java中,提供了两个类用于实现TCP通信程序:


1.客户端:java.net.Socket类表示。创建Socket对象,向服务端发送连接请求,服务端相应请求,两者建立连接开始通信。


2.服务端:java.net.ServerSocket 类表示。创建 ServerSocket 对象,相当于开启一个服务,并等待客户端的连接。


Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。

构造函数与常用方法

public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null ,则相当于指定地址为回送地址。


public InputStream getInputStream() : 返回此套接字的输入流。


       如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。 关闭生成的InputStream也将关闭相关的Socket。


public OutputStream getOutputStream() : 返回此套接字的输出流。


       如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。 关闭生成的OutputStream也将关闭相关的Socket。


public void close() :关闭此套接字。 一旦一个socket被关闭,它不可再使用。 关闭此socket也将关闭相关的InputStream和OutputStream 。


public void shutdownOutput() : 禁用此套接字的输出流。 任何先前写出的数据将被发送,随后终止输出流

客户端实现步骤--使用Socket类

1.创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号


2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象


3.使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据


4.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象


5.使用网络字节输入流InputStream对象中方法read,读取服务器回写的数据


6.使用资源(Socket.Close)


public static void main(String[] args) throws IOException {
        //1.创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
        Socket socket = new Socket("127.0.0.1",8888);
        //2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
        OutputStream os = socket.getOutputStream();
        //3.使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据
        os.write("你好服务器".getBytes());
        //4.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
        InputStream is = socket.getInputStream();
        //5.使用网络字节输入流InputStream对象中方法read,读取服务器回写的数据
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        //6.使用资源(Socket.Close)
        socket.close();
    }

ServerSocket 类:这个类实现了服务器套接字,该对象等待通过网络的请求。

构造函数与常用方法

public ServerSocket(int port) :使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指定的端口号上,参数port就是端口号。


public Socket accept() :侦听并接受连接,返回一个新的 Socket 对象,用于和客户端实现通信。该方法会一直阻塞直到建立连接。


服务器端实现步骤--使用ServerSocket类

1.使用服务器ServerSocket对象和系统要指定的端口号


2.使用ServerSocket对象中的方法accept,获取到请求的客户端对象socket


3.使用Socket对象中的getInputStream()获取网络字节输入流Inputstream对象


4.使用网络字节输入流InputStream对象中方法read,读取客户端发送的数据


5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象


6.使用网络字节输出流Outputstream对象中的方法Write,给客户端回写数据


7.释放资源(Socket,ServerSocket)

public static void main(String[]args)throws IOException{
        //1.使用服务器ServerSocket对象和系统要指定的端口号
        ServerSocket server=new ServerSocket(8888);
        //2.使用ServerSocket对象中的方法accept,获取到请求的客户端对象socket
        Socket socket=server.accept();
        //3.使用Socket对象中的getInputStream()获取网络字节输入流Inputstream对象
        InputStream is=socket.getInputStream();
        //4..使用网络字节输入流InputStream对象中方法read,读取客户端发送的数据
        byte[]bytes=new byte[1024];
        int len=is.read(bytes);
        System.out.println(new String(bytes,0,len));
        //5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
        OutputStream os=socket.getOutputStream();
        //6.使用网络字节输出流Outputstream对象中的方法Write,给客户端回写数据
        os.write("收到谢谢".getBytes());
        //7.释放资源(Socket,ServerSocket)
        server.close();
        socket.close();
    }

文件上传练习

客户端

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",8888);
        //3.使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象
        OutputStream os=socket.getOutputStream();
        //4.使用本地字节输入流FileInputStream对象中的方法read,读取本地文件
        int len=0;
        byte[]bytes=new byte[1024];
        while((len=fis.read(bytes))!=-1){
            //5.使用网络字节输出流OutputStream对象中的方法write,把读取到的文件上传到服务器
            os.write(bytes,0,len);
        }
        /*
        解决:上传完文件,给服务器写一个结束标记
        voidshutdownOutput()禁用此套接字的输出流。
        对于TCP套接字,任何以前写入的数据都将被发送,并且后跟TCP的正常连接终止序列。
        */
        socket.shutdownOutput();
        //6.使用Socket中的方法getInputStream,获取网络字节输入流InputStream对象
        InputStream is=socket.getInputStream();
        System.out.println("333333333333333333333");
        //7.使用网络字节输入流InputStream对象中的方法read读取服务回写的数据
        while((len=is.read(bytes))!=-1){
            System.out.println(new String(bytes,0,len));
        }
        System.out.println("444444444444444444while死循环打印不到");
        //8.释放资源(FileInputStream,Socket)
        fis.close();
        socket.close();
    }

服务端


public static void main(String[]args)throws IOException{
        //1.创建一个服务器ServerSocket对象,和系统要指定的端口号
        ServerSocket server=new ServerSocket(8888);
        //2.使用ServerSocket对象中的方法accept,获取到请求的客户端Socket对象
        Socket socket=server.accept();
        //3.使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
        InputStream is=socket.getInputStream();
        //4.判断d:\\upload文件夹是否存在,不存在则创建
        File file=new File("d:\\upload");
        if(!file.exists()){
            file.mkdirs();
        }
        //5.创建一个本地字节输出流FileOutputStream对象,构造方法中绑定要输出的目的地
        FileOutputStream fos=new FileOutputStream(file+"\\1.jpg");
        //6.使用网络字节输入流InputStream对象中的方法read,读取客户端上传的文件
        System.out.println("11111111111111111111");
        int len=0;
        byte[]bytes=new byte[1024];
        while((len=is.read(bytes))!=-1){
            //7.使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上
            fos.write(bytes,0,len);
        }
        System.out.println("22222222222222222222222while死循环打印不到");
        //8.使用Socket对象中的方法getOutputStream,获取到网络字节输出流OutputStream对象
        //9.使用网络字节输出流OutputStream对象中的方法write,给客户端回写"上传成功"
        socket.getOutputStream().write("上传成功".getBytes());
        //10.释放资源(FileOutputStream,Socket,ServerSocket)
        fos.close();
        socket.close();
        server.close();
    }
相关文章
|
3天前
|
网络协议 算法 Java
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
16 3
|
4天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
9 0
|
13天前
|
安全 Java 网络安全
深入理解Java异常处理网络安全与信息安全:保护数据的关键策略
【4月更文挑战第29天】本文将深入探讨Java中的异常处理机制,包括异常的概念、分类、捕获和处理等方面。通过详细的解析和实例演示,帮助读者更好地理解Java异常处理的原理和应用。 【4月更文挑战第29天】在数字化时代,数据成为最宝贵的资产之一。随着网络攻击的日益猖獗,了解并实施有效的网络安全和信息保护措施变得至关重要。本文将深入探讨网络安全漏洞的概念、加密技术的重要性以及提升个人和企业的安全意识的必要性。我们将分析当前的安全挑战,并提供一系列实用的防护策略,旨在帮助读者构建一个更加安全的数字环境。
|
16天前
|
网络协议 Java 网络架构
Java基础教程(18)-Java中的网络编程
【4月更文挑战第18天】Java网络编程简化了底层协议处理,利用Java标准库接口进行TCP/IP通信。TCP协议提供可靠传输,常用于HTTP、SMTP等协议;UDP协议则更高效但不保证可靠性。在TCP编程中,ServerSocket用于监听客户端连接,Socket实现双进程间通信。UDP编程中,DatagramSocket处理无连接的数据报文。HTTP编程可以通过HttpURLConnection发送请求并接收响应。
|
23天前
|
监控 网络协议 Java
《Java 简易速速上手小册》第7章:Java 网络编程(2024 最新版)
《Java 简易速速上手小册》第7章:Java 网络编程(2024 最新版)
23 0
《Java 简易速速上手小册》第7章:Java 网络编程(2024 最新版)
|
24天前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
|
24天前
|
JavaScript Java 测试技术
基于Java的网络办公系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络办公系统的设计与实现(源码+lw+部署文档+讲解等)
23 0
|
26天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
2月前
|
网络协议 算法 Java
|
4月前
|
Java 数据格式
最新Java基础系列课程--Day15-网络编程(三)
最新Java基础系列课程--Day15-网络编程