网络模型:OSI ( Open System Interconnection) TCP/IP{
物理层:物理设备标准 主机至网络层
数据链路层:MAC地址封装解封装
网络层:IP地址封装解封装 网际层
传输层:协议,端口号 传输层
会话层:建立数据传输通道
表示层:对数据解析 应用层
应用层:终端应用
}
DNS解析:配置文件,存储的是网址与IP地址。输入网址后查询该文件,找到IP地址,然后进行连接。
本地有该文件,则先获取本地,在获取互联网上。
UDP协议{
特点:
1.将数据及源和目的封装到数据包,不需要建立连接,每个数据包限制在64k
2.因为不需要实时连接,所以是不可靠的协议,速度快
用到的类:DatagramSocket:用来传输接收数据包 DatagramPacket:用来将数据封装成数据包
练习:
发送端,接收端的运行顺序不需要限定
/** * 建立一个发送数据的端口 * *思路: * 1.有一个发送数据包的发送端 * 2.有将数据进行打包的对象,并且制定发送的目的 * 3.通过发送端将数据包发送出去 * *步骤: * 1.建立发送端对象 * 2.创建发送的缓冲区,从键盘上读取数据 * 3.建立一个循环,读取键盘内容,并发送 * 3.建立数据包对象,指定接收端的地址,端口号,以及发送的数据 * 4.定义一个循环结束的标记,读到该标记就结束循环 * 5.关闭资源 * @param args * @throws IOException */ public static void main(String[] args) throws IOException { DatagramSocket sender = new DatagramSocket(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while((line=br.readLine()) != null){ while(line.equals("over")) break; DatagramPacket data = new DatagramPacket(line.getBytes(), 0, line.length(),InetAddress.getLocalHost(), 8090); sender.send(data); } sender.close(); }
/** * 建立一个接受数据的端口 * *思路: * 1.有一个接受数据包的接收端 * 2.有接收数据包的对象,并将数据进行解析 * 3.将接收到的数据打印 * *步骤: * 1.建立接收端对象,指定端口号 * 2.创建接收对象的对象,用于解析数据 * 3.建立一个循环, * 3.接收发送端的内容, * 5.关闭资源 * @param args * @throws IOException * @throws IOException */ public static void main(String[] args) throws IOException { DatagramSocket receiver = new DatagramSocket(8090); byte[] buf = new byte[1024]; DatagramPacket dataRe = new DatagramPacket(buf, buf.length); while(true){ receiver.receive(dataRe); System.out.println(new String(dataRe.getData(),0,dataRe.getLength())); } }
}
TCP协议{
特点;
1.建立连接,形成传输数据的通道,能进行大数据量传输
2.实时连接(三次握手完成),可靠的协议,效率较低
用到的类:Socket:客户端 ServerSocket:服务端
练习:
}必须先运行服务端,再运行客户端
/** * 建立一个服务端,与客户端联系 * * 思路: * 1.需要一个服务端对象,指定端口号,用于被客户端连接 * 2.利用方法连接客户端 * 3.获取客户端的流对象,以及发送的数据 * 4.再次获取客户端的流对象,发送数据 * 步骤: * 1.创建一个服务端对象,指定端口号, * 2.连接客户端 * 3.获取客户端输入流对象,读取数据 * 4.将数据打印, * 5.获取客户端输出流对象,写出数据 * 6.关闭资源 * * @param args * @throws IOException */ public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(9090); Socket so = server.accept(); InputStream is = so.getInputStream(); byte[] buf = new byte[1024]; int len = is.read(buf); System.out.println(new String(buf, 0, len)); OutputStream os = so.getOutputStream(); os.write("收到".getBytes()); server.close(); so.close(); }
/** * 有一个客户端,用来与服务端进行通信 * * 思路: * 1.创建一客户端,指定服务端地址,端口,与其进行通信 * 2.利用输出流往外写数据 * 3.利用输入流读取服务端发送过来的数据 * * 步骤: * 1.创建一个客户端,指定地址,端口号 * 2.获取输出流 * 3.写出数据 * 4.获取输入流 * 5.读取数据 * * @param args * @throws IOException * @throws UnknownHostException */ public static void main(String[] args) throws UnknownHostException, IOException { Socket client = new Socket(InetAddress.getLocalHost(), 9090); OutputStream os = client.getOutputStream(); os.write("客户端连接成功".getBytes()); os.flush(); InputStream is = client.getInputStream(); byte[] buf = new byte[1024]; int len = is.read(buf); System.out.println(new String(buf, 0, len)); client.close(); }
客户端发送小写,接收大写
/** * 要求: 有一个服务端,接收客户端传过来的字符串并将其转为大写返回给客户端 * * 思路: * 1.有一个服务端对象,接收客户端数据之后将其转为大写 * 2.利用客户端的流把大写字符传到客户端 * 3.需要将从客户端获取的字节流转为操作字符串的流 * * 步骤: * 1.创建一个服务端对象,指定端口号 * 2.与客户端进行通信,并获得客户端对象 * 3.使用客户端的输入流,封装成字符流。读取数据 * 4.可以使用字符串的静态转换方法。将数据转为大写,再利用客户端输出流,传到客户端 * 5.指定一个循环,并指定结束标记,在循环内部执行第3.4两步骤 * 6.关闭资源 * * @param args * @throws IOException */ public static void main(String[] args) throws IOException { ServerSocket transSer = new ServerSocket(9010); Socket client = transSer.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream())); String line = null; while((line=br.readLine()) != null){ if(line.equals("over")) break; String upperLine = line.toUpperCase(); BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); bos.write(upperLine); bos.newLine(); bos.flush(); } transSer.close(); }
/** * 要求:有一个客户端,与某个服务端连接之后,往服务端传输数据,并接受服务端的数据 * * 思路: * 1.有一个客户端,指定通信服务端的ip地址以及端口号 * 2.利用自身的输出流对象,往服务端传送数据 * 3.利用自身的输入流对象,接受服务端传过来的数据 * 4.可以将字节流对象封装成操作字符串的对象 * * 步骤: * 1.创建一个客户端,与服务端通信 * 2.从键盘上读取数据, * 3.将输出流对象封装成缓冲字符流,并将读取到的数据写到服务端 * 4.利用输入流对象,读取从服务端传送过来的数据。 * 5.穿件循环,指定结束标记,执行步骤2.3.4 * * @param args * @throws IOException * @throws UnknownHostException */ public static void main(String[] args) throws UnknownHostException, IOException { Socket client = new Socket(InetAddress.getLocalHost(), 9010); String line = null; while(true){ BufferedReader is = new BufferedReader(new InputStreamReader(System.in)); line = is.readLine(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); bw.write(line); bw.newLine(); bw.flush(); if(line.equals("over")) break; BufferedReader readServer = new BufferedReader(new InputStreamReader(client.getInputStream())); line = readServer.readLine(); System.out.println(line); } }