IO流和网络编程
IO流
IO流根据流的类型分为两种:
一种是输入流,另一种是输出流
输入流只能用来读取数据,输出流只能用来写入数据。
IO流存在两种操作文件类型:
字节流和字符流
字符流只能用于纯文本操作,而字节流较为全面,可以用于视频、文本等操作
字节流一次只能读取一个byte,字符流一次可以读取多个byte
字节流:
FileOutputStream
FileInputStream
字符流:
Reader
Writer
为了满足更多的需求,还创建了一种缓冲流,如字符缓冲流、字节缓冲流
例:
BufferFileOutputStream
BufferFileInputStream
缓冲流的存在是为了能够处理更多的数据,在数据与对象传输数据时读取一块空间,不断存入数据,以便能够一次性处理更多的数据,提高程序的效率。
字节流代码示例:
//使用字节流进行简单的文件拷贝
public class filethree {
public static void main(String[] args) throws IOException {
FileInputStream f =new FileInputStream("start\\a.txt");
FileOutputStream ff =new FileOutputStream("start\\c.txt");
int aa;
while((aa=f.read())!=-1){
ff.write(aa);
}
ff.close();
f.close();
}
}
//一次性读取多个字节
public class filefive {
public static void main(String[] args) throws IOException {
long start =System.currentTimeMillis();
FileInputStream f=new FileInputStream("start\\a.txt");
FileOutputStream ff=new FileOutputStream("start\\c.txt");
int len;
byte[] bytes=new byte[1024*1024*5];
while((len=f.read())!=-1){
ff.write(bytes,0,len);
}
f.close();
ff.close();
long end=System.currentTimeMillis();
System.out.println(end-start);
}
}
字符流代码示例:
public class ReadFileExample {
public static void main(String[] args) {
try (Reader reader = new FileReader("example.txt","utf-8")) {
char[] buffer = new char[1024];
int length;
while ((length = reader.read(buffer)) != -1) {
String str = new String(buffer, 0, length);
System.out.print(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class WriteFileExample {
public static void main(String[] args) {
String content = "这是要写入文件的内容";
try (Writer writer = new FileWriter("example.txt")) {
writer.write(content);
} catch (IOException e) {
e.printStackTrace();
}
}
缓冲流代码示例:
public static void main(String[] args) throws IOException {
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("start\\a.txt"));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("start\\c.txt"));
byte[] bytes=new byte[2];
int len;
while((len=bis.read())!=-1){
bos.write(bytes,0,len);
}
bos.close();
bis.close();
}
}
网络编程
网络编程就是计算机和计算机之间通过网络进行数据传输
网络编程的三要素
IP | 端口号 | 协议 |
每一台电脑都有着独属于自己的IP地址
IP地址和端口号是计算机网络中的重要概念,它们用于在网络上唯一标识一个通信实体或进程。
IP地址是指互联网协议地址,它是由32位二进制数表示的,通常使用点分十进制数表示。IP地址的作用是用来标识网络上的设备,类似于电话号码,可以用来进行网络通信。在通信过程中,源设备通过IP地址找到目的设备,然后发送数据。
端口号则是指在一个设备中运行的应用程序的标识符,它是一个16位的整数(0~65535)。每个端口号都对应着一个特定的应用程序,例如HTTP应用使用80端口,FTP应用使用21端口等。在通信过程中,源设备通过端口号找到目的设备上的特定应用程序,然后将数据传送给它。
IP地址和端口号的组合可以唯一地标识一个通信实体或进程,因此在进行网络通信时,需要同时指定通信双方的IP地址和端口号。
当用户在浏览器中输入域名时,浏览器会向DNS服务器发送请求,以获取对应的IP地址。因此,域名与IP地址是一一对应的关系。从技术上来说,一个域名可以对应多个IP地址,这是为了实现负载均衡和故障转移等目的,但通常情况下,一个域名只对应一个IP地址。
而端口号则用于标识设备中运行的具体应用程序。同一个设备上运行的不同应用程序会使用不同的端口号进行区分。在进行网络通信时,源设备通过IP地址和端口号找到目标设备上特定的应用程序,然后将数据传送给它。
协议:
TCP和UDP
在服务器之间进行数据传送时,TCP的速度慢于UDP,但是UDP在传输过程中不会管理数据,会导致传输完成后有大量包丢失,而TCP虽然速度稍慢与UDP,但是其具有高安全性,丢失的数据少,目前使用的范围更广
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的传输层协议。它在互联网上广泛应用于数据传输中,例如 HTTP、FTP 等应用层协议都是基于 TCP 协议工作的。
TCP 协议的主要特点包括:
- 面向连接:在进行数据通信前,需要先通过三次握手建立连接,连接成功后才能进行数据传输。
- 可靠性:TCP 提供可靠的数据传输,这是通过利用确认、重传等机制来实现的。
- 拥塞控制:TCP 通过拥塞窗口、慢启动以及拥塞避免等机制来有效地控制网络拥塞。
- 流量控制:TCP 通过滑动窗口机制来实现流量控制,保证数据接收方不会被发送方的数据淹没。
TCP 协议的通信过程分为三个阶段:建立连接、数据传输和断开连接。建立连接时,客户端向服务端发送 SYN 报文,服务端收到后回复一个 SYN+ACK 报文,客户端再向服务端发送一个 ACK 报文,这个过程就是三次握手。之后就可以进行数据传输,数据传输完毕后,双方可以通过四次挥手的方式来断开连接。
常见的TCP协议
- HTTP(Hypertext Transfer Protocol,超文本传输协议):用于在客户端和服务器之间传输超文本、图片、音频、视频等各种类型的数据。
- HTTPS(Hypertext Transfer Protocol Secure,安全的超文本传输协议):是基于 SSL/TLS 加密传输的 HTTP 协议,可以保证在网络传输过程中的数据安全。
- FTP(File Transfer Protocol,文件传输协议):用于在网络上进行文件传输。
- SMTP(Simple Mail Transfer Protocol,简单邮件传输协议):用于发送电子邮件。
- POP3(Post Office Protocol version 3,邮局协议第3版):用于接收电子邮件。
- IMAP(Internet Message Access Protocol,Internet消息访问协议):也是用于接收电子邮件的协议,相比 POP3 具有更多的功能。
- DNS(Domain Name System,域名系统):将域名解析成 IP 地址。
- Telnet:用于远程登录到其他计算机。
除此之外,实验室的学长进行了服务器创建教学,教会了我们如何手敲一个简单的服务器
服务器发送端代码:
public class Net2 {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket();
Scanner sc=new Scanner(System.in);
while (true) {
System.out.println("请输入要说的话");
String str=sc.nextLine();
if("886".equals(str)){
break;
}
byte[] bytes=str.getBytes();
InetAddress address=InetAddress.getByName("127.0.0.1");
int port=10086;
DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port);
ds.send(dp);
}
}
}
服务器接收端代码:
public class MyNet2 {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket(10086);
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
while (true) {
ds.receive(dp);
byte[] data=dp.getData();
int len=dp.getLength();
String ip=dp.getAddress().getHostAddress();
String name=dp.getAddress().getHostName();
System.out.println(ip+name+new String(data,0,len));
}
}
}