IO流
文件在计算机中的输入输出是以内存为参考的,从硬盘中获取文件到内存则为输入我们需要输入流
输入流分为字节输入流,字符输入流,字节输入缓冲流,字符输入缓冲流
这四种输入方式:
FileInputStream
FileReader
BufferedInputStream
上面上种方法都是通过read();来完成数据的输入,我们可以通过创建byte数组的形式提高输入效率,BufferedInputStream自带缓冲数组
BufferedReader
字符输入缓冲流readLine();方法
newLine();方法
输出流分为字节输出流,字符输出流,字节输出缓冲流,字符输出缓冲流
这四种输入方式:
FileOutputStream
FileWriter
BufferedOutputStream
BufferedWriter
上面上种方法都是通过write();来完成数据的输出
网络编程三要素
1.协议
两个在与网络情况下的计算机数据传递,都需要对应的协议来完成
2.ip地址
Internet Protocol Address
当前计算机在网络中的一个地址编号,类似于手机号码
IPv4是一个32位二进制数
IPv6是128位地址长度16字节一组
3.端口号
端口号是当前应用程序在计算机中的一个编号
端口号是一个short类型0~65535
0~1024不能用于自定义端口号使用,特定的系统端口号
IP类
SUN提供给开发使用的ip地址类
InetAddress
常用方法:InetAddress getLocalhost();
获取本机ip地址类对象
InetAddress getByName(String name);
根据指定主机名获取对应的ip地址类对象
InetAddress[] getAllByName(String name);
根据指定主机名获取对应的所有ip地址类对象
package com.qfedu.a_ip;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Demo1 {
public static void main(String[] args) throws UnknownHostException {
InetAddress localHost = InetAddress.getByName("192.168.0.104");
InetAddress localHost2 = InetAddress.getLocalHost();
System.out.println(localHost);
System.out.println(localHost2);
InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com");
for (InetAddress inetAddress : allByName) {
System.out.println(inetAddress);
/*
* 运行结果
* /192.168.0.104
DESKTOP-CJTLEAD/192.168.0.104
www.baidu.com/39.156.66.18
www.baidu.com/39.156.66.14
*
*
*
* */
}
}
}
UDP数据传输方式
User Datagram Protocol
数据传递采用数据包方式传递,所有的数据要进行打包操作,并且没有对应的客户服务器概念,只有发送端和接收端
Socket 套接字
数据需要进行传递操作,在数据传递中的两台计算机必须有对应的Socket,那么必须有一个UDP协议的Socket
发送端 DatagramSocket();
创建一个发送端UDP协议Socket对象
接收端 DatagramSocket(int port);
创建一个接收端UDP协议的Socket对象,这里需要监听
发送端数据包的打包方法:
DatagramPacket DatagramPacket(byte buf[],int length,InetAddress address, int port);
buf:需要传递数据的字节数组
length:是当前字节数组中数据容量字节数
address:接收端ip地址对象
port:接收端对应端口号
接收端数据包接收方式:
DatagramPacket DatagramPacket(byte buf[],int length);
buf:字节缓冲数组,通常是1024整数倍
length:缓冲数组容量
个人总结:
UDP进行数据的传输,是不可靠的,当传输的数据过多或网络带宽不好的情况下会造成数据丢失
UDP传输分为:发送端和接收端
发送端:1.创建DatagramSocket对象
2.创建一个DatagramPacket对象指定发送的字节数组,字节数组长度,接收端的id地址,端口号
3.调用DatagramSocket对象的send方法发送DatagramPacket对象
4.关闭DatagramSocket对象
接收端:
1.创建DatagramSocket对象,指定监听端口,发送端包中的接口
2.创建一个空包DatagramPacket对象,指定一个空的字节数组,和缓冲数组的容量
3.调用DatagramSocket对象的receive方法
4.关闭DatagramSocket对象
代码演示
package com.qfedu.b_udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import com.qfedu.d_filedown.NewServer2;
public class ReceiveDemo4 {
public static void main(String[] args) throws IOException {
System.out.println("接收端启动完毕---------------------------");
DatagramSocket socket = new DatagramSocket(4399);
byte[] buf = new byte[1024];
//包长度为包内字节数组的长度
DatagramPacket packet = new DatagramPacket(buf,buf.length );
System.out.println(packet.getLength());
socket.receive(packet);
int length = packet.getLength();
System.out.println(new String(buf,0,length));
socket.close();
}
}
package com.qfedu.b_udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class SendDemo4 {
public static void main(String[] args) throws IOException {
System.out.println("发送端启动完毕---------------------");
DatagramSocket socket = new DatagramSocket();
DatagramPacket packet = new DatagramPacket("你是个憨憨。。。。。".getBytes(), "你是个憨憨。。。。。".getBytes().length, InetAddress.getLocalHost(), 4399);
socket.send(packet);
socket.close();
}
}
TCP概述
TCP相对于UDP比较稳定的传输协议,这里三次握手,保证连接状态,同时有明确的客户端和服务器之分
tcp服务中需要服务器端先启动,需要监听指定端口,等待客户端连接
客户端主动连接服务器,和服务器连接以后才可以进行数据交互,服务器不能主动链接客户端
TCP操作而言,java中提供了亮哥Socket
1.服务器Socket
java.net.ServerSocket;
创建对应的ServerSocket开启服务器,等待客户端链接
2.客户端Socket
java.net.Socket
创建客户端Scoket,并且连接服务器,同时将Socket发送给服务器绑定注册
Socket客户端Socket
给客户端提供数据传输的符合TCP/IP要求的Socket对象
构造方法:
Socket(String host,int port);
host是服务器IP地址,port是对应服务器程序的端口号
通过指定的服务器ip地址和端口号,获取TCP链接对象
成员方法:Method
InputStream getInputStream();
获取Socket对象的输入字节流,可以从服务器获取对应的数据,InputStream程序退出时关闭
read
OutputStream getOutputStream();
获取Socket对象的输出字节流,可以发送数据给服务器,OutputStream是一个资源,需要在程序退出是关闭
write
void close();
关闭客户端
void shutdownOutput();
禁止当前Socket发送数据
ServerSocket服务端Socket
在服务器开启Socket服务器
构造方法Constructor
ServerSocket(int port);
开启ServerSocket服务器,并且明确当前服务的端口是谁
成员方法:
Socket accept();
监听并且链接,得到一个Socket对象,同时该方法是一个阻塞方法,会处于一个始终监听的状态
返回的是Socket,也就是客户端Socket对象,获取到当前对象Socket对象,相当于获得了客户端链接,同时使用的Socket和客户端一致
代码演示
package com.qfedu.d_filedown;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server1 {
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException {
ServerSocket socket1 = new ServerSocket(9999);
Socket socket = socket1.accept();
InputStream inputStream = socket.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream(new File("D:/aaa/aaaa/hua1.mp3"));
byte[] buf = new byte[1024 * 8];
int length = -1;
while((length = inputStream.read(buf)) != -1) {
fileOutputStream.write(buf,0,length);
}
fileOutputStream.close();
socket.close();
}
}
package com.qfedu.d_filedown;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client1 {
@SuppressWarnings("resource")
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
OutputStream outputStream = socket.getOutputStream();
FileInputStream fileInputStream = new FileInputStream(new File("D:/aaa/画.mp3"));
byte[] buf= new byte[1027 * 8];
int length = -1;
while((length = fileInputStream.read(buf))!=-1) {
outputStream.write(buf,0,length);
}
fileInputStream.close();
socket.close();
}
}