2012-02-25 141 views
0

我正在使用java進行多重聊天。我對這個套接字有點新鮮。 我的代碼存在問題,但找不到它。我認爲問題出在clientSocket.getInputStream(); 。我在這個語句前後插入了System.out.println。我看不到第二個。看起來客戶端可以連接到端口,但不能從服務器獲得輸入。如果你能幫助我,我真的很感恩。它已經有3個小時,但我仍然無法找到問題java聊天套接字問題

ClientSide.java

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 




public class ClientSide 
{ 

    public Socket clientSocket; 
    public ObjectOutputStream outStream; 
    public ObjectInputStream inStream; 
    public String receiveMessage=null,sendMessage=null; 
    public GuiScreen gui; 


    public void run() 
    { 
     try 
     { 
      clientSocket = new Socket("localhost", 2222); 

      inStream = new ObjectInputStream(clientSocket.getInputStream()); 
      outStream = new ObjectOutputStream(clientSocket.getOutputStream()); 
      outStream.flush(); 


      while(true) 
      { 
       try 
       { 
        receiveMessage = (String)inStream.readObject(); 
        gui.appendMessage(receiveMessage); 
       } 
       catch(ClassNotFoundException classNot) 
       {System.err.println("data received in unknown format");} 
      } 
     } 

     catch(UnknownHostException unknownHost) 
     {System.err.println("You are trying to connect to an unknown host!");} 
     catch(IOException ioException) 
     {ioException.printStackTrace();} 


    } 

    public String readMessage() 
    { 
     String text = ""; 

     try 
     { 
      text = (String)inStream.readObject(); 
     } 
     catch (ClassNotFoundException | IOException e) 
     {e.printStackTrace();} 

     return text; 
    } 


    public void sendMessage(String msg) 
    { 
     try 
     { 
      outStream.writeObject(msg); 
      outStream.flush(); 
     } 
     catch(IOException ioException){ioException.printStackTrace();} 
    } 

    public ClientSide() 
    {} 

    private void showGui() 
    { 
     gui = new GuiScreen(this,"Client Side"); 

    } 

    public static void main(String[] args) 
    { 
     ClientSide client = new ClientSide(); 
     client.showGui(); 
     client.run(); 

    } 

} 

MultiCheatServer.java

import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class MultiChatServer 
{ 
    public static ClientThread[] clientThreads = new ClientThread[10]; 

    public static int portNumber = 2222; 
    public static ServerSocket serverSocket = null; 
    public static Socket clientSocket = null; 

    public static void openPort() 
    { 
     try 
     { 
      serverSocket = new ServerSocket(portNumber); 
     } 
     catch (IOException e) 
     {e.printStackTrace();} 

    } 

    public static void connectToClients() 
    { 
     while(true) 
     { 
      try 
      { 
       clientSocket = serverSocket.accept(); 

      } 
      catch (IOException e) 
      {e.printStackTrace();} 


      for(int i = 0; i<=9; ++i) 
      { 
       if(clientThreads[i] == null) 
       { 
        clientThreads[i] = new ClientThread(clientSocket,clientThreads); 
        clientThreads[i].start(); 

        break; 
       } 
      } 

     } 

    } 

    public static void main(String[] args) 
    { 
     openPort(); 
     connectToClients(); 

    } 
} 

ClientThread.java

import java.io.DataInputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.PrintStream; 
import java.net.Socket; 


public class ClientThread extends Thread 
{ 
    public ObjectInputStream inStream = null; 
    public ObjectOutputStream outStream = null; 

    public Socket clientSocket; 
    public ClientThread[] clientThreads; 

    public ClientThread (Socket cSocket,ClientThread[] cThreads) 
    { 
     clientSocket = cSocket; 
     clientThreads = cThreads; 
    } 

    public void sendMessage(String msg) 
    { 
     try 
     { 
      outStream.writeObject(msg); 
      outStream.flush(); 
     } 
     catch (IOException e) 
     {e.printStackTrace();} 

    } 

    public String readMessage() 
    { 
     String text = null; 

     try 
     { 
      text = (String)inStream.readObject(); 
     } 
     catch (ClassNotFoundException | IOException e) 
     {e.printStackTrace();} 

     return text; 
    } 

    public void run() 
    { 
     String text; 
     String name; 

     try 
     { 
      inStream = new ObjectInputStream(clientSocket.getInputStream()); 
      outStream= new ObjectOutputStream(clientSocket.getOutputStream()); 
      outStream.flush(); 

      sendMessage("Name:\n"); 
      name = readMessage().trim(); 
      sendMessage("type /quit if you want to quit\n"); 

      for(int i = 0 ; i <=9 ; ++i) 
       if(clientThreads[i]!=null && clientThreads[i]!=this) 
        clientThreads[i].sendMessage(name + "has come\n"); 

      while(true) 
      { 
       text = readMessage() ; 

       if(text.startsWith("/quit")) 
        break; 

       for(int i = 0; i<=9; ++i) 
        if(clientThreads[i] != null) 
         clientThreads[i].sendMessage("<" + name + ">" + text); 
      } 

      for(int i = 0 ;i<=9; ++i) 
       if(clientThreads[i]!=null && clientThreads[i]!=this) 
        clientThreads[i].sendMessage(name + " has disconnected\n"); 
      sendMessage("Bye\n"); 


      inStream.close(); 
      outStream.close(); 

      for(int i = 0;i<=9;++i) 
       if(clientThreads[i]==this) 
        clientThreads[i] = null; 


     } 
     catch (IOException e) 
     {e.printStackTrace();} 

    } 

} 
+3

問題是什麼?你是否遇到異常?你也可以考慮製作一個[SSCCE](http://ssccce.org)你的問題。 – Jeffrey 2012-02-25 17:54:21

+0

是啊我收到一個異常: java.net.SocketInputStream.read(未知源) 什麼是SSCCE btw – mayy00 2012-02-25 17:59:55

+0

把整個堆棧跟蹤放到你的問題中,一個[SSCCE](http://sscce.org )是一個簡短的,自包含的,正確的(可編譯的)示例。 (我剛剛意識到,我搞砸了第一個鏈接,這個工程。)。 – Jeffrey 2012-02-25 18:03:37

回答

0

的一個問題我看到的是你必須決定誰先創建輸入流,服務器或客戶端。

ObjectInputStream嘗試讀取其構造函數中的序列化標頭,如果輸出流尚未寫入,它將等待。現在,客戶端和服務器都在等待對方先「說」。