0

我试图通过使用套接字发送一个对象,将通过ObjectOutputStream持有一些信息。当我打电话给方法Client_Handler(String auth, String user)并发送它的工作正常的对象,但是当我再次调用它不起作用。我希望能够使用连接多次发送包含不同数据的对象。ObjectOutput/InputStream只发送和接收对象一次

客户端:

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);} 
} 
+1

定义“不工作”。 –

+0

当再次执行时,没有输出显示,如果它没有得到任何输入。有时它会给我一个EOFException,但不是每次都有,这有点奇怪。 –

+0

http://stackoverflow.com/a/7022301/1490962 –

回答

1

当我调用该方法的Client_Handler(字符串权威性,字符串用户)和 发送正常工作的对象,但是当我打电话它再次没有 工作。

因为,每次你调用Client_Handler(String auth, String user)方法,你正在试图建立与服务器通过socket2 = new Socket(serverAddress, 8080);被终止以前的连接的新的连接时间。这就是为什么你会得到EOFException例外。在调用Client_Handler方法之前,您应该创建一个socket2对象。在调用Client_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; 
} 
+0

我在方法外创建'socket2'对象,但这次我当我再次调用它时,得到了'java.io.StreamCorruptedException:无效的类型代码:AC'。 –

+0

顺便说一句,我可以在同一个程序中使用两个具有不同端口号的套接字吗? –

+1

看我的更新..是的,你可以在同一个程序中使用两个不同端口号的套接字。但你应该在两个独立的线程中调用对两个套接字输入/输出流的读/写操作..因为它们阻塞了操作并会阻塞线程... –