请问通过Socket对象调用getOutputStream()方法得到的OutputStream对象为什么不能用缓冲流包装

朱同学 2019-03-07 08:01:28
写了两个类 服务器类和客户端类 模拟一个登陆程序
变成过程中发现客户端里的Socket对象调用getOutputStream()方法得到的OutputStream对象一旦用缓冲流包装就会无响应
JDK版本11
代码如下
客户端:
import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Test模拟登陆客户端 {
public static void main(String[] args) throws IOException {
ObjectOutputStream oos=null;
DataInputStream dis=null;
System.out.println("-------------开启客户端------------------------------");
try {
//创建Socket对象
Socket client=new Socket("localhost",2234);
//创建User对象
User u1=new User("755199443","12345678");
//获取输出流(对象流)
oos=new ObjectOutputStream(client.getOutputStream());//这里不能加缓冲流包装`
// ObjectOutputStream oos=new ObjectOutputStream(new BufferedOutputStream(client.getOutputStream()));//加缓冲流
//User对象发到服务器
oos.writeObject(u1);
//获取反响信息(数据流)
dis=new DataInputStream(client.getInputStream());
System.out.println(dis.readUTF());
} catch (UnknownHostException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
//关闭
if(oos!=null) {
oos.close();
}
if(dis!=null) {
dis.close();
}
}
System.out.println("-------------结束客户端------------------------------");
}
}

服务器:
import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;


class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = -5292247610512991206L;
private String id;
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public User() {
super();
}
public User(String id, String password) {
super();
this.id = id;
this.password = password;
}
}
public class Test模拟登陆服务器端 {
public static void main(String[] args) throws IOException {
System.out.println("-------------开启服务器------------------------------");
//返回信息
String message = null;
ObjectInputStream ois=null;
DataOutputStream dos=null;
try {
//创建ServerSocket对象
ServerSocket ss=new ServerSocket(2234);
//调用accept()方法
Socket server=ss.accept();
//创建输入流(对象流)
// ois=new ObjectInputStream(new BufferedInputStream(server.getInputStream()));//加缓冲流
ois=new ObjectInputStream(server.getInputStream());//不加缓冲流
//获取对象
User u1=(User) ois.readObject();
System.out.println("收到登录请求");
if(u1.getId().equals("755199443")) {
if(u1.getPassword().equals("12345678")) {
message="登录成功";
}else {
message="密码输入错误";
}
}else {
message="无此用户名";
}
//创建输出流(数据流)
dos=new DataOutputStream(server.getOutputStream());
//返回反响信息
dos.writeUTF(message);
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
//关闭
if(ois!=null) {
ois.close();
}
if(dos!=null) {
dos.close();
}
}
System.out.println("-------------结束服务器------------------------------");


}
}


下面描述一下其他情况
单单去除缓冲流 结果:正常运行

客户端去除缓冲流 服务器端的输入流用缓冲流包装 结果:正常运行

客户端输出流从对象流改为数据流包装 服务器端输入流从对象流改为数据流包装 都不加缓冲流 结果:正常运行

客户端输出流从对象流改为数据流包装 服务器端输入流从对象流改为数据流包装 客户端输出流用缓冲流包装 结果:无响应
...全文
405 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2019-03-08
  • 打赏
  • 举报
回复
buffered 和 data之间应该不能直接传送信息吧,需要用上层数据流转换后才行。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