Java网络编程基础与实践

一、网络编程入门

1.1 软件结构
(1)C/S结构:全称Client/Server结构,指客户端和服务器结构。通过客户端访问服务器端。
在这里插入图片描述

(2)B/S结构:全称Browser/Server结构,是指浏览器和服务器结构。通过浏览器网址来访问服务器。
在这里插入图片描述
——离不开网络,在一定的协议下,实现两台计算机的网络通信。

1.2 网络通信协议
在这里插入图片描述
TCP/IP协议采用了四层分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
在这里插入图片描述
1)链路层:用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如对光纤、网线提供的驱动;
2)网络层:是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络;
3)运输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议;
4)应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议。

【TIP】Http和Https的区别?
——Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;Https是加了SSL(Secure Socket Layer)的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。二者之间存在如下不同:
(1)端口不同:Http与Https使用不同的连接方式,用的端口也不一样,前者是80,后者是443;
(2)资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;
(3)开销:Https通信需要证书,而证书一般需要向认证机构购买;

TCP和UDP的区别?
1、TCP(传输控制协议)需要连接后再发送数据,UDP(用户数据报协议)是无连接的,不验证是否到达;
2、TCP提供可靠的服务,无差错,不丢失,不重复,且有序到达。UDP不保证可靠交付;
(因为TCP需要三次握手建立连接,有重发机制、序号标识、滑动窗口等实现可靠传输)
3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高要求的通信(丢几个数据包关系不大);
4、每一条TCP连接只能是点到点的,UDP支持一对一、多对一和多对多的交互通信;
5、TCP对系统资源要求较多,UDP对系统资源要求较少。

TCP建立连接——三次握手(发送数据的准备阶段的三次交互,保证连接可靠):

第一次握手:客户端向服务器端发出连接请求,等待服务器确认;
第二次握手:服务器端向客户端回送一个响应,通知客户端收到了连接请求;
第三次握手:客户端再次向服务器端发送确认信息,确认连接。
——用于:文件下载、上传、网页浏览

网络编程三要素:
(1)协议
(2)IP地址:用于给一个网络中的计算机设备做唯一编号;

IPv4——8字节x4段=32位,2^32≈42亿个。
IPv6:16字节x8段=128位,16字节表示成4个十六进制数,比如AB01:EF86:…

本机IP地址查看方式:ipconfig
本机IP地址:127.0.0.1localhost(本地主机) eg:ping 127.0.0.1/localhost

(3)端口号:网络的通信,本质上是两个进程(应用程序)的通信,每台计算机都有很多的进程
IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)了。

1.用两个字节表示的整数,256x256=65535,因此它的取值范围是0~65535,1024之前的不能使用(已经被分配给知名网络软件了)
2.当我们使用的网络软件一打开,操作系统就会为网络软件分配一个随机的端口号,或者软件主动和系统要端口号。

因此网络连接的全部地址格式IP:端口号:192.168.1.200:5000

常用端口号:

1、 80端口号——网络端口,eg:www.baidu.com:80 正确的! www.baidu.com:70 错误的!
2、数据库 mysql:3306 oracle:1521 Tomcat:8080

二、TCP通信程序

客户端与服务端的通信步骤:

1、服务端程序需要事先启动,等待客户端的连接;
2、客户端主动连接服务器端(三次握手),连接成功才能开始通信,服务端不可以主动连接客户端。
3、客户端和服务器端之间建立逻辑连接,这个连接包含了一个IO对象,它们借此进行通信。(通信的数据不仅仅是字符,IO流对象是字节流对象)

在这里插入图片描述
注意1:客户端和服务器端进行一次数据交互,需要4个IO流对象(客户端+服务器端的OutputStream和InputStream)
注意2:

