JAVA:序列化在本地计算机上运行良好,但是当我在局域网中执行此操作时,它输出不正确

时间:2017-09-10 07:58:06

标签: java networking serialization client-server

我想将具有操作系统名称的对象发送到服务器。此OS名称输出应该是PC发送对象,但它显示运行服务器的PC的OS名称..

这是我的代码:

//客户端:它可以将数据即对象发送到服务器     class Client

{

        private Socket socket = null;


private ObjectOutputStream outputStream = null;

    public Client(String con){

System.out.println("conn value: "+con);

java.util.Timer t = new java.util.Timer();

try{

socket = new Socket(con, 27051);

t.scheduleAtFixedRate(new TimerTask() {

 @Override

    public void run() {

    try {

outputStream = new ObjectOutputStream(socket.getOutputStream());

SI sysinfo=new SI();

 outputStream.writeObject(sysinfo);

System.out.println("Sent Data: "+sysinfo.otherInfo());


}  catch (Exception se) {

   t.cancel();

}

 }
 },  0, 1);

}

catch(Exception em)

{

  }

}

}

//Server class: should receive data from client

class Server extends SwingWorker<Void,Void>{

   Socket csocket=null;  

        protected Void doInBackground() throws Exception {



        final ServerSocket ssock = new ServerSocket(27051);

System.out.println("Server Listening..!!");


      while (true) {

           try{

          Socket sock = ssock.accept();

         new Thread(new Server(sock)).start();

           }

           catch(Exception e){

               System.out.println("unabke to create socket");

           }

     }   


   }

      Server() throws Exception{

          doInBackground();

      }

   Server(Socket csocket) {

       this.csocket=csocket;

       Thread t1=new Thread(r1);

   t1.start();

   }

   Runnable r1=new Runnable()

   {

   public void run() {

     try {  

         System.out.println("Run initated");

          while(true)

       {


          if(csocket.isClosed())

          {

break;
          }


          else{

System.out.println(csocket);

    ObjectInputStream inStream = new 

ObjectInputStream(csocket.getInputStream());

SI sysinfo= (SI) inStream.readObject();


System.out.println("Received: "+sysinfo.otherInfo());

System.out.println(ObjectStreamClass.lookup(sysinfo.getClass()).getSerialVersion
UID());


   }
          }


      }

 catch (Exception e) {

System.out.println("Exception"+ e.getMessage());
       }

            }
   };

}

//正在进行序列化的类

public class SI implements Serializable

{ 

 private static final long serialVersionUID = 1L;     

String otherInfo()

{

 OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) ManagementFactory
            .getOperatingSystemMXBean();



String os_name=bean.getName();

return os_name;  

}

}

// A类:它具有主要功能,它首先执行,用户决定他/她是否想要处于服务器模式或客户端模式。由于用户不能同时处于2种模式..

class A

{

public static void main(String[] args) throws Exception

{

    System.out.println("Enter 0 for Server 1 for Client Mode");

Scanner s=new Scanner(System.in);

int i=s.nextInt();

if(i==0)

{

    Server ser=new Server();

ser.execute();

}

else if(i==1)

{

    System.out.println("Enter IP");

String conn=s.next();

Client c=new Client(conn);

}

else

    System.out.println("Invalid Selection exit..");

}

}

1 个答案:

答案 0 :(得分:0)

正如我在评论中所写,您必须传输数据,而不是功能。下面的一些示例代码......

首先,按如下方式更改SI类:

public class SI implements Serializable { 
    private static final long serialVersionUID = 1L;
    private String osName;

    public void setOsName(String osName) { this.osName = osName; }
    public void getOsName() { return this.osName; }
}

其次,修改您的客户端以首先确定操作系统并构建SI对象...

...
OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) ManagementFactory
        .getOperatingSystemMXBean();
String osName=bean.getName();

SI sysinfo = new SI();
sysinfo.setOsName(osName);

...
outputStream.writeObject(sysinfo);
...

第三,相应地修改你的服务器。