网络编程三要素
* ip地址
* 端口
* 协议
InetAddress类
* java操作ip地址的类
* 获取对象
*InetAddress address = InetAddress.getByName(String arg);
* 参数arg可以是字符串主机名,例如:"fanshoujun"
* 参数arg可以是字符串ip地址,例如:"192.168.126.1"
* 常用方法
* getHostName();//获取主机名
* getHostAddress();//获取字符串ip地址
协议
* UDP
* 将数据源和目的地封装在包中,不需要建立连接
* 每个数据包的大小限制在64k
* 因为不建立连接,所以是不可靠协议
* 因为不建立连接,所以速度快
* TCP
* 建立连接,形成数据传输的通道
* 通过三次握手完成连接
* 因为建立连接,所以可靠
* 因为建立连接,所以速度稍慢
Socket
* 也叫套接字
* ip地址和端口组合在一起叫套接字
* socket通信原理
* 通信两端都有socket
* 网络通信其实就是socket之间的通信
* 数据在两个socket之间某种协议下通过io传输
UDP发送数据
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* UDP发送数据
* @author fanshoujun
*/
@Test
public void sendMessage() throws Exception {
//创建socket对象
DatagramSocket socket = new DatagramSocket();
//要发送的数据
byte[] bys = "hello world".getBytes();
//数据的长度
int len = bys.length;
//目的地ip地址
InetAddress address = InetAddress.getByName("fanshoujun");
//目的地端口
int port = 10000;
//将数据打包
DatagramPacket pack = new DatagramPacket(bys, len, address, port);
//发送数据包
socket.send(pack);
//关闭通道
socket.close();
}
UDP接收数据
@Test
public void receiveMessage() throws Exception {
//创建socket对象,参数为端口
DatagramSocket socket = new DatagramSocket(10000);
//定义数组存储数据
byte[] bys = new byte[1024];
//数组的长度
int len = bys.length;
//定义数据包用于接收数据,实际存储数据的是数组bys,长度是len
DatagramPacket pack = new DatagramPacket(bys, len);
//接收数据
socket.receive(pack);
//从接收的数据中获取发送端的地址
InetAddress address = pack.getAddress();
//将发送端的地址转成String
String ip = address.getHostAddress();
//从数据包中取出数据
byte[] data = pack.getData();
//数据的长度
int length = pack.getLength();
//将数据转成String
String str = new String(data,0,len);
//打印出来
System.out.println(ip+":"+str+":"+length);
}
TCP发送数据
@Test
public void sendMessage() throws Exception {
// 建立客户端socket服务
Socket socket = new Socket("192.168.25.1", 8888);
// 获取输出流流对象(这个步骤只要一执行就开始三次握手)
OutputStream outputStream = socket.getOutputStream();
// 发送消息
outputStream.write("发送消息了...".getBytes());
// 关闭资源
socket.close();
}
TCP接收数据
@Test
public void receiveMessage() throws Exception {
//建立服务端对象,监听一个端口
ServerSocket serverSocket = new ServerSocket(8888);
//通过accept方法获取客户端对象
Socket socket = serverSocket.accept();
//获取输入流
InputStream inputStream = socket.getInputStream();
//接受数据
byte[] bys = new byte[1024];
int len = inputStream.read(bys);
String message = new String(bys,0,len);
System.out.println(message);
//关闭资源
socket.close();
serverSocket.close();
}
网络七层