Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ObjectOutput/InputStream只发送和接收对象一次_Java_Sockets_Serializable_Objectinputstream_Objectoutputstream - Fatal编程技术网

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

Java ObjectOutput/InputStream只发送和接收对象一次,java,sockets,serializable,objectinputstream,objectoutputstream,Java,Sockets,Serializable,Objectinputstream,Objectoutputstream,我正在尝试使用套接字通过ObjectOutputStream发送一个包含一些信息的对象。当我调用方法Client\u Handler(stringauth,stringuser)并发送对象时,它工作正常,但当我再次调用它时,它不工作。我希望能够使用连接多次发送包含不同数据的对象 客户: public void Client_Handler(String auth, String user){ try{ socket2 = new Socket(serverAddr

我正在尝试使用套接字通过
ObjectOutputStream
发送一个包含一些信息的对象。当我调用方法
Client\u Handler(stringauth,stringuser)
并发送对象时,它工作正常,但当我再次调用它时,它不工作。我希望能够使用连接多次发送包含不同数据的对象

客户:

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);}
}
当我调用方法Client_处理程序(stringauth,stringuser)和 发送对象它工作正常,但当我再次调用它时,它不工作 工作

因为,每次调用
Client\u Handler(String auth,String user)
方法时,您都试图通过
socket2=new Socket(serverAddress,8080)与服务器建立新的连接正在终止上一个连接。这就是为什么会出现
EOFEException
exception。在调用
Client\u Handler
方法之前,应该创建一次
socket2
对象。调用
Client\u Handler
方法时,只需使用初始化的套接字
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;
}

定义“不工作”。当再次执行它时,不会显示任何输出,就好像它没有得到任何输入一样。有时它会给我一个EOFEException,但不是每次,这有点奇怪。我的意思是,每次调用
客户端处理程序时,你都在创建一个新的
套接字
。。。一旦调用该方法,前一个方法就消失了。它将被垃圾收集,您的服务器将获得
EOF
请参阅本教程。。我在方法之外创建了“socket2”对象,但这次我再次调用它时得到了“java.io.StreamCorruptedException:无效类型代码:AC”。顺便说一句,我可以在同一个程序中使用两个端口号不同的套接字吗?请参阅我的更新。。是的,您可以在同一个程序中使用两个端口号不同的套接字。但您应该在两个单独的线程中对两个套接字输入/输出流调用读/写操作。。因为它们正在阻止操作并将阻止线程…是的..我根据我的感觉定义了它,因为您没有发布所有代码..无论您在哪里调用此方法..确保
Socket
ObjectOutputStream
的对象只创建一次,并且在调用客户机处理程序
方法。我建议你把你正在使用的客户端的全部代码。。。。