java聊天套接字麻烦

时间:2012-02-25 17:51:24

标签: java sockets chat

我正在使用java进行多聊天。我对这个插座的东西有点新意。 我的代码有问题,但我找不到它。我认为问题出在clientSocket.getInputStream(); 。我在此语句之前和之后插入了System.out.println。我看不到第二个。似乎客户端可以连接到端口但无法从服务器获取输入。如果你能帮助我,我真的很感激。已经3个小时但我仍然找不到问题

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();}

    }

}

1 个答案:

答案 0 :(得分:0)

我看到的一个问题是你必须决定谁首先创建输入流,服务器或客户端。

ObjectInputStream尝试在其构造函数中读取序列化头,如果输出流尚未写入,则它将等待。现在客户端和服务器都在等待另一个人来说&#34;说&#34;第一