关于java socket输入输出流创建的几点注意

上传人:第*** 文档编号:32745435 上传时间:2018-02-12 格式:DOC 页数:4 大小:37.36KB
返回 下载 相关 举报
关于java socket输入输出流创建的几点注意_第1页
第1页 / 共4页
关于java socket输入输出流创建的几点注意_第2页
第2页 / 共4页
关于java socket输入输出流创建的几点注意_第3页
第3页 / 共4页
关于java socket输入输出流创建的几点注意_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《关于java socket输入输出流创建的几点注意》由会员分享,可在线阅读,更多相关《关于java socket输入输出流创建的几点注意(4页珍藏版)》请在金锄头文库上搜索。

1、关于 Java 输入输出流创建的几点注意(原创)Java 的 Socket 通过创建输入输出流(InputStream 和 OutputStream)来交换信息,但是在创建输入输出流的时候需要注意以下两点:1、无论是服务器端 ServerSocket 通过 accept()方法接收到的 Socket,还是客户端连接服务器端的 Socket,在创建输入输出流时不允许两个同时首先创建输入流,否则会堵塞 Socket通道。示例:(示例程序没有导入包,而是直接用的类全部路径)服务器端:public static void main(String args) System.out.println(#服务

2、器启动#);try .ServerSocket ss = new .ServerSocket(6667);.Socket s = ss.accept();java.io.ObjectInputStream ois = new java.io.ObjectInputStream(s.getInputStream();java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(s.getOutputStream();System.out.println(String) ois.readObject();oos.writeObjec

3、t(你好,客户端); catch (IOException e) e.printStackTrace(); catch (ClassNotFoundException e) e.printStackTrace();客户端:public static void main(String args) System.out.println(客户端启动);try .Socket s=new .Socket(192.168.1.101,6667);java.io.ObjectInputStream ois=new java.io.ObjectInputStream(s.getInputStream();j

4、ava.io.ObjectOutputStream oos=new java.io.ObjectOutputStream(s.getOutputStream();oos.writeObject(你好,服务器!);System.out.println(String)ois.readObject(); catch (UnknownHostException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); catch (ClassNotFoundException e) e.printStackTrace();上面

5、的示例程序均是通过 Socket 首先创建 ObjectInputStream,接下来客户端先写入(服务器先读取) ,然后服务器写入(客户端读取) 。但是程序的执行结果会停留在服务器和客户端的连接上,而不会相互传输到达任何数据。 (即两端的 Socket 处于阻塞状态) 。解决的方法是:(服务器或客户端其中任意一个,首先创建一个输出流,或者全部首先创建输出流再建输入流) ,例如:可以让客户端首先建立输出流:(当然也可以两个端均首先创建输出流)java.io.ObjectOutputStream oos=new java.io.ObjectOutputStream(s.getOutputStre

6、am();java.io.ObjectInputStream ois=new java.io.ObjectInputStream(s.getInputStream();注意:以上创建输入输出流的顺序和之后通过输入输出流读写的顺序无关!2、服务器 Socket 和客户端 Socket 可以创建多个输入输出流对象,但是两端创建的个数必须保持对应,即通过客户端 Socket 创建多少个输入输出流对象,对应的服务器端的ServerSocket 通过 accepte()方法接收到 Socket 也必须创建多少个输入输出流对象。示例:服务器端:public class ServerSocketTest p

7、rivate static java.io.ObjectOutputStream oos;private static java.io.ObjectInputStream ois;public static void main(String args) System.out.println(#服务器启动#);try .ServerSocket ss = new .ServerSocket(6667);.Socket s = ss.accept();oos = new java.io.ObjectOutputStream(s.getOutputStream();ois= new java.io.

8、ObjectInputStream(s.getInputStream();System.out.println(String) ois.readObject();oos.writeObject(你好,客户端);oos = new java.io.ObjectOutputStream(s.getOutputStream();ois = new java.io.ObjectInputStream(s.getInputStream();System.out.println(String) ois.readObject();oos.writeObject(你好,第二次接收!); catch (IOEx

9、ception e) e.printStackTrace(); catch (ClassNotFoundException e) e.printStackTrace();通过 Socket获取两对输入输出流对象,赋值给同一对输入输出对象。客户端:上面的示例程序服务器端接收到的 Socket 先后创建了两对输入输出流对象并分别向客户端传输一次数据,而客户端只创建了一对,用这一对向服务器传输两次数据。但是执行结果是:只有第一对会被接收到,第二对会抛出 java.io.StreamCorruptedException 异常,即显示毁坏的流异常。解决的方法是:如果服务器端 ServerSocket 通

10、过 accepte()方法接收到 Socket 创建多少对输入输出流对象,那么对应的客户端的 Socket 也必须创建多少对输入输出流对象。第二点注意特别适用跳转方法执行,而方法的参数包含 Socket 变量,此时需要在方法体中通过 Socket 重新创建输入输出流,这时就尤为注意另一端的 Socket 必须也要重新创建流才行,而且一旦重新创建流,原来的流并不会失效!即一个 Socket 可以创建多对流通道!直public class ClientSocket private static java.io.ObjectOutputStream oos;private static java.i

11、o.ObjectInputStream ois;public static void main(String args) System.out.println(客户端启动);try .Socket s = new .Socket(192.168.1.101, 6667);oos = new java.io.ObjectOutputStream(s.getOutputStream();ois= new java.io.ObjectInputStream(s.getInputStream();oos.writeObject(你好,服务器!);System.out.println(String) o

12、is.readObject();oos.writeObject(你好,第二次传送);System.out.println(String) ois.readObject(); catch (UnknownHostException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); catch (ClassNotFoundException e) e.printStackTrace();通过 Socket 只创建了一对输入输出流对象,向传输两次数据到任意的流或者 Socket 通过 close 方法关闭才会全部停止。 (这也是为何以上创建的流对数不统一会造成异常的原因所在)注明:1、以上测试均是在 windows 32bit JDK 1.7 版本下通过 eclipse 测试,不知道是 Java 本身原因(可能其他语言(如 C+)不用注意) ,还是 JDK 版本原因(我想这个可能性不大) 。2、欢迎转载,转载时请注明!谢谢合作!(另本人正在求职中,咨询或者公司物色欢迎邮件联系:)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号