概念
socket 被翻译为“套接字”,socket是计算机之间进行通信的一种方式。通过socket可以实现端(端口)到端通信。Java的java.net包中提供了进行socket通信的类。主要使用ServerSocket和Socket类实现通信。
ServerSocket
服务端应用使用java.net.ServerSocket类来获取端口并侦听客户端请求。
①使用ServerSocket(int port)构造函数创建服务端。
②使用.accept()函数来获取客户端(创建Socket对象)。
Socket
客户端应用使用java.net.Socket类来发送请求,并接收服务端请求。
①使用Socket(String host,int port)构造函数创建客户端。
②使用.getOutputStream()来获取OutputStream输出流。
③使用.getInputStream()来获取InputStream输入流。
InputStream
InputStream是位于java.io包中,Java标准库提供的最基本的同步输入流。
①使用.reda()方法读取流中的数据。
byte[] data = new byte[256]; //读取流中的数据,放入到data里面 inputStream.read(data);
②使用java.util.Scanner类读取数据也是可以的。
Scanner scanner = new Scanner(inputStream); //读取一行数据 String line = scanner.nextLine();
③使用.close()关闭输入流。
OutputStream
OutputStream是位于java.io包中,Java标准库提供的最基本的同步输出流。
①使用.write()方法往流里面写入数据。
String data = "数据\n"; //务必使用\n结尾 outputStream.write(data.getBytes(StandardCharsets.UTF_8));
②使用.flush()方法完成写入。
③使用.close()关闭输出流。
一次通信
一次通信,服务端需要监听一次客户端,处理请求数据并作出响应。
创建服务端
public class Server { public static void main(String[] args) { ServerSocket socket = null; try { //创建socket服务并监听 socket = new ServerSocket(2181); //接收请求 Socket accept = socket.accept(); //获取请求数据 InputStream inputStream = accept.getInputStream(); Scanner scanner = new Scanner(inputStream); String line = scanner.hasNext() ? scanner.nextLine() : ""; //处理请求 System.out.println(line); //做出响应 OutputStream outputStream = accept.getOutputStream(); line = "收到\n"; outputStream.write(line.getBytes(StandardCharsets.UTF_8)); outputStream.flush(); } catch (Exception e) { e.printStackTrace(); } } }
创建客户端
public class Client { public static void main(String[] args) { Socket socket = null; try { //连接服务端 socket = new Socket("127.0.0.1", 2181); //发送请求 OutputStream outputStream = socket.getOutputStream(); String data = "数据\n"; outputStream.write(data.getBytes(StandardCharsets.UTF_8)); outputStream.flush(); //接收响应数据 InputStream inputStream = socket.getInputStream(); Scanner scanner = new Scanner(inputStream); String line = scanner.hasNext() ? scanner.nextLine() : ""; //处理响应数据 System.out.println(line); } catch (Exception e) { e.printStackTrace(); } } }
测试
持续通信
持续通信,服务端需要持续监听客户端,处理请求并作出响应。只需要一个while循环即可实现。
创建服务端
public class Server { public static void main(String[] args) { ServerSocket socket = null; try { //创建socket服务并监听 socket = new ServerSocket(2181); while (true) { //接收请求 Socket accept = socket.accept(); //获取请求数据 InputStream inputStream = accept.getInputStream(); Scanner scanner = new Scanner(inputStream); String line = scanner.hasNext() ? scanner.nextLine() : ""; //处理请求 System.out.println(line); //做出响应 OutputStream outputStream = accept.getOutputStream(); line = "收到\n"; outputStream.write(line.getBytes(StandardCharsets.UTF_8)); outputStream.flush(); } } catch (Exception e) { e.printStackTrace(); } } }
创建客户端
public class Client { public static void main(String[] args) { Socket socket = null; try { //连接服务端 socket = new Socket("127.0.0.1", 2181); //发送请求 OutputStream outputStream = socket.getOutputStream(); String data = "数据\n"; outputStream.write(data.getBytes(StandardCharsets.UTF_8)); outputStream.flush(); //接收响应数据 InputStream inputStream = socket.getInputStream(); Scanner scanner = new Scanner(inputStream); String line = scanner.hasNext() ? scanner.nextLine() : ""; //处理响应数据 System.out.println(line); } catch (Exception e) { e.printStackTrace(); } } }
测试
客户端启动三次发了三次请求。