关闭客户端Socket的inputstream.read()会返回-1原理

debug调试,当关闭客户端的时候Socket的inputstream.read()返回-1详细原理入下图,

主要是java.net.SocketInputStream的成员eof会被置为true,然后read()方法里会去判断eof为true是就返回-1

看下图就理解了

 

Java中创建服务器端和客户端可以使用Socket编程来实现。下面是一个简单的示例代码: 1. 服务器端代码: ```java import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class Server { private static final int PORT = 8888; private List<ClientHandler> clients = new ArrayList<>(); public void start() { try { ServerSocket serverSocket = new ServerSocket(PORT); System.out.println("服务器已启动,监听端口:" + PORT); while (true) { Socket clientSocket = serverSocket.accept(); System.out.println("有新的客户端连接:" + clientSocket.getInetAddress().getHostAddress()); ClientHandler clientHandler = new ClientHandler(clientSocket); clients.add(clientHandler); new Thread(clientHandler).start(); } } catch (IOException e) { e.printStackTrace(); } } public void broadcastMessage(String message) { for (ClientHandler client : clients) { client.sendMessage(message); } } private class ClientHandler implements Runnable { private Socket clientSocket; private InputStream inputStream; private OutputStream outputStream; public ClientHandler(Socket clientSocket) { this.clientSocket = clientSocket; } @Override public void run() { try { inputStream = clientSocket.getInputStream(); outputStream = clientSocket.getOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) > 0) { String message = new String(buffer, 0, len); System.out.println("收到客户端消息:" + message); broadcastMessage(message); // 转发消息给其他客户端 } } catch (IOException e) { e.printStackTrace(); } finally { try { clientSocket.close(); clients.remove(this); System.out.println("有客户端断开连接:" + clientSocket.getInetAddress().getHostAddress()); } catch (IOException e) { e.printStackTrace(); } } } public void sendMessage(String message) { try { outputStream.write(message.getBytes()); outputStream.flush(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { Server server = new Server(); server.start(); } } ``` 2. 客户端代码: ```java import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class Client { private static final String SERVER_IP = "localhost"; private static final int SERVER_PORT = 8888; private String username; public void start() { try { Socket socket = new Socket(SERVER_IP, SERVER_PORT); System.out.println("成功连接服务器"); InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); // 接收服务器发送的消息 new Thread(() -> { try { byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) > 0) { String message = new String(buffer, 0, len); System.out.println("收到服务器消息:" + message); } } catch (IOException e) { e.printStackTrace(); } }).start(); // 发送消息给服务器 new Thread(() -> { try { Scanner scanner = new Scanner(System.in); while (true) { String message = scanner.nextLine(); outputStream.write(message.getBytes()); outputStream.flush(); } } catch (IOException e) { e.printStackTrace(); } }).start(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { Client client = new Client(); client.start(); } } ``` 以上是一个简单的基于Socket编程的服务器和客户端示例代码。服务器通过ServerSocket监听端口,接受客户端的连接请求,并启动一个线程来处理客户端的消息接收和转发。客户端通过Socket连接服务器,启动两个线程分别用于接收服务器发送的消息和发送消息给服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值