[英]Multiple types of objects through an ObjectInputStream in Java
[英]Recieving objects through ObjectInputStream (Java)
它是Java中的Messenger應用程序。 我想發送對象而不只是文本,我認為它要好得多。 我為每個連接的客戶端使用一個ServerSocketChannel和一個新線程。
-相同的包,相同的構造函數,相同的serialVersionUID 。 它只是打印出“之前”命令,無法讀取客戶端的對象。
服務器代碼的一部分:
public static void startServer(){
try{
ServerSocketChannel ssc=ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress(hostName,portNumber));
while(isServerRunning()){
removeLoggedOutClients();
try{
SocketChannel sc=ssc.accept();
Socket s=sc.socket();
ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
Client cli=null;
System.out.println("before");
cli=(Client)ois.readObject();
System.out.println("after");
ois.close();
if(checkLogin(cli)){
System.out.println(cli.getUsername()+" signed in.");
cli.setSocket(s);
ClientThread ct=new ClientThread(s,cli.getClientID());
ct.setDaemon(true);
clientThreads.add(ct);
ct.start();
}
}
catch(Exception e){
Error err=new Error("Server","void startServer()",2,e.toString());
}
}
}
catch(Exception e){
Error err=new Error("Server","void startServer()",1,e.toString());
}
}
客戶代碼的一部分:
public static void connectToServer(Client user){
try{
SocketChannel sc=SocketChannel.open();
sc.configureBlocking(true);
sc.connect(new InetSocketAddress(serverHostName,serverPortNumber));
Socket s=sc.socket();
ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
oos.writeObject(user);
oos.flush();
RecieveThread rt=new RecieveThread(s,ois,user);
rt.setDaemon(true);
rt.start();
setOut(oos);
}
catch(Exception e){
Error err=new Error("Client","connectToServer(Client user)",1,e.toString());
}
}
(我的“ Error”類的目的是將所有可能的異常插入數據庫。)
主要問題是您要在客戶端中創建ObjectInputStream
:這將阻塞,直到在對等ObjectOutputStream
創建ObjectOutputStream
,並且您沒有創建(至少不在發布的代碼中)。 您需要立即在兩端按順序創建ObjectOutputStream
和ObjectInputStream,
。
但是,您還有其他問題。 除了接受連接之外,您不應該在accept循環中執行任何I / O操作。 所有對象流的創建,登錄等都應在創建用於處理連接的線程中完成,並且NB不在其構造函數中,而是在其run()
方法中。 否則,一個無賴或故障的客戶端可能會阻塞整個系統。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.