文章目录

昨天知识总结

  • 1.转换流
  • 2.多个输入源输出源的组合
  • 3.更换输入源输出源
  • 4.打印流
    • 字节打印流
    • 字符打印流
  • 5.序列流,数据流,内存流
  • 6.Properties
  • 7.序列化流

编码问题

  • 转换流的编码:
  • 常用字符集:
    • 中国的:GBK/GB2312---------2个字节
    • 欧洲的:ISO8859-1---------不支持中文,但是一个汉字对应1个字节
    • 国标:UTF-8---------3个字节
    • 内部编码:unicode------2个字节
    • 美国的:ASCII
  • 编码:由字符串转成byte的过程
  • 解码:由byte转成字符串的过程
  • 乱码:编码与解码的过程中,使用了不同的字符集,造成编码错误,出现了乱码
  • 常见的出现乱码的组合:
    • 使用GBK编码,ISO8859-1解码或者UTF-8编码,ISO8859-1解码
    • 举例:使用GBK编码,UTF-8解码或者UTF-8编码,GBK解码
    public static void main(String[] args) throws IOException {
		//写的时候采用UTF-8编码
		writeData1();
		readData1();//使用utf-8字符集
		readData2();//使用GBK字符集

		//写的时候采用GBK编码
		writeData2();
		readData3();//使用utf-8字符集
		readData4();//使用GBK字符集
	}
	//写出
	//编码格式是utf-8
	public static void writeData1() throws IOException {
		OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("utf8.txt"),"utf-8");
		outputStreamWriter.write("冰冰");
		outputStreamWriter.close();
	}
	//写出
	//编码格式是GBK
	public static void writeData2() throws IOException {
		//创建输出流并关联文件   第一个参数是字节输出流     第二个参数是:输出时指定的编码格式
		OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("GBK.txt"),"GBK");//默认GBK
		outputStreamWriter.write("冰冰");
		outputStreamWriter.close();
	}

	//读入
	//编码格式是utf8
	public static void readData1() throws IOException {
		InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("utf8.txt"),"utf-8");
		char[] arr = new char[100];
		int num = inputStreamReader.read(arr);
		System.out.println("readData1:"+new String(arr,0,num));

		inputStreamReader.close();
	}

	//读入
		//编码格式是GBK
		public static void readData2() throws IOException {
			InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("utf8.txt"),"GBK");//默认utf8
			char[] arr = new char[100];
			int num = inputStreamReader.read(arr);
			System.out.println("readData2:"+new String(arr,0,num));

			inputStreamReader.close();
		}

		//读入
		//编码格式是utf8
		public static void readData3() throws IOException {
			InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("GBK.txt"),"utf-8");
			char[] arr = new char[100];
			int num = inputStreamReader.read(arr);
			System.out.println(new String(arr,0,num));

			inputStreamReader.close();
		}

		//读入
		//编码格式是utf8
		public static void readData4() throws IOException {
			InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("GBK.txt"),"GBK");//默认GBK
			char[] arr = new char[100];
			int num = inputStreamReader.read(arr);
			System.out.println(new String(arr,0,num));

			inputStreamReader.close();
		}
  • 研发中的编码:
  • 说明:GBK,UTF-8是支持中文的,ISO8859-1不支持中文
  • 编码:
  • byte[] getBytes() //对于中文 默认的格式
  • 使用平台的默认字符集将此 String 编码为 byte 序列,
  • 并将结果存储到一个新的 byte 数组中。
  • byte[] getBytes(Charset charset)
  • 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。
  • 解码:
  • String(byte[] bytes) //对于中文 默认是格式
  • 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
  • String(byte[] bytes, Charset charset)
  • 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
public static void main(String[] args) throws UnsupportedEncodingException {
		//使用GBK编码解码
		String s1 = "你好";
		byte[] bs1 = s1.getBytes("GBK");//编码
		System.out.println(new String(bs1,"GBK"));
		System.out.println(Arrays.toString(bs1));
		//使用UTF-8编码解码
		String s2 = "你好";
		byte[] bs2 = s1.getBytes("UTF-8");//编码
		System.out.println(new String(bs2,"UTF-8"));
		System.out.println(Arrays.toString(bs2));
		//使用ISO8859-1编码解码
		String s3 = "你好";
		byte[] bs3 = s1.getBytes("ISO8859-8");//编码
		System.out.println(new String(bs3,"ISO8859-8"));
		System.out.println(Arrays.toString(bs3));
	}

解决乱码

  • 解决乱码:
  • 出现的情况:编码与解码字符集不一样
  • 解决方法:通过再编码再解码解决乱码,但是实在保证第一次编码没有问题的前提下
    java第22天----编码问题,网络通信,TCP,-LMLPHP
  • 是否可以采用在编码再解码解决

