Java从零开始 第15讲 网络编程,XML和JSON
网络编程
在本讲之前,我们所有编写的程序都是单机运行的,并没有任何需要网络的部分,而现在让我们学习运用网络的编程
在学习代码之前,让我们先学习两个概念,协议(protocol)和套接字(socket)
协议是端到端通信需要遵循的规矩,你不需要具体理解协议的内容,你只需要明白协议是用于约束信息在网络上传输的东西,就像是交警一样
而套接字,是端到端通信的端点,是网络驱动提供给应用程序编程的一种接口,一种标准,一种机制,当我们想要通过网络传输或者接收文件时,我们都是通过套接字来完成的
TCP的网络编程
TCP是一种非常常用的协议,TCP拥有很多机制,能够保证运输的信息全部到达
TCP编程主要使用到两个类,ServerSocket类和Socket类
让我们直接通过实例来学习
// 服务器端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8000);// 4096为端口号
System.out.println("服务器启动了");
Socket socket = ss.accept();// 如果没有连接,会阻塞在此处
System.out.println("服务器被连接了");
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("欢迎连接");// 发送消息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String text = br.readLine();
System.out.println("接收到消息:" + text);//接收消息
ss.close();// 运行结束后关闭
System.out.println("服务器关闭了");
}
}
// 客户端
import java.io.*;
import java.net.Socket;
class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",8000);// 127.0.0.1为本机IP地址
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String text = br.readLine();
System.out.println("接收到消息:" + text);
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("不客气");
socket.close();// 使用结束后关闭
System.out.println("连接关闭了");
}
}
注意着两段代码要分开运行,先运行服务器端代码,再运行客户端代码
多线程网络编程
在真实的服务器和客户端模型中,肯定不能像上面这样一对一交互,服务器需要面对连接不同的客户端,是一对n的交互,为了能够完成一对多的交互,我们需要引入多线程
让我们同样直接用代码来学习:
// 服务器端
package general;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Network {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8000);// 4096为端口号
System.out.println("服务器启动了");
while (true) {
Socket socket = ss.accept();
new Thread() {
@Override
public void run() {
try {
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);