网络编程:
用于不同的计算之间进行数据传输
网络编程三要素
IP:设备在网络中的唯一标识
端口:应用在设备的唯一标识
协议:数据传输所要遵循的规范
注意:网络编程本质上就是应用和应用之间的数据传输
IP是可以发生变化(换了一个地方联网)
IP分为四部分,前三部分叫做网段(标识所在区域),最后一部分为主机号
协议常用UDP,TCP
Java提供了对IP地址操作的类InetAddress
static InetAddress getByName(String host) 确定主机名称的IP地址,主机名称可以是机器名称,也可以是Ip地址
String getHostName() 获取此IP地址的主机名
String getHostAddress() 返回IP地址的字符串
UPD接收端
1.创建对象 监听端口号
new DatagramSocket(int port)
2.创建数据包用于接收数据
new byte[1024];
new DatagramePacket(byte[] bytes,int length);
3.调用receive()
DatagramSocket对象.receive(DatagramePacket对象)
4.关闭
DatagramSocket对象.close();
UPD发送端
1.创建对象
new DatagramSocket()
2.创建数据 把数据打成数据包,参数还需要ip,port
"Hello,UDP".getBytes();
new DatagramePacket(byte[] bytes,int length,ip,port);
3.调用send();
DatagramSocket对象.send(DatagramePacket对象)
4.关闭
DatagramSocket对象.close();
注意:如果一个类想要实现发送和接收,当前new DatagramSocket对象需要监听端口号
发送数据时,指定的端口号,是接收所需要监听的端口号
TCP客户端
1.创建对象
new Socket(String host,int port)
2.创建流 准备数据
"hello,tcp"。getBytes()
Socket对象.getOutputStream();
3.调用write()
IO流对象.write(字节数组)
4.关闭
Socket对象.close()
TCP服务端
1.创建对象
new ServerSocket(int port);
2.监听端口号 获取Socket对象
Socket socket=ServerSocket对象.accept();
3.获取流的对象
socket.getInputStream();
4.调用read();
IO对象.read()
5.关闭
ServerSocket.close();
TCP中循环接收数据时阻塞问题:read()阻塞程序的执行
阻塞出现的原因:
发送的数据,循环读取,read()不能判断当前数据发送结束,所以read每读取一次数据都回去阻塞当前程序的运行,等待下一次数据的输入
如何解决:发送数据之后,socket调用shutDownOutput() 关闭发送流
注意:调用shutDownOutput可能会出现问题
如果需要循环发送和接收时,不能调用shutDownOutput,因为调用之后会把发送流关闭,之后不能在实现循环发送
如何解决:客户端和服务端约定数据的大小,new byte[大于约定的大小]