zoukankan      html  css  js  c++  java
  • 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对象;

  • 相关阅读:
    虚拟机磁盘和OSNetworkManagement
    虚拟化的设计考量
    魔獸世界台服身份證ID生成器
    完美的Windows Server 2008 R2 SP1 模板
    Windows 脚本主机概述
    创建动态链接库的方法简介
    iPad3越狱方法
    关于用netsh.exe配置系统防火及网络
    金蝶客户端多用户远程桌面解决方案
    poj 1459 最大流(EK实现)
  • 原文地址:https://www.cnblogs.com/guoyansi19900907/p/11111437.html
Copyright © 2011-2022 走看看