IO流,网络编程

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值