проблема сокета чата java - PullRequest
       10

проблема сокета чата java

0 голосов
/ 25 февраля 2012

Я работаю над несколькими чатами в 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 голосов
/ 25 февраля 2012

Одна проблема, которую я вижу, состоит в том, что вам нужно решить, кто первым создаст входной поток , сервер или клиент.

ObjectInputStream пытается прочитать заголовок сериализации в своем конструкторе, и если выходной поток еще не записал его, он будет ждать. Теперь и клиент, и сервер ждут, пока другой сначала «заговорит».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...