1.计算机网络
- 计算机网络是指:将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
2.IP地址(InetAddress)
-
唯一定义一台网络上计算机
-
127.0.0.1:为本机的IP,也叫 locahost
-
IP地址的分类:
-
IP地址分类(IPV4和IPV6)
- IPV4:127.0.0.1 , 由四个字节组成 ,一个字节的长度为0-255,大概有42亿个;
- IPV6:fe80::7181:de2b:3f55:ae68%15,128位 ,8个无符号整数!
-
公网(互联网)和私网(局域网)
- 192.168.xx.xx , 专门给组织机构用的
- ABCD类IP地址
- 域名:记忆IP问题
-
-
InetAddress类(此类表示Internet协议的IP地址)
没有 构造方法, 不能new
package Base;
//测试IP
import java.net.InetAddress;
import java.net.UnknownHostException;
public class bbb {
public static void main(String[] args) {
try {
//查询本机地址
try {
InetAddress i2 = InetAddress.getByName("127.0.0.1");
System.out.println(i2); ///127.0.0.1
InetAddress i3 = InetAddress.getByName("localhost");
System.out.println(i3);
InetAddress i4 = InetAddress.getLocalHost();
System.out.println(i4);
} catch (UnknownHostException e) {
e.printStackTrace();
}
//查询网站IP地址
InetAddress i1 = InetAddress.getByName("www.baidu.com");
System.out.println(i1); //www.baidu.com/182.61.200.6
//
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
3.端口Port
- 端口表示计算机上的一个程序进程
- 不同的进程有不同的端口号!
- InetSocketAddress:此类实现 IP 套接字地址(IP 地址 + 端口号)。它还可以是一个对(主机名 + 端口号),在此情况下,将尝试解析主机名。如果解析失败,则该地址将被视为未解析 地址,但是其在某些情形下仍然可以使用,比如通过代理连接。
package Base;
import java.net.InetSocketAddress;
public class bbb {
public static void main(String[] args) {
InetSocketAddress s1 = new InetSocketAddress("localhost",8080); //localhost/127.0.0.1:8080
System.out.println(s1);
System.out.println(s1.getHostName()); //localhost
System.out.println(s1.getAddress());//ip地址 localhost/127.0.0.1
System.out.println(s1.getPort());//端口 8080
}
}
4.通信协议
- 协议:约定,就好比我们说的普通话
- TCP :用户传输协议
- UDP :用户数据报协议
- IP :网络互连协议
- TCP(连接打电话)与UDP(不链接发短信)的对比
TCP实现文件上传
package Base;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
//客户端 读取文件
public class Demo2 {
public static void main(String[] args) throws IOException {
//1.创建一个Socket连接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
//2.创建一个输出流
OutputStream os = socket.getOutputStream();
//3.读取文件
FileInputStream fis = new FileInputStream("D:\\code\\src\\Base\\1_BigPic.png");
//4.写出文件
byte[] buffer = new byte[1024];
int len;
while((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
//5.关闭资源
fis.close();
os.close();
socket.close();
}
}
package Base;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务端 接收文件
public class TCPdemo1 {
public static void main(String[] args) throws IOException {
//1.创建服务
ServerSocket serverSocket = new ServerSocket(9000);
//2.监听客户端的连接
Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端的连接
//3.获取输入流
InputStream is = socket.getInputStream();
//4.文件输出
FileOutputStream fos = new FileOutputStream("receive.jpg");
byte[] b = new byte[1024];
int len;
while((len = is.read(b))!=-1){
fos.write(b,0,len);
}
//通知服务器 我已经结束了
socket.shutdownOutput();
//确定服务器接收完毕 才能断开连接
InputStream inputStream = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bufferto = new byte[1024];int lenq;
while((lenq=fis.read(bufferto))!=-1){
os.write(bufferto,0,lenq);
}
//5.关闭资源
fos.close();
is.close();
socket.close();
serverSocket.close();
}
}
- 步骤
Tomcat
- 重点是使用别人的服务器
UDP消息发送
- UDP(发信息)没有明显的客户端和服务端
- 发送端
package Base;
import java.net.*;
//UDP 不需要连接服务器
public class Demo3 {
public static void main(String[] args) throws Exception {
//1.建立一个Socket(发送)
DatagramSocket socket = new DatagramSocket();
//2.建立一个包
String a ="你好啊,数据宝宝";
//数据(为字节数组使用getBytes()转换) ,数据的起始位置,要传输给谁
DatagramPacket datagramPacket = new DatagramPacket(a.getBytes(),0,a.getBytes().length, InetAddress.getByName("localhost"),9090);
//3.发送包
socket.send(datagramPacket);
//4.关闭流
socket.close();
}
}
- 接收端
package Base;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
//还是要等待发送端的链接
public class aaa extends Object{
//接收端
public static void main(String[] args) throws IOException {
//开放端口(接收)
DatagramSocket socket = new DatagramSocket(9090);
//接收数据包
byte[] b= new byte[1024];
//b为要准备接收的空间 不用管从哪里来的 接就完了
DatagramPacket Packet = new DatagramPacket(b,0,b.length);
//使用receive来接收
socket.receive(Packet);
//打印一些信息
System.out.println(Packet.getAddress());
//注意:Packet为字节数组 需要使用new String()来转换为字符数组
System.out.println(new String(Packet.getData(),0,Packet.getLength()));
System.out.println(Packet.getPort());
System.out.println(Packet.getLength());
//关闭
socket.close();
}
}
UDP实现聊天
- 因为可以实现互相聊天 ,所以用多线程来实现
- 线程1
package Base.UDPA;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class Send implements Runnable{
DatagramSocket socket=null ;
BufferedReader reader=null;
private int fromPort;
private String toIP;
private int toPort;
public Send(int fromPort, String toIP, int toPort) {
this.fromPort = fromPort;
this.toIP = toIP;
this.toPort = toPort;
try {
socket = new DatagramSocket(fromPort);
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
//循环输入
while (true) {
try {
//一行一行的读取
String data = reader.readLine();
//创建包 可以使用new InetSocketAddress实现发送到哪
DatagramPacket packet = new DatagramPacket(data.getBytes(), 0, data.getBytes().length, new InetSocketAddress(toIP,toPort));
//发送
socket.send(packet);
//判断退出循环
if (data.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
//关闭资源
socket.close();
}
}
- 线程2
package Base.UDPA;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class reserve implements Runnable{
DatagramSocket socket =null;
private int fromPort;
private String name;
public reserve(int fromPort,String name) {
this.fromPort = fromPort;
this.name = name;
try {
socket = new DatagramSocket(fromPort);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
byte[] b = new byte[1024];
DatagramPacket packet = new DatagramPacket(b,0,b.length);
socket.receive(packet);
//判断结束
byte[] data = packet.getData();
//将其装换为字符串
String s = new String(data, 0, data.length);
//打印接收数据
System.out.println(name+":"+s);
if (s.equals("bye")){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
- 实现线程1
package Base.UDPA;
public class TalkStudent {
public static void main(String[] args) {
new Thread(new Send(7777,"localhost",9999)).start();
new Thread(new reserve(8888,"老师")).start();
}
}
- 实现线程2
package Base.UDPA;
public class Teacher {
public static void main(String[] args) {
new Thread(new Send(5555,"localhost",8888)).start();
new Thread(new reserve(9999,"学生")).start();
}
}
URL下载网络资源
package Base.practice;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.*;
public class Url {
public static void main(String[] args) throws IOException {
//下载地址
URL url = new URL("https://img.alicdn.com/tfs/TB1R5fsgyDsXe8jSZR0XXXK6FXa-281-80.jpg");
//连接到这个资源 使用HTTP连接 url.openConnection()
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
//得到流
InputStream is = urlConnection.getInputStream();
FileOutputStream fos = new FileOutputStream("81-80.jpg");
byte[] b = new byte[1024];
int len =0;
while((len = is.read(b))!=-1){
fos.write(b,0,len);
}
fos.close();
is.close();
//断开连接
urlConnection.disconnect();
}
}