一 网络基础
网络通信三要素:
- IP
- 端口号
- 协议
IP地址的本质:是一个由32位的二进制数据组成的数据,为了方便记忆IP地址就把IP地址切成了4份,每份8bit。
1.1 InetAddress(IP类)
常用方法:
getLocalHost();//获取本机的IP地址对象
getHostAddress(); //返回一个IP地址的字符串表示形式
getHostName();//获取主机名
getByName("IP或者主机名");//根据IP地址的字符串形式或者主机名生成一个IP地址对象----很常用
1.2 端口 —- 端口就是一个(0-65535)标识符
1.3 通讯协议
通讯协议分为两种:
UDP通讯协议
TCP通讯协议
二 UDP
特点:
- 将数据封装为数据包,面向无连接。
- 每个数据包大小限制在64K中
- 因为无链接,所以不可靠,速度快。
使用示例:
//发送端代码
public class Sender{
public static void main(String[] args)
{
//建立udp服务
DatagramSocket datagramSocket = new DatagramSocket();
String data = @"upd的数据";
//把数据封装到数据包中 DatagramPacket(buf, length, address) buf:发送的数据内容 length:发送数据内容的大小 address:发送目的IP地址对象 port:端口号
DatagramPacket packet = new DatagramPacket(data.getBytes(),data.getBytes().length,InetAddress.getLocalHost(),9091);
//发送数据包
datagramSocket.send(packet);
//关闭资源
datagramSocket.close();
}
}
----------
//接收端代码
public class Receive {
public static void main(String[] args)
{
//建立udp服务,并且监听一个端口
DatagramSocket socket = new DatagramSocket(9091);
//准备空的数据包用于存放数据
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf,buf.length);
//接收数据 数据实际上存储在buf数组中 receive是一个阻塞型方法,没有接收到数据就一直阻塞
socket.receive(packet);
//取出数据
String data = new String(buf,0,packet.getLength());//getLength() 获取数据包存储了几个字节
//关闭资源
socket.close();
}
}
注意:
每个网络程序都有自己所处理的特定格式的数据,如果接收到的数据不符合指定的格式,那么就会被当成垃圾数据丢弃。
udp协议中,有一个IP地址称作为广播地址(就是主机号为255的地址–xxx.xxx.xx.255),给广播IP地址发送消息的时候,在同一个网络段的机器都可以接收到信息。
三 TCP
特点:
- tcp是基于IO流进行数据传输的,面向连接。
- tcp进行数据传输的时候是没有大小限制的。
- tcp通过三次握手的机制。
- tcp是面向连接的,所以速度慢。
- tcp是区分客户端与服务端的
使用示例:
//客户端代码
public class Client{
public static void main(String[] args)
{
//建立连接
Socket socket = new Socket(InetAddress.getLocalHost(),9090);
//获取输出流
OutputStream os = socket.getOutPutStream();
//向服务端发送数据
os.write("这是客户端的数据".getBytes());
//关闭资源
socket.close();//因为os是从socket中获取的,所以socket关闭的时候os也关闭了
}
}
----------
//服务端代码
public class Server{
public static void main(String[] args)
{
//建立tcp的服务端,并且监听一个端口
ServerSocket serverSocket = new ServerSocket(9090);
//接受客户端的连接
Socket socket = serverSocket.accept();//accept() 这是一个阻塞型的方法,没有客户端与其连接时,会一直等待下去
//获取输入流对象,读取客户端发送的内容
InputStream is = socket.getInputStream();
byte[] buf = new byte[1024];
int length = is.read(buf);
System.out.println("接收到的数据:"+new String(buf,0,length));
serverSocket.close();//因为socket是从serverSocket中获取的,所以serverSocket关闭的时候socket也关闭了
}
}