java第22天----编码问题,网络通信,TCP,-LMLPHP

	public static void main(String[] args) throws UnsupportedEncodingException {
		//1.GBK编码    UTF-8解码
//		String s1 = "你好";
//		byte[] bs1 = s1.getBytes("GBK");
//		String strbs1 = new String(bs1, "utf-8");
//		System.out.println("utf8解码:"+strbs1);//utf8解码:���
//		
//		//再编码
//		byte[] bs11 = strbs1.getBytes("utf-8");
//		//再解码
//		System.out.println(new String(bs11,"GBK"));//锟斤拷锟�

		//2.GBK编码         ISO8859-1解码
//		String s1 = "你好";
//		byte[] s1b = s1.getBytes("GBK");
//		String sr1b = new String(s1b,"ISO8859-1");
//		System.out.println("ISO8859-1解码:"+sr1b);//????
//		
//		//再编码
//		byte[] s1bb = sr1b.getBytes("ISO8859-1");
//		//再解码
//		System.out.println("GBK再编码:"+new String(s1bb,"GBK"));//你好

		//3.utf8编码         GBK解码
		String s1 = "你好啊";
		byte[] s1b = s1.getBytes("utf-8");
		String sr1b = new String(s1b,"GBK");
		System.out.println("GBK解码:"+sr1b);//浣犲ソ鍙?

		//再编码
		byte[] s1bb = sr1b.getBytes("GBK");
		//再解码
		System.out.println("utf8再编码:"+new String(s1bb,"utf-8"));//你好??
		//4.utf8编码         ISO8859-1解码
//		String s1 = "你好号";
//		byte[] s1b = s1.getBytes("utf-8");
//		String sr1b = new String(s1b,"ISO8859-1");
//		System.out.println("ISO8859-1解码:"+sr1b);//????????·
//		
//		//再编码
//		byte[] s1bb = sr1b.getBytes("ISO8859-1");
//		//再解码
//		System.out.println("utf8再编码:"+new String(s1bb,"utf-8"));//你好号
	}

网络通信

  • 网络编程的基础
  • 网络的通信:三要素:协议,IP,端口
  • 1.IP:在网络上惟一的标记一台主机127.0.0.1:保留地址,本地地址javajiang IP面向对象了形成的类叫InetAddress
  • 2.端口:区分一台主机上的多个服务区,取值范围为(0,65535)注意:在通信时要保证客户和服务器端使用的端口号一致
  • 3.协议:制定的一个统一的标准
    java第22天----编码问题,网络通信,TCP,-LMLPHP

七层协议

  • 七层协议:

  • 应用层:与其他计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如:一个没有通讯功能的自处理程序就不能执行通信代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第七层。

  • 示例:TELNET HTTP FTP NFS SMTP等。

  • 表示层

  • 这一层的主要功能是定义数据格式及加密,例如,FTP允许比选择以二进制或ASCII格式传输,如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASCII格式,发送放将把文本从发送方的字符集转换成标准的ASCII后发送数据。在接受方将标准的ASCII转换成接收方计算机的字符集。

    • 实例:加密,ASCII等
  • 会话层:

  • 他定义了如何开始。控制和结束一个回话,包括对多个双向消息的控制和管理,一遍在只完成连续消息的一部分是可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。、

    • 实例RPC,SQL等
  • 传输层

  • 这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在统一主机上对不同应用的数据流的输入进行服用,还包括对收到的顺序不对的数据包的重新排序功能,

    • 示例:TCP,UDP,SXP。
  • 网络层

  • 这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,
    网络层还定义了如何将一个包分解成更小的包的分段方法。

  • 示例:IP,IPX等。

  • 数据链路层
    它定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。

    • 示例:ATM,FDDI等。
  • 物理层

  • OSI的物理层规范是有关传输介质的特性标准,这些规范通常也参考了其他组织制定的标准。连接头、帧、帧的使用、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。

  • 示例:Rj45,802.3等

获取主机

    public static void main(String[] args) throws UnknownHostException {
		//IP地址:java面向对象后形成的类InetAddress
		//获取自己的主机
		InetAddress address1 = InetAddress.getLocalHost();
		System.out.println(address1.getHostName());
		System.out.println(address1.getHostAddress());

		//获取网络上任意一台主机
		InetAddress address2 = InetAddress.getByName("www.baidu.com");//域名
		System.out.println(address2.getHostName());
		System.out.println(address2.getHostAddress());
	}

