Java网络编程从0——》入门

目录:
1.软件结构
2. 网络编程三要素
3. TCP通信程序(Socket和ServerSocket)

1.软件结构

1.C/S结构:全称是Client/Server结构,是指客户端和服务器结构如QQ微信等
在这里插入图片描述
2.B/S全称Browser/Server,是指浏览器和服务器结构,常见谷歌火狐等
在这里插入图片描述

网络编程,就是在一定的协议下,实现两台计算机 的通信的程序

2.网络编程三要素

1.网络通信协议
2.IP地址
3.端口号

2.1.协议

1.网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。这就 好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据的传输格式、传输速率、传输步骤等做了 统一规定,通信双方必须同时遵守,最终完成数据交换。这里协议也分为两种:
2.TCP/IP协议:传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是 Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它 的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的 协议来完成自己的需求。如下图:
在这里插入图片描述
3.网络通信协议的分类

1.TCP协议
传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前, 在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可 靠。 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。 第三次握手,客户端再次向服务器端发送确认信息,确认连接。整个交互过程如下图所示。
完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的


  • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
  • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
  • 第三次握手,客户端再次向服务器端发送确认信息,确认连接。

三次握手如图:
在这里插入图片描述
完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议 可 以保证传输数据的安全,所以应用十分广泛,例如下载文件、浏览网页等
2.UDP协议
用户数据报协议(User Datagram Protocol)。UDP协议是一个 面向无连接的协议。 传输数据时,不需 要建立连接,不管对方端服务是否启动,直接将数据、数据源和目的地都封装在数据包中,直接发送。每个 数据包的大小限制在 64k以内。它是不可靠协议,因为无连接,所以传输速度快, 但是容易丢失数据。日常应 用中,例如视频会议、QQ聊天等。

2.2.IP地址

1.IP地址指互联网协议地址(Internet Protocol Address),俗称IP。IP地址用来给一个网络中的计算机设 备做唯一的编号。我们的计算机想要连接到互联网上的计算机就要通过IP地址(就像你想打电话给你妈,你自身相当于一台计算机,电话号码相当于IP地址,你妈相当于互联网上的计算机)

2.IP地址的分类:

1.IPv4:是一个32位的二进制数,通常被分为4个字节,表示成 a.b.c.d 的形式,例如 192.168.65.100 。其 中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个。
2.IPv6:由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。 有资料显示,全球IPv4地址在2011年2月分配完毕。 为了扩大地址空间,拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进 制数,表示成ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,号称可以为全世界的每一粒沙子编上一个网 址,这样就解决了网络地址资源数量不够的问题。

那么我们在我们windows操作系统上可以查看我们的端口号:
指令:

ipconfig

查看本台计算机和指定IP地址的计算机之间是否可以正常地通信

ping 空格 IP地址

有两个特殊的IP地址:

(1)127.0.0.1:代表自己电脑的IP地址
(2)localhost:也代表本地的IP地址

2.3.端口号

1.端口号是干嘛的?
我们知道我们通过IP地址可以建立两台计算机之间的连接,但是比如我们在使用QQ的时候我们给朋友发送一条信息,那么计算机怎么知道我这条信息是要发送到朋友的QQ上而不是朋友的微信上,这时候就需要我们的端口号了

2.端口号是啥?
端口号是一个逻辑端口,我们无法看到或者直接使用,我们的一些网络软件(QQ微信等等)一打开系统就会为网络分配一个随机的端口号或者在软件打开的时候向系统要指定的端口号

3.来个端口号高大上的定义:

端口号是可以唯一标识设备中的进程(应用程序)

4.端口号的表示:

端口号:用两个字节表示的整数,它的取值范围是0~ 65535。其中,0~1023之间的端口号用于一些知名的网 络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会 导致当前程序启动失败。

5.端口号的注意点:

  • 1.端口号为1024前的我们不能是使用,系统已经分配给已知的网络软件
  • 2.网络的端口号不能重复
  • 3.我们一些软件的指定端口号如:mysql为3306,oracle1521等等

利用 协议 + IP地址 + 端口号 三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其 它进程进行交互。

3. TCP通信程序

3.1通信程序的概述

1.TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端与服务端

2.两端通信时步骤:

  1. 服务端程序,需要事先启动,等待客户端的连接。
  2. 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端

客户端和服务器端建立逻辑连接后这个连接中包含一个对象,就是一个I/O流对象,客户端和服务器端可以使用I/O对象进行数据在两者之间的传输,由于数据不仅仅是字符,所以I/O对象是字节流

在这里插入图片描述
这里有两个注意点

