第1章 网络基础知识
1-1 网络基础简介 (10:21)
第2章 Java 中网络相关 API 的应用
2-1 Java 中的 InetAddress 的应用 (08:10)
import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; public class Hello { public static void main(String[] args) throws UnknownHostException { // 获取本机的InetAddress实例 InetAddress address = InetAddress.getLocalHost(); System.out.println("计算机名:" + address.getHostName()); System.out.println("IP地址:" + address.getHostAddress()); byte[] bytes = address.getAddress();// 获取字节数组形式的IP地址 System.out.println("字节数组形式的IP:" + Arrays.toString(bytes)); System.out.println(address);// 直接输出InetAddress对象 // 根据机器名获取InetAddress实例 InetAddress address2 = InetAddress.getByName("DESKTOP-2HKVB4E"); System.out.println("计算机名:" + address2.getHostName()); System.out.println("IP地址:" + address2.getHostAddress()); // 根据IP地址获取InetAddress实例 InetAddress address3 = InetAddress.getByName("192.168.31.108"); System.out.println("计算机名:" + address3.getHostName()); System.out.println("IP地址:" + address3.getHostAddress()); } }
2-2 Java 中的 URL 的应用 (16:24)
创建一个URL实例
import java.net.MalformedURLException; import java.net.URL; import java.net.UnknownHostException; /* * URL常用方法 */ public class Hello { public static void main(String[] args) throws UnknownHostException { try { // 创建一个URL实例 URL imooc = new URL("http://www.imooc.com/"); // ?后面表示参数,#后面表示锚点 URL url = new URL(imooc, "/index.html?username=tom#test"); System.out.println("协议:" + url.getProtocol()); System.out.println("主机:" + url.getHost()); // 如果未制定端口号,则使用默认的端口号,此时getPort()方法返回值为-1 System.out.println("端口:" + url.getPort()); System.out.println("文件路径:" + url.getPath()); System.out.println("文件名:" + url.getFile()); System.out.println("相对路径:" + url.getRef()); System.out.println("查询字符串:" + url.getQuery()); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
使用URL读取网页内容
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; /* * 使用URL读取网页内容 */ public class Hello { public static void main(String[] args) { try { // 创建一个URL实例 URL url = new URL("http://www.baidu.com/"); // 通过URL的openStream方法获取URL对象所表示的资源的字节输入流 InputStream is = url.openStream(); // 将字节输入流转换为字符输入流 InputStreamReader isr = new InputStreamReader(is, "utf-8"); // 为字符输入流添加缓冲 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 (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
第3章 通过 Socket 实现 TCP 编程
3-1 Socket 简介 (06:37)
3-2 编程实现基于 TCP 的 Socket 通信之服务器端 (10:42)
3-3 编程实现基于 TCP 的 Socke t通信之客户端 (06:01)
3-4 完善用户登陆之服务器响应客户端 (06:09)
3-5 使用多线程实现多客户端的通信 (14:04)
Client
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; /* * 客户端 */ public class Client { public static void main(String[] args) { try { // 1.创建客户端Socket,指定服务器地址和端口 Socket socket = new Socket("localhost", 8888); // 2.获取输出流,向服务器端发送信息 OutputStream os = socket.getOutputStream();// 字节输出流 PrintWriter pw = new PrintWriter(os);// 将输出流包装为打印流 pw.write("用户名:alice;密码:789"); pw.flush(); socket.shutdownOutput();// 关闭输出流 // 3.获取输入流,并读取服务器端的响应信息 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String info = null; while ((info = br.readLine()) != null) { System.out.println("我是客户端,服务器说:" + info); } // 4.关闭资源 br.close(); is.close(); pw.close(); os.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
Server
import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /* * 基于TCP协议的Socket通信,实现用户登陆 * 服务器端 */ public class Server { public static void main(String[] args) { try { // 1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 ServerSocket serverSocket = new ServerSocket(8888); Socket socket = null; // 记录客户端的数量 int count = 0; System.out.println("***服务器即将启动,等待客户端的连接***"); // 循环监听等待客户端的连接 while (true) { // 调用accept()方法开始监听,等待客户端的连接 socket = serverSocket.accept(); // 创建一个新的线程 ServerThread serverThread = new ServerThread(socket); // 启动线程 serverThread.start(); count++;// 统计客户端的数量 System.out.println("客户端的数量:" + count); InetAddress address = socket.getInetAddress(); System.out.println("当前客户端的IP:" + address.getHostAddress()); } } catch (IOException e) { e.printStackTrace(); } } }
ServerThread
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; /* * 服务器线程处理类 */ public class ServerThread extends Thread { // 和本线程相关的Socket Socket socket = null; public ServerThread(Socket socket) { this.socket = socket; } // 线程执行的操作,响应客户端的请求 public void run() { InputStream is = null; InputStreamReader isr = null; BufferedReader br = null; OutputStream os = null; PrintWriter pw = null; try { // 获取输入流,并读取客户端信息 is = socket.getInputStream(); isr = new InputStreamReader(is); br = new BufferedReader(isr); String info = null; while ((info = br.readLine()) != null) {// 循环读取客户端的信息 System.out.println("我是服务器,客户端说:" + info); } socket.shutdownInput();// 关闭输入流 // 获取输出流,响应客户端的请求 os = socket.getOutputStream(); pw = new PrintWriter(os); pw.write("欢迎您!"); pw.flush();// 调用flush()方法将缓冲输出 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 关闭资源 try { if (pw != null) pw.close(); if (os != null) os.close(); if (br != null) br.close(); if (isr != null) isr.close(); if (is != null) is.close(); if (socket != null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
第4章 通过 Socket 实现 UDP 编程
4-1 DatagramPacket (03:14)
4-2 编程实现基于 UDP的 Socket 通信之服务器端 (06:48)
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /* * 服务器端,实现基于UDP的用户登陆 */ public class UDPServer { public static void main(String[] args) throws IOException { /* * 接收客户端发送的数据 */ // 1.创建服务器端DatagramSocket,指定端口 DatagramSocket socket = new DatagramSocket(8800); // 2.创建数据报,用于接收客户端发送的数据 byte[] data = new byte[1024];// 创建字节数组,指定接收的数据包的大小 DatagramPacket packet = new DatagramPacket(data, data.length); // 3.接收客户端发送的数据 System.out.println("****服务器端已经启动,等待客户端发送数据"); socket.receive(packet);// 此方法在接收到数据报之前会一直阻塞 // 4.读取数据 String info = new String(data, 0, packet.getLength()); System.out.println("我是服务器,客户端说:" + info); /* * 向客户端响应数据 */ // 1.定义客户端的地址、端口号、数据 InetAddress address = packet.getAddress(); int port = packet.getPort(); byte[] data2 = "欢迎您!".getBytes(); // 2.创建数据报,包含响应的数据信息 DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port); // 3.响应客户端 socket.send(packet2); // 4.关闭资源 socket.close(); } }
4-3 编程实现基于 UDP 的 Socket 通信之客户端 (14:04)
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /* * 客户端 */ public class UDPClient { public static void main(String[] args) throws IOException { /* * 向服务器端发送数据 */ // 1.定义服务器的地址、端口号、数据 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(); // 4.向服务器端发送数据报 socket.send(packet); /* * 接收服务器端响应的数据 */ // 1.创建数据报,用于接收服务器端响应的数据 byte[] data2 = new byte[1024]; DatagramPacket packet2 = new DatagramPacket(data2, data2.length); // 2.接收服务器响应的数据 socket.receive(packet2); // 3.读取数据 String reply = new String(data2, 0, packet2.getLength()); System.out.println("我是客户端,服务器说:" + reply); // 4.关闭资源 socket.close(); } }
第5章 Socket 总结
5-1 Socket 总结 (04:12)
第6章 综合练习
6-1 综合练习---问题描述. (05:20)
6-2 综合练习---实现分析 (06:52)