网络编程
概述:Java是Internet上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的
网络应用程序。Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在 Java 的本机
安装系统里,由JVM进行控制。并且Java实现了一个跨平台的网络库,程序员面对的是一个统一的网络
编程环境。
计算机网络:把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大,功能强的网络系统,
从而使众多的计算机可以方便地互相传递信息,共享硬件,软件,数据信息等资源。
网络编程的目的:直接或间接地通过网络协议与其他计算机实现数据交换,进行通讯。
网络编程中有两个主要的问题:
- 如何准确的定位网络上一台或多台主机;定位主机上的特定的应用
- 找到主机后如何可靠高效的进行数据传输
网络编程中的两个要素:
- ip 和 端口号
- 网络通信协议,udp,tcp
1.InetAddress(ip)
ip地址:Inet Adderss
- 计算机在网络上的唯一标识
- 本机的回环地址:127.0.0.1(英文名即localhost)
- ip地址的分类:IPV4 IPV6
- IPV4:4个字节组成,4个0~255。大概42亿个, 30亿都在北美,亚洲4亿。2011年初已经用
尽。以点分十进制表示,如192.168.0.1 - IPV6:128位(16个字节),写成8个无符号整数,每个整数用四个十六进制位表示,数之间
用冒号 隔开,如:2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b
- IPV4:4个字节组成,4个0~255。大概42亿个, 30亿都在北美,亚洲4亿。2011年初已经用
- IP地址分类方式2:公网地址(万维网使用) 和 私有地址(局域网使用)。
- 192.168.开头的就是私有地址,范围即为 192.168.0.0 ~ 192.168.255.255,专门为组织机构
内部使用
- 192.168.开头的就是私有地址,范围即为 192.168.0.0 ~ 192.168.255.255,专门为组织机构
- 由于ip地址不容易记忆,我们常使用域名来访问,www.baidu.com
package net;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 测试获取Ip的类
*/
public class TestInetadress {
public static void main(String[] args) throws UnknownHostException {
//获取本机Ip
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);
System.out.println(InetAddress.getByName("127.0.0.1"));
//获取百度的ip
System.out.println(InetAddress.getByName("www.baidu.com"));
//ip类的方法
System.out.println(localHost.getAddress());
System.out.println(localHost.getHostName());
System.out.println(localHost.getCanonicalHostName());
}
}
2.InetSocketAddress(端口号)
-
端口号标识正在计算机上运行的进程(程序)
- 不同的进程有不同的端口号,用来区分软件
- 被规定为一个16位的整数 0~65535
-
TCP 和 UDP 各有 65535个端口,单个协议下端口不能冲突
-
端口分类:
-
公认端口: 0~1023。被预先定义的服务通信占用端口。
- HTTP 默认端口 : 80
- HTTPS 默认端口:443
- FTP 默认端口: 21
- Telnet 默认端口:23
-
注册端口:1024~49151、分配给用户进程或应用程序。
- tomcat 默认端口:8080
- Mysql 默认端口:3306
- Oracle 默认端口:1521
-
动态、私有端口:49152~65535
netstat -ano #查看所有端口 netstat -ano|findstr "6732" #查看指定端口 tasklist|findstr "6732 #查看端口对应的进程
端口号与IP地址的组合,得出一个网络套接字:Socket,所以说一些网络编程也被称为Socket编程
package net; import java.net.InetSocketAddress; /** * 测试端口号类 */ public class TestInetSocketadress { public static void main(String[] args) { //ip与端口号的组合获得一个网路套接字 InetSocketAddress localhost = new InetSocketAddress("localhost", 8080); System.out.println(localhost); InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 8080); System.out.println(inetSocketAddress); System.out.println(localhost.getAddress()); System.out.println(localhost.getHostName()); System.out.println(localhost.getPort()); System.out.println(localhost.getHostName()); } }
-
3.网络通信协议
协议:就好比我们都说的普通话,大家才能听懂我讲的,但是我们还有自己的方言!
网络通信协议:
计算机网络中实现通信必须有一些约定,即通信协议,对速率,传输代码,代码结构,传输控制步骤,
出错控制等制定标准。
问题:网路协议太复杂?
计算机网络通信涉及内容很多,比如指定源地址和目标地址,加密解密,压缩解压缩,差错控制,流量
控制,路由控制,如何实现如此复杂的网络协议呢?
通信协议分层的思想
在制定协议时,把复杂成份分解成一些简单的成份,再将他们复合起来。最常用的复合方式是层次方
式,即同层间可以通信,上一层调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开
发和扩展。
TCP/IP协议簇
-
传输层协议中有两个非常重要的协议:
- 用户传输协议 TCP (Transmission Control Protocol)
- 用户数据报协议(User Datagram Protocol)
-
Tcp/IP 以其两个主要协议: 传输控制协议:TCP,和网络互联协议:IP,而得名,实际上是一组协
议,包括多个具有不同功能且互为关联的协议。 -
IP(Internet Protocol)协议是网络层的主要协议,支持网间互联的数据通信。
-
TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层,IP层,传输层
和应用层
TCP 和 UDP对比
-
TCP协议
- 使用TCP协议前,必须建立TCP连接,形成传输数据通道;
- 传输前,采用 ‘ 三次握手 ’‘四次分手’ 方式,点对点通信,是可靠的。
- TCP协议进行通信的两个应用进程:客户端,服务端。
- 在连接中可进行大数据量的传输
- 传输完毕,需要释放已建立的连接,效率低
- 举例:打电话
-
UDP协议
- 将数据,源,目的封装成数据包,不需要建立连接
- 每个数据报的大小限制在64K内
- 发送方不管对方是否准备好,接收方收到也不确认,故事不可靠的
- 可以广播发送
- 发送数据结束时,无需释放资源,开销小,速度快。
- 举例:发短信,导弹(饱和攻击)
4.TCP
package net;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/**
* tcp实现聊天对话
* 客户端
*/
public class TestTcpClient {
public static void main(String[] args)throws IOException {
//获取本机Ip
InetAddress ip = InetAddress.getByName("127.0.0.1");
//自定义一个端口号
int port=9090;
//创建一个socket链接,传入ip,端口
Socket socket = new Socket(ip,port);
//向服务端发送信息
OutputStream outputStream = socket.getOutputStream();
outputStream.write("测试,使用tcp实现聊天对话".getBytes());
outputStream.close();
socket.close();
}
}
package net;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* tcp实现聊天
* 服务端
*/
public class TestTcpServer {
public static void main(String[] args) throws IOException {
//获取本机某个端口的服务
ServerSocket serverSocket = new ServerSocket(9090);
//获取当前端口的数据
Socket accept = serverSocket.accept();
//输出io流中的数据
InputStream is = accept.getInputStream();
byte[] bytes = new byte[1024];
int len;
// while((len = is.read(bytes)) != -1){
// System.out.println(new String(bytes,0,len));
// }
//管道流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((len = is.read(bytes))!= -1){
bos.write(bytes,0,len);
}
System.out.println(bos.toString());
bos.close();
is.close();
accept.close();
serverSocket.close();
}
}
5.udp
注意点:使用udp服务时,发送方在创建包裹时传入ip及端口信息;
接收方在创建连接时确认端口信息,包裹只需要容量,无需ip,端口信息
拓展 : 使用udp实现聊天对话(循环,多线程)
package net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* 测试udp发送包裹
*
* 与tcp不同的时,即使包裹没有接收方,代码依然不会报错
*/
public class TestUdpSend1 {
public static void main(String[] args) throws IOException {
//确认端口地址
DatagramSocket socket = new DatagramSocket();
//包裹数据
String msg = "你好啊,upd";
byte[] data = msg.getBytes();
//创建包裹
DatagramPacket packet =
new DatagramPacket(data,0,data.length, InetAddress.getByName("localhost"),8080);
//发送包裹
socket.send(packet);
//关闭流
socket.close();
}
}
package net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class TestUdpReceive1 {
public static void main(String[] args) throws IOException {
//确认端口
DatagramSocket socket = new DatagramSocket(8080);
byte[] data = new byte[1024];
//创建一个空包裹,用于接收数据
DatagramPacket packet = new DatagramPacket(data,0,data.length);
//接收包裹 阻塞接收
socket.receive(packet);
//输出包裹中的内容
System.out.println(packet.getAddress().getHostName());
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
}
}
6.URL
URL:统一资源定位符,表示网络上某一资源的地址
基本组成结构:
传输协议://ip(主机/域名):端口/文件名 # 具体路径 ? 参数
http://localhost:8080/BidTest ? query
package net;
import java.net.URL;
/**
* 测试URL 信息获取
*/
public class TestUrl {
public static void main(String[] args) throws Exception {
URL url = new URL("http://localhost:8080/BidTest?userName=lzl&password=123456");
//协议
System.out.println(url.getProtocol());
//主机ip
System.out.println(url.getHost());
//端口号
System.out.println(url.getPort());
//项目路径+参数
System.out.println(url.getFile());
//项目路径
System.out.println(url.getPath());
//参数
System.out.println(url.getQuery());
}
}
运行结果:
http
localhost
8080
/BidTest?userName=lzl&password=123456
/BidTest
userName=lzl&password=123456
package net;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
/**
* Url实现网络资源下载
*/
public class TestUrlDownload {
public static void main(String[] args) throws Exception {
//获取url地址
URL url = new URL("https://i0.hdslb.com/bfs/sycp/creative_img/202210/2caed1987c937d0216d659e7921f27b6.jpg");
//打开Http连接
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
//获取连接的输入流
InputStream is = connection.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("a.jpg"));
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
System.out.println("下载完成!");
fos.close();
is.close();
//断开连接
connection.disconnect();
}
}
本章内容文件下载地址:网络编程.rar
学习视频地址:网络编程
标签:java,编程,网络,System,println,import,net,out From: https://www.cnblogs.com/lzlbk-321/p/16826479.html