socket互传对象以及IO流的顺序问题
UserInfo.java
package com.company.s6;
import java.io.Serializable;
public class UserInfo implements Serializable {
private long id;
private String username;
private String password;
public UserInfo() {
}
public UserInfo(long id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Server.java
package com.company.s6; import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class Server {
public static void main(String[] args) throws Exception{
ServerSocket serverSocket=new ServerSocket(8888);
Socket socket=serverSocket.accept();
InputStream inputStream=socket.getInputStream();
OutputStream outputStream=socket.getOutputStream();
ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
ObjectInputStream objectInputStream=new ObjectInputStream(inputStream); for(int i=0;i<5;i++){
UserInfo userInfo=(UserInfo) objectInputStream.readObject();
System.out.println("在服务端打印 "+(i+1)+":"+userInfo.getId()+" "+userInfo.getUsername()+" "+userInfo.getPassword());
UserInfo newUserInfo=new UserInfo();
newUserInfo.setId(i+1);
newUserInfo.setUsername("servername"+(i+1));
newUserInfo.setPassword("serverpassord"+(i+1));
objectOutputStream.writeObject(newUserInfo);
}
objectOutputStream.close();
objectInputStream.close(); outputStream.close();
inputStream.close(); socket.close();
serverSocket.close();
}
}
Client.java
package com.company.s6; import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket; public class Client {
public static void main(String[] args) throws Exception{
Socket socket=new Socket("localhost",8888);
InputStream inputStream=socket.getInputStream();
OutputStream outputStream=socket.getOutputStream();
ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);
ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
for(int i=0;i<5;i++){
UserInfo newUserinfo=new UserInfo();
newUserinfo.setId(i+1);
newUserinfo.setUsername("clientUserName:"+(i+1));
newUserinfo.setPassword("clientPassword:"+(i+1)); objectOutputStream.writeObject(newUserinfo); UserInfo userInfo=(UserInfo)objectInputStream.readObject();
System.out.println("在客户端打印:"+(i+1)+":"+userInfo.getId()+" "+userInfo.getUsername()+" "+userInfo.getPassword());
}
objectInputStream.close();
objectOutputStream.close(); outputStream.close();
inputStream.close(); socket.close();
}
}
ps:如果服务端先获取objectInputStream对象,然后获取objectOutPutStream对象;
如果客户端也是同样的顺序获取对象,这样的话在运行时会在服务端的程序代码:
ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);
出现阻塞的现象。
正确的写法应该是:
1:服务端先获得ObjectInputStream对象,客户端就要先获得ObjectOutPutStream对象;
2:服务端先获得ObjectOutPutStream对象,客户端就要先获得ObjectInPutStream对象;
socket互传对象以及IO流的顺序问题的更多相关文章
- Java(33)IO流的介绍&字节流
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228446.html 博客主页:https://www.cnblogs.com/testero ...
- Java IO流
File类 ·java.io.File类:文件和目录路径名的抽象表示形式,与平台无关 ·File能新建.删除.重命名文件和目录,但File不能访问文件内容本身.如果需要访问文件内容本身,则需要使用输入 ...
- IO流(二)I/O
一.IO流概述 1.定义:Java的IO流是实现输入输出的基础,它可以方便地实现数据的输入/输出操作. 2.流的分类: (1)按流向来分:输入流和输出流 (2)按操作的数据来分:字节流和字符流 (3) ...
- Python 完美诠释"高内聚"概念的 IO 流 API 体系结构
1. 前言 第一次接触 Python 语言的 IO API 时,是惊艳的.相比较其它语言所提供的 IO 流 API . 无论是站在使用者的角度还是站在底层设计者的角度,都可以称得上无与伦比. 很多人在 ...
- Java基础-IO流对象之File类
Java基础-IO流对象之File类 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.IO技术概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下 ...
- 二十、Java基础--------IO流之其他对象
在上面两篇文章中介绍了IO体系并详细介绍了字节流以及字符流,本文主要是讲述操作文件的File.转化流.标准输入与输出.Properties.打印流以及序列流. File File英文为"文件 ...
- IO流(一)__File对象和字符流FileWriter FileReader
IO流:IO流用来处理设备之间的数据传输,Java对于流的操作对象都在IO包中将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出 流分为字节流和字符流字符流的由来:其实就是字节流读取文字字节 ...
- Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)
声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutpu ...
- Java IO(Properties/对象序列化/打印流/commons-io)
Java IO(Properties/对象序列化/打印流/commons-io) Properties Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载. ...
随机推荐
- 利用 Flask 动态展示 Pyecharts 图表数据的几种方法
本文将介绍如何在 web 框架 Flask 中使用可视化工具 pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法,不会的话你来找我呀- Flask 模板渲染 1. 新建一个项目fla ...
- 用workspace管理工程,并解决多静态库依赖
from:http://www.cnblogs.com/perryxiong/p/3759818.html 最近我在项目中遇到一些工程之间的管理问题. 模型: 其中 库A 是一个公共的基础静态库, ...
- [TimLinux] 命令 procps-ng 包内命令介绍
1. procps-ng包 System and process monitoring utilities. 2. 文件列表 free, pgrep, pkill, pmap, ps, pwdx, s ...
- zabbix自动发现与自动注册、自定义监控
一.自动发现与自动注册在上面的介绍中,我们演示了手动添加一台主机的方法,虽然简单,但是当要添加的主机非常多时,也将变得非常繁琐,那么有没有一种方法,可以实现主机的批量添加呢,这样就会极大的提高运维效率 ...
- 利用Python爬虫轻松挣外快的几个方法(值得收藏)
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:小猿猿er 在下写了10年Python,期间写了各种奇葩爬虫,挣各种奇葩 ...
- LInux内核配置过程
内核版本 linux 2.6.32.2 配置内核的过程 配置内核可以通过执行 make menuconfig 来进行,下面分析该命令的执行流程 执行该目标 %config: scripts_basic ...
- mysql外连接
一,起因 在学习一个新知识之前,最好先了解一下你为何要学习这个知识,这个知识或技术能帮你做什么,可以给你带来哪些帮助.因此我先交代一下写这篇随笔的起因. 我在做项目的时候遇到了一个比较有意思的情况, ...
- sendRedirect()和forward()方法有什么区别?
forward是服务器内部的跳转,浏览器的地址栏不会发生变化,同时可以把request和response传递给后一个请求.sendRedirect()是浏览器方面的跳转,要发送两次请求,地址栏也会发生 ...
- 原生js入门级测试题及答案
01.屏幕打印2000到3000之间的所有的数. <script type="text/javascript"> for (var i = 2000; i < 3 ...
- 如何在Sublime中打开左侧文件夹导航
Sublime中我们可以通过菜单栏的View->Side Bar->Hide Side Bar(Show Side Bar)来显示和隐藏左侧的导航栏,如下图所示. 但是,这里只会显示当前打 ...