1

FYI This is homework. I have to build a Java Chat server. I have been able to build a server which communicates with 1 client. But I need this to communicate with multiple users.

A user is supposed to type in the person's name they wish to talk to followed by a dash (-) and then the message to be sent. I am able to get users signed on but I am not able to get the list of users to print out or the messages to send to other users. Here is the server code:

/** 
    Threaded Server
*/

import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Set;

public class ThreadedServer
{
    public static void main( String[] args) throws Exception
    {
        HashMap<String, Socket> users = new HashMap<String, Socket>( );
        ServerSocket server = new ServerSocket(5679);
        System.out.println( "THE CHAT SERVER HAS STARTED! =)" );
        while(true)
        {
            Socket client = server.accept();
            ThreadedServer ser = new ThreadedServer();
            ClientFromThread cft =ser.new ClientFromThread(client);
            String name = cft.getUserName();
            users.put( name, client );
            cft.giveUsersMap( users );
            //cft.giveOnlineUsers( ); //DOES NOT WORK YET!!!!
            System.out.println("Threaded server connected to " 
                        + client.getInetAddress() + "  USER: " + name );            
        } 

    }

    //***************************************************************************************************

    class ClientFromThread extends Thread
    {
        private Socket client;
        private Scanner fromClient;
        private PrintWriter toClient;
        private String userName;
        HashMap<String, Socket> users;

        public ClientFromThread( Socket c ) throws Exception
        {
            client = c;
            fromClient = new Scanner( client.getInputStream() );
            toClient = new PrintWriter( client.getOutputStream(), true );
            userName = getUser();
            start();
        }
        public void giveUsersMap( HashMap<String, Socket> users )
        {
            this.users = users;
        }

        //THIS DOESNT WORK YET... IT PRINTS THE FIRST LINE BUT NOT THE LIST
        public void giveOnlineUsers()
        {
            toClient.println("These users are currently online:");
            Set<String> userList = users.keySet();
            String[] userNames = null;
            userList.toArray( userNames );

            for( int i = 0; i< userNames.length; i++ )
            {
                toClient.println(userNames[i]);
            }
        }

        public String getUserName()
        {
            return userName;
        }

        private String getUser()
        {
            String s = "";
            while( (s.length() < 1) || (s == null) )
            {
                toClient.println("What is your first name? ");
                s=fromClient.nextLine().trim();
            }
            toClient.println("Thank You! Welcome to the chat room " + s + ".");
            return s.toUpperCase();
        }

        public void run() 
        {
            String s = null;
            String toUser;
            String mesg;

            while( (s=fromClient.nextLine().trim()) != null )
            {
                if( s.equalsIgnoreCase( "END" )) break;

                for( int i=0; i<s.length(); i++)
                {
                    if( s.charAt(i) == '-' )
                    {
                        toUser = s.substring( 0, i ).trim().toUpperCase();
                        mesg = s.substring( i+1 ).trim();
                        Socket client = users.get( toUser );
                        try
                        {
                            ClientToThread ctt = new ClientToThread(client);
                            ctt.sendMesg( mesg, toUser );
                            ctt.start();
                        }
                        catch(Exception e){e.printStackTrace();}
                        break;
                    }
                    if( (i+1) == s.length() )
                    {
                        toClient.println("Sorry the text was invalid. Please enter a user name " +
                                                     "followed by a dash (-) then your message.");
                    }
                }
            }
            try
            {
                fromClient.close();
                toClient.close();
                client.close();
            }
            catch(Exception e){e.printStackTrace();}
        }

    } //end class ClientFromThread

    //***************************************************************************************************

    class ClientToThread extends Thread
    {
        private Socket client;
        private PrintWriter toClient;
        private String mesg;

        public ClientToThread( Socket c ) throws Exception
        {
            client = c;
            toClient = new PrintWriter( client.getOutputStream(), true );
        }

        public void sendMesg( String mesg, String userName )
        {
            this.mesg = userName + ": " + mesg;
        }
        public void run() 
        {
            toClient.println(mesg);

            try
            {
                toClient.close();
                client.close();
            }
            catch(Exception e){e.printStackTrace();}
        }

    } //end class ClientToThread

    //***************************************************************************************************

} //end class ThreadedServer

Here is the Client code"

import java.net.Socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;


public class ReverseClient 
{
public static void main( String[] args ) throws Exception
{
    String line = null;
    Socket server= new Socket( "10.0.2.103", 5679);
    System.out.println( "Connected to host: " + server.getInetAddress() );
    BufferedReader fromServer = new BufferedReader(
                new InputStreamReader(server.getInputStream()) );
    PrintWriter toServer = new PrintWriter( server.getOutputStream(), true );
    BufferedReader input = new BufferedReader( 
                new InputStreamReader(System.in) );
    while( (line=input.readLine()) !=null )
    {
        toServer.println(line);
        System.out.println( fromServer.readLine() );
    }
    fromServer.close();
    toServer.close();
    input.close();
    server.close();

}   
}

Here is the console output (the top is the server, bottom is the client): alt text

I am getting errors (as shown in the image above) and the messages are not sending. Any suggestions on how to take care of these issues?

4

2 回答 2

1

到目前为止,我发现这是一个问题,但我不认为这是唯一的问题..

这将有助于 NoSuchElementException 在第 90 行左右更改此...

while( (s=fromClient.nextLine().trim()) != null )
{

对这个……

while(fromClient.hasNext())
{
   s = fromClient.nextLine().trim();

好的,刚刚在 ClientToThread.run() 中发现了另一个问题...您在发送第一条消息后正在关闭客户端连接。我评论了他们两个,它似乎工作得更好一点。

public void run()
  {
     toClient.println(mesg);
     try {
        //toClient.close();
        //client.close();
     }
     catch (Exception e)  {
        e.printStackTrace();
     }
  }
于 2009-10-18T03:09:29.507 回答
0

您的第一个问题是解析来自用户的消息。

您遍历字符串,它有两个选项之一,字符是破折号或者它是无效的。

因此,理想情况下,您应该在破折号之前收到用户名中字符数的无效消息。

您应该使用 String.indexOf 来确定破折号的位置,然后将消息分成两部分,如果 indexOf 的结果为 -1 则它是无效消息。

于 2009-10-18T03:03:06.197 回答