首页 > 编程语言 >强哥说Java--网络编程

强哥说Java--网络编程

时间:2023-01-11 11:35:12浏览次数:38  
标签:Java Socket -- 强哥 TCP IP InetAddress 端口号 客户端


网络编程

  • ​​网络编程概述​​
  • ​​网络通信要素概述​​
  • ​​通信要素1 : IP和端口号​​
  • ​​ip地址​​
  • ​​端口号​​
  • ​​InetAddress类​​
  • ​​实例​​
  • ​​通信要素2 :网络协议​​
  • ​​TCP/IP协议簇​​
  • ​​TCP网络编程​​
  • ​​Socket​​
  • ​​基于Socket的TCP实例​​
  • ​​小结​​

网络编程概述

Java提供的网络类库,可以实现无痛的网络连接,联网的底层 细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并 且 Java 实现了一个跨平台的网络库,程序员面对的是一个统一 的网络编程环境

网络通信要素概述

通信双方地址
IP
➢端口号

一定的规则(即:网络通信协议。有两套参考模型)
➢OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广
➢TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。

强哥说Java--网络编程_IP

强哥说Java--网络编程_java_02

通信要素1 : IP和端口号

ip地址

IP地址: InetAddress
➢唯一的标识Internet.上的计算机(通信实体)
➢本地回环地址(hostAddress): 127.0.0.1 主机名(hostName): localhost
➢IP地址分类方式1: IPV4和IPV6
IPV4: 4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。以点分十进制表示,如192. 168.0.1
IPV6: 128位 (16个字节),写成8个无符号整数,每个整数用四个十六进制位表示,数之间用冒号(: )分开,如: 3ffe:3201:1401:1280:c8ff:fe4d:db39:1984

➢IP地址分类方式2:公网地址(万维网使用)和私有地址(局域网使用)。192.168.开头的就是私有址址,范围即为192.168.0.0–192.168.255.255,专门为组织机
构内部使用
➢特点:不易记忆

端口号

端口号标识正在计算机_上运行的进程(程序)
➢不同的进程有不同的端口号
➢被规定为一个16位的整数0~65535。
➢端口分类:
公认端口: 0~1023。 被预先定义的服务通信占用(如: HTTP占用端口80,FTP占用端口21,Telnet占 用端口23)
注册端口: 1024~49151。 分配给用户进程或应用程序。( 如: Tomcat 占用端口8080,MySQL占用端口3306,Oracle占用端口1521等) 。
动态/私有端口: 49152~65535。

端口号与IP地址的组合得出一个网络套接字: Socket.

InetAddress类

Internet上的主机有两种方式表示地址:
➢域名(hostName): www. atguigu.com
➢IP地址(hostAddress): 202.108.35.210
InetAddress类主要表示IP地址,两个子类:Inet4Address、 Inet6Address。

InetAddress类对象含有一个Internet主机地址的域名和IP地址:www.atguigu.com和202.108.35.210。

域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立连接。-------域名解析

InetAddress类没有提供公共的构造器,而是提供了如下几个静态方法来获取InetAddress实例

public static InetAddress getLocalHost()

public static InetAddress getByName(String host)

InetAddress提供了如下几个常用的方法

public String getHostAddress():返回 IP 地址字符串(以文本表现形式)

public String getHostName():获取此 IP 地址的主机名

public boolean isReachable(int timeout):测试是否可以达到该地址

实例

package com.caq.java;

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

/**

通信要素一:IP和端口号

1.IP唯一的Internet上的计算机
2.在java中使用InetAddress
3.IP分类:
IPv4,IPv6 万维网和局域网


* @Date 2021/12/3 7:59
* @Version 1.0
*/
public class InternetTest {
public static void main(String[] args) {
try {
InetAddress inet1 = InetAddress.getByName("192.168.10.14");
System.out.println(inet1);


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

InetAddress byName = InetAddress.getByName("www.baidu.com");
System.out.println(byName);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}

通信要素2 :网络协议

●网络通信协议

计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。

●问题:网络协议太复杂
计算机网络通信涉及内容很多,比如指定源地址和目标地址,加密解密,压缩解压缩,差错控制,流量控制,路由控制,如何实现如此复杂的网络协议呢?

●通信协议分层的思想
在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常
用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与
**再下一层不发生关系。**各层互不影响,利于系统的开发和扩展。

TCP/IP协议簇

传输层协议中有两个非常重要的协议:

传输控制协议TCP(Transmission Control Protocol)

用户数据报协议UDP(User Datagram Protocol)。

**TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)**而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。

IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信。

TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层、IP层、传输层和应用层。

TCP网络编程

TCP协议:

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

UDP协议:
➢将数据、源、目的封装成数据包,不需要建立连接
➢每个数据报的大小限制在64K内
➢发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
➢可以广播发送
➢发送数据结束时无需释放资源,开销小,速度快

这里简单介绍下,后序会详细更新,这点很重要

强哥说Java--网络编程_IP_03

强哥说Java--网络编程_java_04

Socket

利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准。

网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。

通信的两端都要有Socket,是两台机器间通信的端点。

网络通信其实就是Socket间的通信。

Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。

一般主动发起通信的应用程序属客户端,等待通信请求的为服务端。

Socket分类:

➢流套接字(stream socket) :使用TCP提供可依赖的字节流服务

➢数据报套接字(datagram socket) :使用UDP提供“尽力而为”的数据报服务

说白了就是IP地址和端口号组合在一起构成Socket

常用方法

强哥说Java--网络编程_IP_05

基于Socket的TCP实例

Java语言的基于套接字编程分为服务端编程和客户端编程。其通信模型如下图:

强哥说Java--网络编程_网络_06

客户端Socket的工作过程包含以下四个基本的步骤:

创建Socket:根据指定服务端的IP地址或端口号构造Socket类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
​ ➢打开连接到Socket的输入出流:使用 getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输
​ ➢按照一定的协议对Socket进行读/写操作:通过输入流读取服务器放入线路的信息.(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
​ ➢关闭Socket:断开客户端到服务器的连接,释放线路

服务器程序的工作过程包含以下四个基本的步骤:

调用ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
​ ➢调用accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
​ ➢调用该Socket类对象的getOutputStream()和getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。
​ ➢关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。

服务器必须事先建立一个等待客户请求建立套接字 连接的ServerSocket对象。

接受就是accept方法

package com.caq.java;

import org.junit.Test;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**

实现TCP的网络编程
例题2:客户端发送文件给服务端,服务端将文件保存在本地。


* @Date 2021/12/3 9:13
* @Version 1.0
*/
public class TCPTest2 {

//客户端
@Test
public void client() throws IOException {
//1.创建服务器端的ServeSocker,指明自己的端口号
Socket socket = new Socket(InetAddress.getByName("localhost"),9090);

//2.获取一个输出流,用于输出数据
OutputStream os = socket.getOutputStream();

//3.写出本地数据的操作
FileInputStream fis = new FileInputStream("cxk1.jpg");

byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1){
os.write(buffer,0,len);
}

//4.资源的关闭
fis.close();
os.close();
socket.close();


}

//服务端
@Test
public void server() throws IOException {

//创建服务端ServerSocket,指明端口
ServerSocket ss = new ServerSocket(9090);

//2.获取客户端Socket
Socket socket = ss.accept();

//3.获取客户端输入流
InputStream is = socket.getInputStream();
//3.保存为本地文件
FileOutputStream fos = new FileOutputStream("cxk2.jpg");

//4.操作过程
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1){
fos.write(buffer,0,len);
}

//5.资源的关闭
fos.close();
is.close();
socket.close();
ss.close();

}
}

