ObjectOutput/InputStream 只发送和接收一次对象

Posted

技术标签:

【中文标题】ObjectOutput/InputStream 只发送和接收一次对象【英文标题】:ObjectOutput/InputStream only sends and recevies objects once 【发布时间】:2013-06-24 01:43:07 【问题描述】:

我正在尝试使用套接字发送一个对象,该对象将通过ObjectOutputStream 保存一些信息。当我调用方法Client_Handler(String auth, String user) 并发送对象时它工作正常,但是当我再次调用它时它不起作用。我希望能够使用连接多次发送包含不同数据的对象。

客户:

public void Client_Handler(String auth, String user)
        try
        socket2 = new Socket(serverAddress, 8080);
        User_Authorization us3 = new User_Authorization();
        ObjectOutputStream out2 = new ObjectOutputStream(socket2.getOutputStream());
        us3.set_name(user);
        us3.set_authorization(auth);
        out2.writeUnshared(us3);  
        catch(Exception e)
            JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.ERROR_MESSAGE);
          

服务器:

public class Conn implements Runnable
private Socket socket;
public static ServerSocket server ;

public void go()
    Thread r = new Thread(this);
        try
                r.start();
        catch(Exception e)
            JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.ERROR_MESSAGE);
          


@Override
public void run() 
    try
    server = new ServerSocket(8080);
    socket = server.accept(); 
    while(true)
        Login.User_Authorization us = null;            
        ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
        us = (Login.User_Authorization) in.readObject();
    System.out.println(us.get_name()+ "he's " +us.get_authorization());
   
    catch(Exception e)JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.ERROR_MESSAGE);

【问题讨论】:

定义“不起作用”。 再次执行时,没有输出显示,就好像它没有得到任何输入一样。有时它会给我一个 EOFException,但不是每次都给我,这有点奇怪。 ***.com/a/7022301/1490962 我的意思是,每次调用Client_handler 时,您都会创建一个新的Socket ... 一旦调用该方法,前一个方法就消失了。它将被垃圾收集,您的服务器将获得EOF 请参考本教程..journaldev.com/741/java-socket-server-client-read-write-example 【参考方案1】:

当我调用方法 Client_Handler(String auth, String user) 和 发送它工作正常的对象,但是当我再次调用它时它不会 工作。

因为,每次调用Client_Handler(String auth, String user) 方法时,您都试图通过socket2 = new Socket(serverAddress, 8080); 与服务器建立新连接,这将终止先前的连接。这就是为什么您会收到 EOFException 异常。您应该在调用Client_Handler 方法之前创建一次socket2 对象。在调用 Client_Handler 方法时,只需使用初始化的 Socket socket2

你的代码在客户端可能是这样的:

Socket socket2;
ObjectOutputStream out2 = null;
public void mainMethod()

    try
    
        socket2 = new Socket(serverAddress, 8080);  
        out2 = new ObjectOutputStream(socket2.getOutputStream());
        boolean canSend = true;
        while (canSend)
        
            canSend = Client_Handler("authentication","user");
        
    
    catch (Exception ex)
    
        ex.printStackTrace();
    
    finally
    
        if (out2!=null)
        
            try
            
                out2.close();
            
            catch (Exception ex)
            
                ex.printStackTrace();
            
        
    

public boolean Client_Handler(String auth, String user)

    try
    
        User_Authorization us3 = new User_Authorization();
        us3.set_name(user);
        us3.set_authorization(auth);
        out2.writeUnshared(us3);  
    catch(Exception e)
    
        JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.ERROR_MESSAGE);
        return false;
      
    return true;

【讨论】:

我在方法之外创建了 'socket2' 对象,但是这次我再次调用它时得到了 'java.io.StreamCorruptedException: invalid type code: AC'。 顺便说一句,我可以在同一个程序中使用两个不同端口号的套接字吗?? 查看我的更新。是的,您可以在同一程序中使用具有不同端口号的两个套接字。但是您应该在两个单独的线程中对两个套接字输入/输出流调用读/写操作..因为它们是阻塞操作并且会阻塞线程... 是的..我根据我的看法定义了它,因为你没有发布你的所有代码.. 无论你在哪里调用这个方法..确保SocketObjectOutputStream的对象只被创建一次并且在Client_Handler方法之前也是如此叫。我会建议你把你正在使用的客户端的整个代码......

以上是关于ObjectOutput/InputStream 只发送和接收一次对象的主要内容,如果未能解决你的问题,请参考以下文章