网络编程 : 实现了PC和PC之间的数据传输;
网络编程的三要素IP地址 : IP地址能定位到PC(电脑) [收件人的地址]
端口号 : 找到PC中的通讯软件[收件人姓名和联系方式]
网络协议 : 决定不同的运输数据的方式 [快递公司] //UDP和TCP
//寄快递
收件人的地址 : 寻找收件人所在的地方
收件人姓名和联系方式 : 定位收件人
快递公司 : 负责快递运输 [不同的快递公司送快递的方式也不一样]
IP地址如何查看自己计算机的IP地址 :
win + r + cmd ->ipconfig
//192.168.31.210
IPV4 : 简化版的IP地址 , 32位表示IP地址; //4个字节表示一个IPV4地址 [点分十进制法]
IPV6 : 精准版的IP地址 , 64位表示IP地址; //[冒分16进制表示]
Java中的InetAddress这个类表示IP地址对象;
获取IP地址对象 :
static InetAddress getByName(String host)
//String host : 主机名 / 主机IP地址
static InetAddress[] getAllByName(String host)
//String host : 主机名 / 主机IP地址
static InetAddress getLocalHost() : 快速获取当前主机的IP地址对象
IP地址对象的功能 :
String getHostName() : 获取IP地址对象封装的主机名
String getHostAddress() : 获取IP地址对象封装的IP地址
//示例
public static void main(String[] args) throws UnknownHostException {//本机
InetAddress localHost = InetAddress.getLocalHost();
String hostName = localHost.getHostName();//本机主机名
String hostAddress = localHost.getHostAddress();//本机ip地址
System.out.println("hostName = " + hostName);
System.out.println("hostAddress = " + hostAddress);
//其他
InetAddress byName1 = InetAddress.getByName("192.168.0.101");//目标ip地址
System.out.println("byName1 = " + byName1);
}
端口号端口号 : 找到PC中的通讯软件[收件人姓名和联系方式]
端口号注意 :
1. 范围 : [0,65535]
2. 端口号不能重复
3. [0-1000]范围内的端口号不要用(大概率被占用) //MySQL : 3306 TOMCAT : 8080/80
网络协议网络协议 : 决定不同的运输数据的方式 [快递公司]
UDP : 面向无连接的网络协议
TCP : 面向连接的网络协议
UDP网络协议UDP网络协议 : 面向无连接的网络协议
两台通讯的设备[通讯软件]不需要建立管道,数据以 "丢包" 形式传递数据;
丢过去的数据包的大小 大64K
特点 : 村口的大喇叭 [只管发不管接]
[外链图片转存中…(img-1eqFTaQG-1672118794309)]
创新互联-专业网站定制、快速模板网站建设、高性价比嘉荫网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式嘉荫网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖嘉荫地区。费用合理售后完善,十年实体公司更值得信赖。UDP协议的发送端UDP协议的发送端 : DatagramSocket [套接字 : Socket] ->网络编程也叫套接字编程
发送端UDP对象如何创建 :
DatagramSocket()
打包数据 : 要发送的数据打包到数据报包中 [DatagramPacket]
如何创建发送端数据报包对象 :
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
//byte[] buf, int offset, int length 你要发送的数据
//InetAddress address : 收件人的IP地址对象
//int port : 端口号
发送数据的方法 : DatagramSocket类中
void send(DatagramPacket p)
UDP协议的发送端的编写步骤 :
1. 创建UDP发送端的对象
2. 打包数据
3. 发送数据
4. 关闭资源 //选做
//示例1
public static void main(String[] args) throws IOException {int PortNumber=10086;//设置端口号
String MessageToSend="开炮";//数据内容
String DestinationIp="192.168.13.58";//目标ip地址
InetAddress DestinationIpAddress = InetAddress.getByName(DestinationIp);//目标ip地址
InetAddress LocalIPAddress = InetAddress.getLocalHost();//本机ip地址
//发送数据
new DatagramSocket().send(new DatagramPacket(MessageToSend.getBytes(),0,
MessageToSend.getBytes().length, DestinationIpAddress, PortNumber));
}
//示例2 : UDP向飞秋发消息
public static void main(String[] args) throws IOException {String MessageToSend="java";//要发送的消息
int PortNumber=2425;//端口号(飞秋固定端口)
String DestinationIpAddress="192.168.13.25";//目标IP地址
String MyName="java";//用户名
String LocalIPAddress="66.66.66.66";//自定义本机IP地址
byte[] bys=getMessage(MyName,LocalIPAddress,MessageToSend).getBytes("GBK");
new DatagramSocket().send(new DatagramPacket(bys,0, bys.length, InetAddress.getByName(DestinationIpAddress), PortNumber));
}
public static String getMessage(String myname,String ip,String line){return new StringBuilder().append("1:").append(System.currentTimeMillis()).append(":").append(myname).append(":")
.append(ip+":").append("32:").append(line).toString();
}
UDP协议的接收端UDP协议的接收端 : DatagramSocket
接收端UDP对象如何创建 :
DatagramSocket(int port)
接收数据的方法 : DatagramSocket类中
void receive(DatagramPacket p)
接收端数据报包对象的创建构造 :
DatagramPacket(byte[] buf, int offset, int length)
拆数据包 :
InetAddress getAddress() : 获取发件人的IP地址信息
int getLength() : 获取真实数据的长度
UDP协议的接收端的编写步骤 :
1. 创建接收端的对象
2. 接收数据
3. 拆数据
4. 关闭资源 //选做
//示例
public static void main(String[] args) throws IOException {int PortNumber=10086;//设置端口号
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, 0, bys.length);
//接收数据
new DatagramSocket(PortNumber).receive(dp);
//拆数据
InetAddress iAddress = dp.getAddress();//发件人的IP地址对象
System.out.println("发件人的主机名 = " + iAddress.getHostName());
System.out.println("发件人的IP地址 = " + iAddress.getHostAddress());
System.out.println("发件人发送的消息 = " + new String(bys, 0, dp.getLength()));
}
TCP网络协议TCP网络协议 : 面向连接的网络协议
PC与PC进行通讯时,要建立管道,数据在管道内使用通讯的流对象进行数据传输!
建立连接时经历 三次握手
断开连接时经历 四次挥手
[外链图片转存中…(img-NBJk62G4-1672118794311)]
TCP协议的客户端TCP协议的客户端 : Socket
客户端构造方法 :
Socket(InetAddress address, int port) : 确认服务器的IP地址和端口号 进行客户端对象创建
获取通讯的流对象 : //输出流
OutputStream getOutputStream()
通讯步骤 :
1. 创建客户端TCP对象
2. 获取客户端获取通讯输出流对象
3. 通过流对象进行数据传递
4. 关闭客户端 //选做
//示例
public static void main(String[] args) throws IOException {Socket socket = new Socket(InetAddress.getLocalHost(), 10086);
OutputStream os = socket.getOutputStream();
os.write("你好,我是小钱!".getBytes());
os.close();
}
TCP协议的服务器TCP协议的服务器 : ServerSocket
服务器构造方法 :
ServerSocket(int port)
监听向服务器发来的信息
Socket accept() : 侦听并接受到此套接字的连接。
//在TCP协议中获取通讯流对象的类都是Socket
获取通讯的流对象 : //输入流
Socket 类中 : InputStream getInputStream()
通讯步骤 :
1. 创建服务器TCP对象
2. 监听
3. 通过监听获取到的Socket对象获取通讯的输入流对象
4. 接收数据
5. 关闭服务器 //不要做
//示例
public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10086);
Socket accept = ss.accept();
InputStream is = accept.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String line = new String(bys, 0, len);
System.out.println("客户端发过来的消息 = " + line);
InetAddress inetAddress = accept.getInetAddress();
System.out.println("客户端的IP地址 = " + inetAddress);
//ss.close();
}
综合案例//文件上传
//客户端
public static void main(String[] args) throws IOException {int PortNumber=10010;//设置端口号
String FileReaderPath="E:\\img\\ot\\mkojnhygtfcde.webp";//文件路径
InetAddress LocalHost = InetAddress.getLocalHost();//本机IP地址
InetAddress DestinationIpAddress = InetAddress.getByName("192.168.13.58");//目标ip地址
//创建客户端的类
Socket socket = new Socket(DestinationIpAddress, PortNumber);
//socket对象获取流对象 [通讯的流对象]
OutputStream os = socket.getOutputStream();
//从本地硬盘中读取文件内容发送给服务器 ->本地的输入流对象
File file = new File(FileReaderPath);
FileInputStream fis = new FileInputStream(file);
//获取文件名
String fileName = file.getName();
//先发一次文件名
os.write(fileName.getBytes());
byte[] bytes = new byte[1024];
int len;
//循环读
while ((len = fis.read(bytes)) != -1) {//把数据发送给服务器
os.write(bytes, 0, len);
}
//当客户端发送完数据需要告知服务器数据发送完毕
//把通讯的输出流对象给关闭
socket.shutdownOutput();
//获取服务器的回显信息
InputStream is = socket.getInputStream();
byte[] bys = new byte[1024];
int count = is.read(bys);
//把数据转换成字符串
String back = new String(bys, 0, count);
System.out.println("服务器回显 : " + back);
//关闭客户端
//socket.close();
fis.close();
}
}
//服务端
public class TcpServePlus {public static void main(String[] args) throws IOException {String FileWriterPath = "E:\\img";//接收文件的文件夹
//创建线程池对象
ExecutorService threadPool = Executors.newFixedThreadPool(50);
//创建服务器的通讯对象
ServerSocket ss = new ServerSocket(10010);
while (true) {//监听并且获取Socket对象
Socket accept = ss.accept();
//获取通讯的输入流
InputStream is = accept.getInputStream();
//服务器先接收一次文件名
byte[] bytes = new byte[1024];
int count = is.read(bytes);
String fileName = new String(bytes, 0, count);
threadPool.submit(new Runnable() {@Override
public void run() {try {InetAddress inetAddress = accept.getInetAddress();
System.out.println("发件人是 : " + inetAddress);
//在服务器中创建本地的输出流对象
//FileOutputStream fos = new FileOutputStream(FileWriterPath + "\\" + System.currentTimeMillis() +".java");
//FileOutputStream fos = new FileOutputStream(FileWriterPath + "\\" + UUID.randomUUID() +".java");
FileOutputStream fos = new FileOutputStream(FileWriterPath + "\\" + fileName);
byte[] bys = new byte[1024];
int len;
//客户端循环发送,服务器循环接收
while ((len = is.read(bys)) != -1) {//服务器读到了数据
//把数据存储到服务器硬盘
fos.write(bys, 0, len);
}
//服务器回显
OutputStream os = accept.getOutputStream();
os.write("服务器已经收到信息!".getBytes());
//关闭资源
//ss.close();
fos.close();
System.out.println("上传成功 !");
System.out.println("----------------------------");
} catch (Exception e) {InetAddress inetAddress = accept.getInetAddress();
System.out.println("发件人是 : " + inetAddress);
System.out.println("传输出现问题!");
System.out.println("----------------------------");
}
}
});
}
}
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