UDP和URL编程后续学Javaweb更新!!!

小结

位于网络中的计算机具有唯一的IP地址,这样不同的主机可以互相区分。
客户端一服务器是一种最常见的网络应用程序模型。服务器是一个为其客户端提供某种特定服务的硬件或软件。客户机是一个用户应用程序,用于访问某台服务器提供的服务。端口号是对一个服务的访问场所,它用于区分同一物理计算机上的多个服务。套接字用于连接客户端和服务器,客户端和服务器之间的每个通信会话使用一个不同的套接字。TCP协议用于实现面向连接的会话。

Java中有关网络方面的功能都定义在java.net程序包中。Java用InetAddress对象表示IP地址,该对象里有两个字段:主机名(String) 和IP地址(int)。

类Socket和ServerSocket实现了基于TCP协议的客户端一服务器程序。Socket是客户端和服务器之间的一个连接,连接创建的细节被隐藏了。这个连接提供了一个安全的数据传输通道,这是因为TCP协议可以解决数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题,它保证数据可靠的传送。

类URL和URLConnection提供了最高级网络应用。URL的网络资源的位置来同一表示Internet上各种网络资源。通过URL_对象可以创建当前应用程序和URL表示的网络资源之间的连接,这样当前程序就可以读取网络资源数据,或者把自己的数据传送到网络上去。


标签:Java,Socket,--,强哥,TCP,IP,InetAddress,端口号,客户端
From: https://blog.51cto.com/u_14519396/6001802

相关文章

  • C#中内联函数的用法介绍
    函数调用在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还要将实参的值复制给形参,接下来还要将函数的返回地址(该地址指明了函数执行结束后,程序应该回到哪里继续执......
  • 强哥说Java--IO流
    IO流​​一、File类的使用​​​​路径分隔符​​​​常用方法​​​​二、IO流原理及流的分类​​​​JavaIO原理​​​​流的分类​​​​节点流和处理流​​​​InputStr......
  • 【二分查找】LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置
    题目链接34.在排序数组中查找元素的第一个和最后一个位置思路转自:林小鹿的题解两套二分查找模板,分别用来查找左边界和右边界intbsearch_1(intl,intr){whil......
  • 强哥说Java--Java多线程
    Java多线程​​前言​​​​总目录​​​​一、基本概念​​​​1.程序​​​​2.进程​​​​3.线程​​​​3.实例理解​​​​4.单核CPU和多核CPU的理解​​​​5.并行和......
  • Docker学习笔记:login、logout登录登出
    一、login登录dockerlogin登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库DockerHub。#语法dockerlogin[OPTIONS][SERVER]Options:-p,-......
  • 美多商城项目(四)
    购物车部分购物车商品应当存储那些数据sku_id,count(用户购买几个),selected(是否被勾选)-登录用户:允许使用服务器资源-存储到redis,每条数据分两种格......
  • 大话数据结构--图
    图总目录前言七、图7.1图的定义7.1.1各种图的定义有向图无向图完全图稀疏图稠密图网邻接关联(依附)顶点的度路径路径长度回路(环)简单路径简单回路(简单环)连通图(强连通图......
  • Java入门
    Java入门Java特性和优势简单性面向对象可移植性(writeonce,runanywhere)高性能分布式(反射机制)动态性多线程安全性健壮性Java三大版本JavaSE:标准版(桌面......
  • 大话数据结构--树
    串总目录前言六、树6.1树的定义6.1.1基本术语6.1.2结点间的关系6.1.3树的其他相关概念6.2树的抽象数据类型6.3树的存储结构6.3.1双亲表示法6.3.2孩子表示法6.3.3孩子兄弟表......
  • Python实例浅谈之三Python与C/C++相互调用
    一、问题     Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结。二、Python调用C/C++1、Python调用C动态链接库       P......