TCP/UDP

  • 网络通信之Socket通信:TCP/UDP
  • TCP与UDP通信的区别:
  • TCP与UDP通信的区别:
  • 客户端(app/浏览器)
  • 服务器端:!=主机
  • 端口号:同一台主机上的每一个服务器的都拥有自己的端口号,取值范围(0,65535),常用的端口:80,8080
  • 注意点:
    • 1.要保证客户端和服务器端的端口号一致
    • 2.要保证同一台主机上的不同服务器端口号不同

UDP

  • 客户端
  • 实现过程:
    • 1.创建UDP通信的对象----socket对象,对应的类是DatagramSocket(用于UDP通信数据的发送与接收)
    • 2.数据的封装–装包(打包),DatagramPacket(数据包,包括相关的属性,数据等)
    • 3.发送–调用send方法发送
    • 4.关闭资源
    public static void main(String[] args) throws IOException {
//		 * 1.创建UDP通信的对象----socket对象,对应的类是DatagramSocket(用于UDP通信数据的发送与接收)
		DatagramSocket datagramSocket = new DatagramSocket();
//		 * 2.数据的封装--装包(打包),DatagramPacket(数据包,包括相关的属性,数据等)
		/*
		 * 第一个参数:包的内容
		 * 第二个参数:数据的长度
		 * 第三个参数:副武器的主机对象
		 * 第四个参数:服务器的端口
		 */
		byte[] buf = "bingbing".getBytes();
		DatagramPacket datagramPacket = new DatagramPacket(buf,buf.length, InetAddress.getLocalHost(),20000);//端口与服务器一致
//		 * 3.发送--调用send方法
		datagramSocket.send(datagramPacket);
//		 * 4.关闭资源
		datagramSocket.close();
	}
  • 服务器端----接受数据
  • 1.创建socket对象,绑定端口
  • 2.创建包对象,创建空数组,准备接受传过来的数据
  • 3.接收数据
  • 4.关闭资源
	public static void main(String[] args) throws IOException {
//		 * 1.创建socket对象
		DatagramSocket Socket = new DatagramSocket(20000);
//		 * 2.创建包对象,创建空数组,准备接受传过来的数据
		byte[] buf = new byte[1024];
		DatagramPacket Packet = new DatagramPacket(buf, buf.length);
//		 * 3.接收数据--当服务器运转起来,这个方法会一致处于坚挺状态。
		Socket.receive(Packet);

		//将数据从包中取出
		byte[] arr = Packet.getData();
		System.out.println(new String(arr));
//		 * 4.关闭资源
		Socket.close();
	}

TCP

  • 客户端
  • 在用户端与服务器端通信的时候,对于客户端既要进行输入又要进行输出,所以Socket对象的内部就内置了输入流和输出流
  • 当进行数据传输的时候,将数据放入socket对象的内部,将socket对象传到服务器端,相当于在客户端与服务器端建立了一个通道,
  • 两者使用同一个socket对象。
    java第22天----编码问题,网络通信,TCP,-LMLPHP
	public static void main(String[] args) throws UnknownHostException, IOException {
		//1.创建Socket对象,并绑定服务器的端口和主机地址
		Socket socket = new Socket(InetAddress.getLocalHost(),30000);
		//2.准备数据
		String data = "BigData1715,你好";
		//3.获取Socket对象内部的输出流
		OutputStream outputStream = socket.getOutputStream();
		//4.将数据写入网络
		outputStream.write(data.getBytes());

		//接收从服务器回传的数据
		InputStream inputStream = socket.getInputStream();
		byte[] bs = new byte[103];
		int num = 0;
		num = inputStream.read(bs);
		System.out.println(new String(bs,0,num));

		//数据的关闭
		outputStream.close();
		socket.close();

	}
  • 服务器端
	public static void main(String[] args) throws IOException {
		//1.创建ServerSocket对象并绑定端口
		ServerSocket serverSocket = new ServerSocket(30000);
		//2.接收套接字---socket对象accept()方法会一直处于监听状态
		Socket socket = serverSocket.accept();
		//3.获取输入流
		InputStream inputStream = socket.getInputStream();
		//4.将内容写到控制台
		byte[] bs = new byte[3];
		int num = 0;
		num = inputStream.read(bs);
		System.out.println(new String(bs,0,num));
//		while((num = inputStream.read(bs))!= -1) {
//			System.out.print(new String(bs,0,num));
//		}
		System.out.println("qersadfseara");
		//完成数据的回传
		OutputStream outputStream = socket.getOutputStream();
		outputStream.write("你好,BigData1715".getBytes());
		//5.关闭流
		outputStream.close();
		serverSocket.close();

	}
10-05 11:50