单发单收
ServerSocket
/** * 服务端 */ System.out.println("===服务端启动成功==="); // 1.注册端口 ServerSocket serverSocket = new ServerSocket(7777); // 2.必须调用accept方法: 等待接收客户端的Socket连接请求,建立Socket通信管道 Socket socket = serverSocket.accept(); // 3.从Socket通信管道中得到一个字节输入流 InputStream is = socket.getInputStream(); // 4.把字节输入流包装成缓冲字符输入流进行消息的接受 BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 5.按照行读取 String msg =null; SocketAddress cip = socket.getRemoteSocketAddress(); while ((msg = br.readLine()) != null) { System.out.println("客户端IP :" + cip); System.out.println("消息:" + msg); }
Socket
/** * 客户端 */ System.out.println("===客户端启动成功==="); // 1.创建Socket通信管道请求有服务端的连接 // 参数一:服务器ip地址,参数二:端口 Socket socket = new Socket("127.0.0.1", 7777); // 2.从Socket通信管道中得到一个字节输出流,负责发送数据 OutputStream os = socket.getOutputStream(); // 3、把低级的字节流包装成打印流 PrintStream ps = new PrintStream(os); // 4.发送消息 String msg = "测试一下"; ps.println(msg); ps.flush(); // 5.关闭流,不需要关闭,容易引起BUG // ps.close();
多发多收(单线程只能接受1个客户端)
/** * 服务端 */ System.out.println("===服务端启动成功==="); // 1.注册端口 ServerSocket serverSocket = new ServerSocket(7777); // 2.必须调用accept方法: 等待接收客户端的Socket连接请求,建立Socket通信管道 Socket socket = serverSocket.accept(); // 3.从Socket通信管道中得到一个字节输入流 InputStream is = socket.getInputStream(); // 4.把字节输入流包装成缓冲字符输入流进行消息的接受 BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 5.按照行读取 String msg =null; SocketAddress cip = socket.getRemoteSocketAddress(); while ((msg = br.readLine()) != null) { System.out.println("客户端IP :" + cip); System.out.println("消息:" + msg); }
/** * 客户端 */ System.out.println("===客户端启动成功==="); // 1.创建Socket通信管道请求有服务端的连接 // 参数一:服务器ip地址,参数二:端口 Socket socket = new Socket("127.0.0.1", 7777); // 2.从Socket通信管道中得到一个字节输出流,负责发送数据 OutputStream os = socket.getOutputStream(); // 3、把低级的字节流包装成打印流 PrintStream ps = new PrintStream(os); Scanner sc = new Scanner(System.in); while (true) { // 4.发送消息 System.out.println("请输入:"); String msg = sc.nextLine(); ps.println(msg); ps.flush(); }
多发多收(多线程-线程池接受多个客户端)
// 使用静态变量记住一个线程池对象 private static ExecutorService pool = new ThreadPoolExecutor(3, 5, 6, TimeUnit.SECONDS, new ArrayBlockingQueue<>(2), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); public static void main(String[] args) throws IOException { /** * 服务端 */ System.out.println("===服务端启动成功==="); // 1.注册端口 ServerSocket serverSocket = new ServerSocket(7777); // a.定义一个死循环由主线程负责不断的接受客户端的Socket管道连接。 while (true) { // 2.每接收到一个客户端的Socket管道,交给一个独立的子线程负责读取消息 Socket socket = serverSocket.accept(); // 获取客户端的ip地址 SocketAddress cip = socket.getRemoteSocketAddress(); System.out.println("客户端IP: " + cip); // 3.开始创建独立线程处理socket Runnable target = new ServerReaderRunnable(socket); pool.execute(target); } }
package xuexi.variable.logback;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.Socket;import java.net.SocketAddress;public class ServerReaderRunnable implements Runnable { private Socket socket; public ServerReaderRunnable(Socket socket) { this.socket = socket; } @Override public void run() { //重写run方法 try { // 3.从Socket通信管道中得到一个字节输入流 InputStream is = socket.getInputStream(); // 4.把字节输入流包装成缓冲字符输入流进行消息的接受 BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 5.按照行读取 String msg = null; SocketAddress cip = socket.getRemoteSocketAddress(); while ((msg = br.readLine()) != null) { System.out.println("客户端IP :" + cip); System.out.println("消息:" + msg); } } catch (IOException e) { SocketAddress ip2 = socket.getRemoteSocketAddress(); System.out.println("客户端IP下线 " + ip2); } }}
/** * 客户端 */ System.out.println("===客户端启动成功==="); // 1.创建Socket通信管道请求有服务端的连接 // 参数一:服务器ip地址,参数二:端口 Socket socket = new Socket("127.0.0.1", 7777); // 2.从Socket通信管道中得到一个字节输出流,负责发送数据 OutputStream os = socket.getOutputStream(); // 3、把低级的字节流包装成打印流 PrintStream ps = new PrintStream(os); Scanner sc = new Scanner(System.in); while (true) { // 4.发送消息 System.out.println("请输入:"); String msg = sc.nextLine(); ps.println(msg); ps.flush(); }