慕课网_Java Socket应用---通信是这样练成的

第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)

原文地址:https://www.cnblogs.com/denggelin/p/7173843.html