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));}}
}