• 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对象;

  • 相关阅读:
    父目录权限子目录权限关系
    微信自媒体账号涉违规大规模被封
    微信支付接口申请指南
    微信公众平台开发(83) 生成带参数二维码
    百度天气预报接口
    微信支付全面开放
    公众平台商户接入(微信支付)功能申请教程
    移动互联网流量变现模式调研问卷
    天气预报接口
    微信公众平台开发(82) 天气预报
  • 原文地址:https://www.cnblogs.com/guoyansi19900907/p/11111437.html
Copyright © 2020-2023  润新知