1.多个客户端同时和服务器进行交互,服务器必须明确和哪一个客户端进行交互在服务器端有一个方法叫accept客户端获取到请求的客户端对象
2.多个客户端同时和服务器进行交互,就需要使用多个I/O流对象
3.服务器是没有I/O流对象的,服务器可以获取到请求的客户端对象Socket(下面会讲)使用每个客户端Socket中提供的I/O流对象和客户端进行交互

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

  1. 客户端: java.net.Socket 类表示。创建 Socket 对象,向服务端发出连接请求,服务端响应请求,两者建 立连接开始通信。
  2. 服务端: java.net.ServerSocket 类表示。创建 ServerSocket 对象,相当于开启一个服务,并等待客户端 的连接。

3.2 Socket类

1.socket类作用:

Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点
套接字:包含了IP地址和端口号的网络单位

2.构造方法:

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

3.成员方法:

放法名 作用
public InputStream getInputStream() 返回此套接字的输入流。 如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。 关闭生成的InputStream也将关闭相关的Socket。
public OutputStream getOutputStream() 返回此套接字的输出流。 如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。 关闭生成的OutputStream也将关闭相关的Socket。
public void close() 关闭此套接字。 一旦一个socket被关闭,它不可再使用。 关闭此socket也将关闭相关的InputStream和OutputStream 。
public void shutdownOutput() 禁用此套接字的输出流。任何先前写出的数据将被发送,随后终止输出流

4.实现步骤:

  • 1.创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
  • 2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream
  • 3.使用网络字节输出流OutputStream对象中的方法write给服务器发送数据
  • 4.使用Socket对象中的方法getInputStream() 获取网络字节输入流InputStream对象
  • 5.使用网络字节输入流InputStram对象中的方法read读取服务器回写的数据
  • 6.释放资源
例子(和下面的例子是连在一起的):
package untl1;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class MySocket {
    public static void main(String[] args) throws IOException {
        Socket  socket=new Socket("127.0.0.1",8808);
        OutputStream os=socket.getOutputStream();
        os.write("你为啥这么帅".getBytes());
        InputStream is=socket.getInputStream();
        byte [] arr=new byte[1024];
        int len=is.read(arr);
        System.out.println(new String(arr,0,len));

    }
}

3.3 ServerSocket类

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

2.构造方法:

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

3.成员方法:

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

4.实现步骤:

  • 1.创建服务器ServerSocket对象和系统指定的端口号
  • 2.使用ServerSocket对象中的方法accept,获取到请求的客户端对象Socket
  • 3.使用Socket对象中的方法getInputStream()获取网络字节输出流 InputStream对象
  • 4.使用网络字节输入流InputStream对象中的方法read,读取客户端发送的数据
  • 5.使用Socket对象中的方法getOutStream()获取网络字节输出流OutputStram对象
  • 6.使用网络字节输出流OutputStream对象中的方法write,给客户端回写数据
  • 7.释放资源
例子(和上边的例子连在一起的):
package untl1;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServerSocket {
    public static void main(String[] args) throws IOException {
        ServerSocket  serverSocket=new ServerSocket(8808);
        Socket  socket=serverSocket.accept();
        InputStream is=socket.getInputStream();
        byte [] arr=new byte[1024];
        int len=is.read(arr);
        System.out.println(new String(arr,0,len));
        OutputStream  os=socket.getOutputStream();
        os.write("帅到无能为力,帅到感动自己".getBytes());
        socket.close();
        serverSocket.close();
    }
}

本例子和上边例子连在一起就组成了一个完整的客户端和服务器,注意这里服务器要先运行,这样客户端才能和服务器进行连接,然后相互交换数据
运行结果:
本例子输出:
你为啥这么帅
上一个例子输出:
帅到无能为力,帅到感动自己

3.4 TCP通信分析图解

1 .【服务端】启动,创建ServerSocket对象,等待连接。 Socket client = new Socket(“127.0.0.1”, 6666); ServerSocket server = new ServerSocket(6666);
2. 【客户端】启动,创建Socket对象,请求连接。
3. 【服务端】接收连接,调用accept方法,并返回一个Socket对象。
4. 【客户端】Socket对象,获取OutputStream,向服务端写出数据。
5. 【服务端】Scoket对象,获取InputStream,读取客户端发送的数据。
6. 【服务端】Socket对象,获取OutputStream,向客户端回写数据。
7. 【客户端】Scoket对象,获取InputStream,解析回写数据。 ]
8. 【客户端】释放资源,断开连接。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45737068/article/details/105703960