文章目录
网络编程
用java实现在网络中传输数据
Ip地址
IP 地址:是网络中的唯一标识
-
IP 地址的两大分类
-
IPV4(主流)
-
IPV6(还未普及)
-
-
常用 MSDOS 命令
-
ipconfig -all - 获取一些信息 例如本机的ip地址等…
-
ping xxx.xxx.xxx.xx - 测试是否畅通
-
netstat -ano
-
-
特殊的 IP 地址
- 127.0.0.1 - 本地的回还地址
InertAddress类的使用
方法名 | 说明 |
---|---|
static InetAddress getByName(String host) | 确定主机名的 IP 地址,主机名可以是机器名成,也可以是 IP 地址 |
String getHostName() | 获取此 IP 地址的主机名 |
String getHostAddress() | 返回文本显示中的 IP 地址字符串 |
demo:
package com.itxs.demo01;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* @Classname : demo01
* @Description : TODO InertAddress Ip地址类
* @Author : lin_refuel@qq.com
*/
public class demo01 {
public static void main(String[] args) throws UnknownHostException {
// 个人理解,把一个ip地址进行包装
// 自己本机的IP地址进行包装的三种方式
// 方式一: ipv4的地址进行包装
InetAddress byName = InetAddress.getByName("192.168.1.108");
System.out.println(byName);// /192.168.80.1
// 方式二: 包装 127.0.0.1
InetAddress byName1 = InetAddress.getByName("127.0.0.1");
System.out.println(byName1);///127.0.0.1
// 通过自己计算机的名字进行包装
InetAddress byName2 = InetAddress.getByName("DESKTOP-6KFSBG2");
System.out.println(byName2);//DESKTOP-6KFSBG2/192.168.1.108
//============================================================
// 通过获取计算机名字获取到的ip进行拆分
System.out.println(byName2.getHostName()); // 主机名字:DESKTOP-6KFSBG2
System.out.println(byName2.getHostAddress());// ip地址:192.168.1.108
}
}
运行结果:
端口
端口是应用程序在设备当中的唯一标识
端口号:用两个字节标识整数,它的取值范围是从 0 ~ 65535;其中,0 ~ 1023 之间的端口号多用于一些知名的网络服务和应用,普通的应用需要使用 1024 以上的端口号。如果端口号被另外一个服务或应用占用,会导致当前程序的启动失败。
协议
协议:计算机网络中,连接和通信的规则被称之为网络通信协议
-
UDP 协议
-
用户数据包协议(User Datagram Protocol)
-
UDP 是 无连接 通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接,简单来说,当一台计算机想另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端收到数据时,也不会像发送端反馈是否接收到数据
-
由于 UDP 协议消耗资源小,通信效率高,所以通常应用于音频、视频和普通数据的传输
-
例如视频会议通常采用 UDP 协议,因为这种情况及时偶尔丢失一两个数据包,也不会对接受结果产生太大的影响,但是在 UDP 协议传输数据时,由于 UDP 协议是面向无连接性,不能保证数据的完整性,所以在传输重要数据的时候不建议使用 UDP 协议
-
-
TCP 协议
-
传输控制协议(Transmission Control Protocol)
-
TCP 协议是 面向连接 的通信协议,即传输数据之前,在发送端和接收端简历逻辑连接,然后在传输数据,他提供了两台计算机之间的 可靠无差错 的数据传输。在 TCP 连接中不需要明确客户端与服务器端,由客户端想服务器端发送连接请求,每次连接的创建都需要经过 “三次握手”
-
三次握手:TCP 协议中,在发送数据的准备阶段,客户端以服务器端的三次交互,以保证连接的可靠
-
第一次:客户端向服务器端发送连接请求,等待服务器端确认
-
第二次:服务器端向客户端会送一个响应,通知客户端接受到了连接请求
-
第三次:客户端再次向服务器端发送确认信息,确认连接
-
-
完成三次握手之后,建立连接,客户端和服务器就可以开始进行数据传输,由于这种 面向连接 的特性,TCP 协议可以保证传输数据的安全,所以应用十分广泛,例如文件的上传、下载、网页的浏览等
-
UDP通讯程序
UDP发送数据
demo:对自己的计算机发送一段字符串
package com.itxs.demo02;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* @Classname : demo01
* @Description : TODO UDP发送数据案例 - 对自己计算机发送一段字符串
* @Author : lin_refuel@qq.com
*/
public class demo01 {
public static void main(String[] args) throws IOException {
// 创建一个发送对象
DatagramSocket ds = new DatagramSocket();
// 把数据进行打包
byte[] bytes = "hello,world".getBytes();// 需要发送的数据
int length = bytes.length;// 数据的长度
InetAddress byName = InetAddress.getByName("127.0.0.1");// 自己电脑的Ip地址
int port = 9527;// 随机写入的一个端口号
DatagramPacket dp = new DatagramPacket(bytes, length, byName, port);
// 另一种写法
//TODO DatagramPacket dp = new DatagramPacket("hello,world".getBytes(),("hello,world".getBytes()).length, InetAddress.getByName("127.0.0.1"),9527);
// 发送数据
ds.send(new DatagramPacket("hello,world".getBytes(),("hello,world".getBytes()).length, InetAddress.getByName("127.0.0.1"),9527));
//ds.send(dp);
// 关闭发送
ds.close();
}
}
UDP接收数据
接收上面发送的数据
package com.itxs.demo02;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* @Classname : demo03
* @Description : TODO UDP - 接收数据
* @Author : lin_refuel@qq.com
*/
public class demo03 {
public static void main(String[] args) throws IOException {
// 创建接收对象
DatagramSocket ds = new DatagramSocket(9527);
// 创建接收数据的包
byte[] bytes = new byte[1024];// 接收的长度为1024个字节
DatagramPacket dp = new DatagramPacket(bytes, bytes.length); // 接收数据的包
// 进行接受
ds.receive(dp);
int length = dp.getLength();// 字符的有效长度进行返回
// 解析数据
System.out.println(new String(bytes,0,length));// 将接收的字节转成字符串串进行输出
// 关闭接收
ds.close();
}
}
UDP发送键盘输入的数据
package com.itxs.demo03;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/**
* @Classname : demo01
* @Description : TODO UDP - 持续发送
* @Author : lin_refuel@qq.com
*/
public class demo01 {
public static void main(String[] args) throws IOException {
// 创建接收对象
DatagramSocket ds = new DatagramSocket();
String line; // 发送的数据
while(true){
System.out.println("请输入发送的内容 - over表示结束发送");
line = new Scanner(System.in).nextLine();
// 判断输入是否为over 如果是结束循环
if(line.equals("over")){
break;
}
// 讲数据进行打包
byte[] bytes = line.getBytes();
InetAddress byName = InetAddress.getByName("127.0.0.1");
int port = 9527; // 发送地址的端口号
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, byName, port);
// 进行发送
ds.send(dp);
}
ds.close();
}
UDP接收键盘上面的数据
package com.itxs.demo03;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* @Classname : demo02
* @Description : TODO 接收键盘上面的内容
* @Author : lin_refuel@qq.com
*/
public class demo02 {
public static void main(String[] args) throws IOException {
// 创建接收对象
DatagramSocket ds = new DatagramSocket(9527);
while(true){
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);// 接收的数据的包
ds.receive(dp);// 接收的数据放入到包里
byte[] data = dp.getData();// 包里面的数据转字节数组
int length = dp.getLength();// 有效数据的长度
String s = new String(data, 0, length);// 转成字符串
System.out.println(s);// 进行输出
}
}
}
TCP通讯
TCP 通信原理
TCP 通信是一种可靠的网络协议,他在通信的两端各创建一个 Scoket 对象,从而在通信的两端形成网络虚拟连接,一旦建立了虚拟的网络连接,两端的程序就可以通过虚拟网络连接进行通信
Java 对基于 TCP 协议的网络提供了良好的封装,使用 Socket 对象来代表两端的通信端口,通过 Socket 产生的 IO 流来进行网络通信,客户端使用 Sokcet 类,而服务器端使用 ServerSocket 类
TCP发送原理
-
发送数据的步骤
-
创建客户端的 Socket 对象 (Socket)
-
获取输出流,写数据
-
释放资源
-
package com.itxs.demo08;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
/**
* @Classname : clientTCP
* @Description : TODO 客户端发送数据
* @Author : lin_refuel@qq.com
*/
public class clientTCP {
public static void main(String[] args) throws IOException {
// 创建一个Socket ,放入一个Ip地址 和 Ip地址里面的端口号
Socket socket = new Socket("127.0.0.1",9527);
// 通过SocKet获取到输出流对象
OutputStream ow = socket.getOutputStream();
// 写入数据并且发送
ow.write("hello,world!".getBytes());
// 关闭socket
socket.close();
}
}
TCP服务器端接收数据
-
接受数据的步骤
-
创建服务器端的 Socket 对象 (ServerSocket)
-
获取输入流,读取数据,处理数据
-
释放资源
-
package com.itxs.demo08;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Classname : serverReceive
* @Description : TODO 服务器端口接收消息
* @Author : lin_refuel@qq.com
*/
public class serverReceive {
public static void main(String[] args) throws IOException {
// 实例化一个服务器对象 设置端口为9527
ServerSocket server1 = new ServerSocket(9527);
// 通过 server1 创建一个接收用的socket对象用于通信
Socket socket = server1.accept();
// socket来获取一个输出流,读取接收的数据
InputStream is = socket.getInputStream();
// 创建一个缓冲区,存放读取的数据
byte[] bytes = new byte[1024];
int length = is.read(bytes);// 读取到数据的长度
// 解析数据
System.out.println("接收到:"+new String(bytes,0,length));
// 关闭流
socket.close();
}
}