ServerSocket ss = new ServerSocket(10086); Socket server = ss.accept(); // BufferedReader r_server = new BufferedReader(new InputStreamReader(server.getInputStream())); InputStreamReader r = new InputStreamReader(server.getInputStream()); BufferedWriter w_server = new BufferedWriter(new OutputStreamWriter(server.getOutputStream())); System.out.println("开始接收"); String message; int len; char[] buf = new char[1024]; while (true) { // message = r_server.readLine(); len = r.read(buf); message = new String(buf, 0, len); System.out.println(message); w_server.write("接收到客户端:" + message); w_server.flush(); if (message.equals("886")) { System.out.println("关闭服务器端"); break; } } // r_server.close(); w_server.close(); ss.close();为什么用BufferedReader接收不到数据,用InputStreamReader可以
时间: 2023-04-12 21:02:11 浏览: 156
这可能是因为 BufferedReader 会缓存数据,只有当缓存区满了或者遇到换行符时才会读取数据,而 InputStreamReader 则是直接读取数据流。因此,如果发送的数据没有换行符或者缓存区还没有满,使用 BufferedReader 可能会接收不到数据。
相关问题
package com.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class ChatServer { public static void main(String[] args) throws Exception { // 创建一个服务器 ServerSocket ss = new ServerSocket(9090); System.out.println("服务器已上线,等待客户端连接..."); Socket sk = ss.accept(); System.out.println("客户端已经连接"); Scanner mys = new Scanner(System.in); System.out.println("请输入您要发送的信息:"); String str = mys.next(); // 打开客户端字节流 OutputStream os = sk.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(osw); bw.write(str); bw.newLine(); bw.flush(); // 打开读取的字节流 InputStream is = sk.getInputStream(); // 字节流转换为字符流量 InputStreamReader isr = new InputStreamReader(is); // 添加buffered BufferedReader br = new BufferedReader(isr); String sa = br.readLine(); System.out.println("客户端:"+sa); } }
这是一个基于Java的简单的聊天服务器程序,代码主要实现了以下功能:
1. 创建服务器:创建一个ServerSocket对象,将其绑定到指定的端口上,等待客户端的连接请求。
2. 等待客户端连接:使用accept()方法等待客户端的连接请求,当客户端连接上来时,程序继续执行。
3. 发送信息:使用OutputStream、OutputStreamWriter和BufferedWriter对象将信息发送给客户端。
4. 接收信息:使用InputStream、InputStreamReader和BufferedReader对象接收客户端发送的信息。
5. 输出信息:将接收到的信息输出到控制台上。
需要注意的是,这个程序中只能实现单向通信,即服务器只能发送信息给客户端,而不能接收来自客户端的信息。如果需要实现双向通信,需要在程序中添加相应的代码。
逐行分析解释下面代码:import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try { ServerSocket server = new ServerSocket(8888); // 监听指定端口号 System.out.println("等待客户端连接..."); Socket socket = server.accept(); // 等待客户端连接 System.out.println("客户端已连接,IP地址为:" + socket.getInetAddress().getHostAddress()); // 为客户端创建读取器和写入器 BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); // 启动一个线程来接收客户端发送的消息 Thread receiveThread = new Thread(() -> { try { while (true) { String message = reader.readLine(); if (message == null) { break; } System.out.println("客户端说:" + message); } } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); writer.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }); receiveThread.start(); // 主线程用于发送消息 BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in)); while (true) { String message = consoleReader.readLine(); writer.println(message); writer.flush(); } } catch (IOException e) { e.printStackTrace(); } } }
这段代码实现了一个简单的Socket服务器,接收客户端发送的消息并将其输出到控制台,同时也可以通过控制台向客户端发送消息。
1. 导入必要的包:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
```
2. 在主函数中,创建一个ServerSocket对象并指定端口号为8888,然后等待客户端连接:
```java
ServerSocket server = new ServerSocket(8888); // 监听指定端口号
System.out.println("等待客户端连接...");
Socket socket = server.accept(); // 等待客户端连接
System.out.println("客户端已连接,IP地址为:" + socket.getInetAddress().getHostAddress());
```
3. 创建一个BufferedReader对象和一个PrintWriter对象,用于读取和写入数据:
```java
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
```
4. 创建一个线程用于接收客户端发送的消息,该线程通过while循环不断地读取客户端发送的消息,并将其输出到控制台:
```java
Thread receiveThread = new Thread(() -> {
try {
while (true) {
String message = reader.readLine();
if (message == null) {
break;
}
System.out.println("客户端说:" + message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
writer.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
receiveThread.start();
```
5. 在主线程中,通过BufferedReader对象从控制台读入消息,并通过PrintWriter对象将其发送给客户端:
```java
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String message = consoleReader.readLine();
writer.println(message);
writer.flush();
}
```
6. 若有异常,则打印异常信息:
```java
} catch (IOException e) {
e.printStackTrace();
}
```
阅读全文