(1)多个客户端同时和服务器端进行交互,服务器必须明确和哪个客户端进行交互?
——在服务器端有一个方法:accept,可以获取到请求的客户端对象。Socket s1 = server.accept();
(2)多个客户端同时和服务器进行交互,就需要使用多个IO流对象。
——服务器是没有IO流的,服务器可以获取到请求的客户端对象Socket,使用每个客户端Socket中提供的IO流和客户端进行交互。服务器使用客户端的字节输入流读取客户端发送的数据;服务端使用客户端的字节输出流给客户端回写(发送)数据。

总结:服务器使用客户端的流和客户端交互。

【TCP通信的客户端代码实现】

package com.TCPDemo;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/*
TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器会写的数据。
表示客户端的类:java.net.Socket:此类实现客户端套接字
(套接字:两台机器的端点,包含IP地址和端口号的网络单位)
构造方法:Socket(String host,int port)
参数:String host:服务器主机的名称/服务器的IP地址
      int port:服务器的端口号
成员方法:
      OutputStream getOutputStream()  返回此套接字的输出流
      InputStream getInputStream() 返回此套接字的输入流
      void close() 关闭此套接字
实现步骤:
      1、创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
      2、使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
      3、使用网络节输出流OutputStream对象中的方法write,给服务器发送数据
      4、使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
      5、使用网络字节输入流InputStream对象中的方法read,读取服务器回写的数据
      6、释放资源(Socket)
   注意:
       1、客户端和服务器端进行交互,必须使用Socket中提供的网络流,不能使用自己创建的流对象;
       2、当我们创建客户端对象Socket的时候,就会去请求服务器和服务器经过3次握手连接通路。
       这时如果服务器没有启动,那么就会抛出异常,如果服务器已经启动,那么就可以交互了!
 */
public class TCPClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",8888);
        OutputStream os = socket.getOutputStream();
        os.write("你好服务器".getBytes());

        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));

        socket.close();
    }
}

【TCP通信的服务器端代码实现】

package com.TCPDemo;

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

/*
   TCP通信的服务器端:接收客户端的请求,读取客户端发送的数据,给客户端回写数据
   表示服务器的类:java.net.ServerSocket
   构造方法:
           ServerSocket(int port) 创建绑定到特定端口的服务器套接字
   服务器端必须明确一件事情:必须知道是哪个客户端请求的服务器
   所以可以使用accept方法获取到请求的客户端对象Socket
   成员方法:
         Socket accept()侦听并接受到此套接字的连接
   服务器的实现步骤:
        1、创建服务器ServerSocket对象和系统要指定的端口号
        2、使用ServerSocket对象中的方法accept,回去请求的客户端对象Socket
        3、使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
        4、使用网络字节流InputStream对象中的方法read,读取服务器回写的数据
        5、使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
        6、使用网络字节输出流OutputStream对象中的方法write,给客户端回写数据
        7、释放资源
 */
public class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8888);
        Socket socket = server.accept();
        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        OutputStream os = socket.getOutputStream();
        os.write("收到谢谢".getBytes());
        socket.close();
        server.close();
    }
}

先运行服务器端,让他处于启动状态,等待连接,再运行客户端程序,就会有如下结果来证实连接成功:
在这里插入图片描述
在这里插入图片描述

三、文件上传

原理:客户端读取本地文件,把文件上传服务器,服务器把上传文件保存到服务器的硬盘上。
1、客户端使用本地字节输入流,读取要上传的文件;
2、客户端使用网络字节输出流,把读取到的文件上传到服务器;
3、服务器使用网络字节输入流,读取客户端上传的文件;
4、服务器使用本地字节输出流,把读取到的文件保存到服务器的硬盘上;
5、服务器使用网络字节输出流,给客户端回写一个“上传成功”;
6、客户端使用网络字节输入流读取服务器回写的数据;
7、释放资源。

注意事项:

1、客户端和服务器和本地硬盘进行读写,需要使用自己创建的字节流(本地流)对象;
2、客户端和服务器之间进行读写,必须使用Socket中提供的字节流(网络流)对象。

文件上传原理就是文件的复制。

未完。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值