2012-02-25 69 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尝试读取其构造函数中的序列化标头,如果输出流尚未写入,它将等待。现在,客户端和服务器都在等待对方先“说”。