- 网络基础
- TCP/IP协议
- TCP/IP是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,也称:TCP/IP协议族 或 TCP/IP协议栈
- TCP:Transmission Control Protocol 传输控制协议
- IP:Internet Potocol 互联网协议
- TCP/IP五层模型 (应用层-传输层-网络层-数据链路层-物理层)
- 应用层
- HTTP超文本传输协议
- FTP文件传输协议
- SMTP简单邮件传送协议
- Telnet远程登陆服务
- 应用层
- 端口
- 用于区分不同应用程序
- 端口号范围是 0 ~~ 65525,其中 0 ~~ 1023为系统保留
- IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础
- 常用的协议使用的端口号 http:80 ftp:21 telnet:23
- Java中的网络支持针对网络通信的不同层次,Java提供的网络功能有四大类
- InetAddress(用于标识网络上的硬件资源)
- URL(统一资源定位符,通过URL可以直接读取或写入网络上的数据)
- Sockets(使用TCP协议实现网络通信的Socket相关的类)
- Datagram(使用UDP协议,将数据保存在数据报中,通过网络进行通信)
- TCP/IP协议
- InetAddress类
- InetAddress类代表了一个网络目标地址,包括主机名和数字类型的地址信息。
- 该类有两个子类,Inet4Address和Inet6Address,分别对应了目前IP地址的两个版本。InetAddress
- 实例是不可变的,一旦创建,每个实例就始终指向同一个地址。
- 可以根据IP获取该对象,根据该对象可以获得对应的主机名等等信息
- InetAddress也可能会被用来将IP地址转变为这些地址的域名,这对于分析Web日志是很有用的。InetAddress使得开发者们可以轻松的和域名、IP地址打交道,并且使他们可以不必和DNS服务器进行交互。
- URL(Uniform Resource Locator 统一资源定位符 表示Internet上某一资源的地址)
- URL由两部分组成:协议名称和资源名称,中间用冒号隔开
- 在java.net包中,提供了URL类来表示URL
- 利用一个网址获取该网页内容(爬虫抓取)
public static void printPage(){ try { URL url = new URL("http://www.baidu.com"); InputStream is = url.openStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String data = br.readLine(); while(data != null){ System.out.println(data); data = br.readLine(); } br.close(); isr.close(); is.close(); } catch (Exception e) { e.printStackTrace(); } }}
- TCP编程( Socket 实现 TCP 编程)
- Socket通信
- TCP协议是面向连接、可靠的、有序的,以字节流的方式发送数据
- 基于TCP协议实现网络通信的类
- 客户端的Socket类
- 服务器端的ServerSocket类
- 实现步骤
- 创建ServerSocket和Socket
- 打开连接到Socket的输入/输出流
- 按照协议对Socket进行读/写操作
- 关闭输入输出流、关闭Socket
- Sokect通信模型
- Server(服务器端)
public class Service { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(8888); Socket socket = serverSocket.accept(); InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String info = null; while((info = br.readLine())!=null){ System.out.println("服务器,客户端请求:"+info); } socket.shutdownInput(); br.close(); isr.close(); is.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } }}
- 建立连接
- 建立服务端监听Socket
- 等待并接收连接请求
- 接收请求后创建Socket
- 开始通道
- InputStream
- OutputStream
- 结束通信
- 关闭Socket及相关资源
- 建立连接
- Client(客户端)
public class Client { public static void main(String[] args) { try { Socket socket = new Socket("localhost",8888); OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os); pw.write("用户名:admin;密码:admin"); pw.flush(); socket.shutdownOutput(); pw.close(); os.close(); } catch (Exception e) { e.printStackTrace(); } }}
- 创建连接Socket向服务器发送请求
- OutputStream
- InputStream
- 关闭Socket及相关资源
- Server(服务器端)
- Socket通信
- UDP编程
- UDP编程基础知识点
- UDP协议(用户数据报协议)是无连接、不可靠的、无序的
- UDP协议以数据报作为数据传输的载体
- 进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明数据所要达到的Socket(主机地址和端口号),然后再将数据报发送出去
- DatagramPacket:表示数据报包
- DatagramSocket:进行端到端通信的类
- UDP通信模型
- 服务端实现步骤
package org.socket.demo;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class UDPService { public static void main(String[] args) { try { /** * 接收客户端发送过来的数据信息 */ //1.创建服务器端DataramSocket,指定端口号 DatagramSocket datagramSocket = new DatagramSocket(8800); //2.创建数据报,用于接收客户端发送的数据 byte[] data = new byte[1024];//创建字节数组,指定接收的数据包的大小 DatagramPacket packet = new DatagramPacket(data,data.length); //3.接收客户端发送的数据 datagramSocket.receive(packet);//此方法在接收到数据报之前会一直阻塞 //读取数据 String info = new String(data,0,packet.getLength()); System.out.println("我是服务器,客户端说:"+info); /** * 回应客户端的信息 */ byte[] data2 = "欢迎您".getBytes(); InetAddress inetAddress = packet.getAddress(); int port = packet.getPort(); DatagramPacket packet2 = new DatagramPacket(data2,data2.length,inetAddress,port); datagramSocket.send(packet2); datagramSocket.close(); } catch (Exception e) { e.printStackTrace(); } }}
- 创建DatagramSocket,指定端口号
- 创建DatagramPacket,就是创建数据报,用来接收客户端发送的数据
- 接收客户端发送的数据信息
- 读取数据
- 客户端实现步骤
package org.socket.demo;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class UDPClient { public static void main(String[] args) { //1.定义服务器的地址、端口号、数据 try { /** * 向服务器端发送请求 */ InetAddress address = InetAddress.getByName("localhost"); int port = 8800; byte[] data = "用户名:admin;密码:123".getBytes(); //2、创建数据报,包含发送的数据信息 DatagramPacket packet = new DatagramPacket(data, data.length, address, port); //3、创建DatagramSocket对象 DatagramSocket socket = new DatagramSocket(); socket.send(packet); /** * 接收服务器端发送过来的数据信息 */ byte[] data2 = new byte[1024];//创建字节数组,指定接收的数据包的大小 DatagramPacket packet2 = new DatagramPacket(data2,data2.length); //3.接收客户端发送的数据 socket.receive(packet2);//此方法在接收到数据报之前会一直阻塞 String info = new String(data2,0,packet2.getLength()); System.out.println("我是客户端,服务器说:"+info); socket.close(); } catch (Exception e) { e.printStackTrace(); } }}
- 定义发送信息
- 创建DatagramPacket,包含将要发送的信息
- 创建DatagramSocket
- 发送数据
- 服务端实现步骤
- UDP编程基础知识点
- Socket总结
- 是否关闭输入/输出流
- 对于同一个Socket,如果关闭了输出流,则与该输出流关联的socket也会被关闭,所以一般不用关闭流,直接关闭Socket即可
- 多线程的优先级
- 未设置优先级可能会导致运行时速度非常慢,可降低优先级提高运行速率
- 使用TCP通信传输对象
-
ObjectOUTputStream, writeObject()---->传输的对象必须实现序列化接口,implements Serializable,否则报异常Socket socket = new Socket("localhost",8888);OutputStream os = socket.getOutputStream();ObjectOutputStream oos = new ObjectOutputStream(os);User user = new User("amdin","123");oos.writeObject(user);socket.shutdownOutput();
-
ObjectInputStream,readObject()InputStream is = socket.getInputStream();ObjectInputStream ois = new ObjectInputStream(is);User user = (User)ois.readObject();System.out.println(user.getUsername()+"\t"+user.getPassword());socket.shutdownInput();
-
- soket编程传递文件
- 是否关闭输入/输出流
- 资料文献书籍
- IP地址:《探索Linux的网络世界》