网络学习
什么是网络
由点和线构成,表示诸多对象间的相互联系
计算机网络:为实现资源共享,和信息传递,通过通信线路连接起来的若干主机。
分类:局域网,城域网,广域网
OSI参考模型
TCP/IP模型
一组用于实现网络互联的通信协议,将协议分成四个层次
TCP
传输控制协议:是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连接的过程需要三次握手,断开连接的过程需要四次挥手
三次握手:
建立连接请求,同意建立连接,发送确认信息
四次挥手:
发送分手信息,回复稍等,回复同意分手,发送确定。
UDP
是一种无连接的传输层协议,提供面向事务的简单不可靠传送服务,每个包的大小64KB.
IP
互联网协议/网际协议
负责将数据从一台机器发送到另一台机器
给互联网每台设备分配一个唯一标识(IP地址)
IPV4:
4字节32位整数,,并分成4段8位的二进制数,每8位之间用 圆点隔开,每8为整数可以转换为一个0——255的十进制整数
255.255.255.255
IPV6
16字节128位整数,,并分成8段16进制数,每16位之间用 圆点隔开,每16位整数可以转换为一个0——65535的十进制整数
FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF
端口号(port)
在通信实体上进行网络通讯程序的唯一标识
InetAddress类
表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息,并提供获取信息的常用方法
package net;
import java.net.InetAddress;
public class demo1 {
public static void main(String[] args) throws Exception{
//第一种方式getLocalHost
InetAddress address=InetAddress.getLocalHost();
System.out.println("ip地址"+address.getHostAddress()+" 主机名"+address.getHostName());
//2.getByName(“ip地址");
InetAddress sd=InetAddress.getByName("192.168.0.107");
System.out.println("ip地址"+sd.getHostAddress()+" 主机名"+sd.getHostName());
//getByName(127.0.0.1)
InetAddress sde=InetAddress.getByName("127.0.0.1");
System.out.println("ip地址"+sde.getHostAddress()+" 主机名"+sde.getHostName());
//getByName(LocalHost);
InetAddress sdee=InetAddress.getByName("localhost");
System.out.println("ip地址"+sdee.getHostAddress()+" 主机名"+sdee.getHostName());
//创建局域网IP地址对象
// InetAddress sdeee=InetAddress.getByName("192.168.0.198");
// System.out.println("ip地址"+sdeee.getHostAddress()+" 主机名"+sdeee.getHostName());
// System.out.println(sdeee.isReachable(2000));
InetAddress inetAddress=InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress.getHostAddress()+inetAddress.getHostName());
System.out.println(inetAddress.isReachable(2000));
InetAddress[] inetAddresses=InetAddress.getAllByName("www.baidu.com");
for (InetAddress id:inetAddresses
) {
System.out.println(id.getHostAddress()+id.getHostName());
}
}
}
基于TCP协议Socket编程
Socket(套接字)是网络中的一个通信节点
分为客户端Socket与服务器ServerSocket
通信要求:IP地址+端口号
开发步骤
- 服务器端
- 创建ServerSocket,指定端口号
- 调用accept等待客户端接入
- 使用输入流,接收请求数据到服务器
- 使用输出流,发送响应数据给客户端
- 释放资源
- 客户端
- 创建Socket,指定服务器IP+端口号
- 使用输出流,发送请求数据给服务器
- 使用输入流,就收响应数据到客户端(等待)
- 释放资源
package net;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/*
- 创建ServerSocket,指定端口号
- 调用accept等待客户端接入
- 使用输入流,接收请求数据到服务器
- 使用输出流,发送响应数据给客户端
- 释放资源
*/
public class TcpServer {
public static void main(String[] args) throws Exception{
ServerSocket serverSocket=new ServerSocket(1027);
Socket socket=serverSocket.accept();//阻塞方法,没有客户端请求就堵塞
//获取输入流,读取客户端发送的数据
InputStream inputStream=socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
String data=bufferedReader.readLine();
System.out.println("客户发送"+data);
bufferedReader.close();
socket.close();
serverSocket.close();
}
}
package net;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.logging.SocketHandler;
/*
- 创建Socket,指定服务器IP+端口号
- 使用输出流,发送请求数据给服务器
- 使用输入流,就收响应数据到客户端(等待)
- 释放资源
*/
public class TcpC {
public static void main(String[] args) throws Exception {
// - 创建Socket,指定服务器IP+端口号
Socket socket=new Socket("192.168.0.107",1027);
// - 使用输出流,发送请求数据给服务器
OutputStream outputStream=socket.getOutputStream();
BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));
bufferedWriter.write("好久不见");
// - 使用输入流,就收响应数据到客户端(等待)
// - 释放资源
bufferedWriter.close();
socket.close();
}
}
发送文件
package net;
import Demo2.Fil;
import com.sun.org.apache.bcel.internal.generic.IFLE;
import java.io.*;
import java.net.Socket;
import java.util.logging.SocketHandler;
/*
- 创建Socket,指定服务器IP+端口号
- 使用输出流,发送请求数据给服务器
- 使用输入流,就收响应数据到客户端(等待)
- 释放资源
*/
public class TcpC {
public static void main(String[] args) throws Exception {
// - 创建Socket,指定服务器IP+端口号
Socket socket=new Socket("192.168.0.107",1027);
// - 使用输出流,发送请求数据给服务器
OutputStream outputStream=socket.getOutputStream();
FileInputStream fileInputStream=new FileInputStream("d:\\1.jpeg");
byte [] buf=new byte[1024*4];
int count=0;
while((count=fileInputStream.read(buf))!=-1){
outputStream.write(buf,0,count);
}
fileInputStream.close();
outputStream.close();
socket.close();
}
}
package net;
import com.sun.xml.internal.ws.api.addressing.OneWayFeature;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/*
- 创建ServerSocket,指定端口号
- 调用accept等待客户端接入
- 使用输入流,接收请求数据到服务器
- 使用输出流,发送响应数据给客户端
- 释放资源
*/
public class TcpServer {
public static void main(String[] args) throws Exception{
ServerSocket serverSocket=new ServerSocket(1027);
Socket socket=serverSocket.accept();//阻塞方法,没有客户端请求就堵塞
//获取输入流,读取客户端发送的数据
InputStream inputStream=socket.getInputStream();
FileOutputStream fileOutputStream=new FileOutputStream("d:\\001.jpg");
byte[] buf=new byte[1024*4];
int count=0;
while((count=inputStream.read(buf))!=-1){
fileOutputStream.write(buf,0,count);
}
fileOutputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}