文章目录
昨天知识总结
- 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));
}
解决乱码
- 解决乱码:
- 出现的情况:编码与解码字符集不一样
- 解决方法:通过再编码再解码解决乱码,但是实在保证第一次编码没有问题的前提下
- 是否可以采用在编码再解码解决
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.协议:制定的一个统一的标准
七层协议
七层协议:
应用层:与其他计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如:一个没有通讯功能的自处理程序就不能执行通信代码,从事字处理工作的程序员也不关心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对象。
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();
}