working v 1.0
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,90 @@
|
||||
package javaChat;
|
||||
|
||||
import java.net.* ;
|
||||
import java.io.* ;
|
||||
|
||||
public class ChatClient
|
||||
{
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param args
|
||||
* @throws IOException
|
||||
*/
|
||||
public static void main( String[] args ) throws IOException
|
||||
{
|
||||
// Get server IP
|
||||
BufferedReader keyboard = new BufferedReader( new InputStreamReader( System.in ) ) ;
|
||||
System.out.print( "\nPlease enter the IP of the desired server: " ); // GUI: IP BOX
|
||||
|
||||
String serverIP = keyboard.readLine() ;
|
||||
|
||||
// Open your connection to a server, at port 6789
|
||||
Socket socket = new Socket( serverIP , 6789 ) ;
|
||||
|
||||
// Create communication streams
|
||||
DataInputStream dataStreamIn = new DataInputStream( socket.getInputStream() ) ;
|
||||
DataOutputStream dataStreamOut = new DataOutputStream( socket.getOutputStream() ) ;
|
||||
|
||||
// Establish connection, make user-name
|
||||
System.out.print( "\nConnection established,\nPlease enter a username: " ) ;
|
||||
String username = keyboard.readLine() ;
|
||||
dataStreamOut.writeUTF( username ) ;
|
||||
|
||||
/////////////////////////
|
||||
//// Program Running ////
|
||||
/////////////////////////
|
||||
|
||||
// Thread for sending messages
|
||||
Thread sendMessage = new Thread(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
System.out.print( "\n-= Type /help for a list of commands =-" ) ;
|
||||
while( true )
|
||||
{
|
||||
try
|
||||
{
|
||||
String messageOut = keyboard.readLine() ;
|
||||
dataStreamOut.writeUTF( messageOut ) ;
|
||||
}
|
||||
catch( IOException x )
|
||||
{
|
||||
x.printStackTrace() ;
|
||||
System.exit( 0 ) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}) ;
|
||||
|
||||
// Thread for receiving messages
|
||||
Thread receiveMessage = new Thread( new Runnable()
|
||||
{
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
while( true )
|
||||
{
|
||||
try
|
||||
{
|
||||
String messageIn = dataStreamIn.readUTF() ;
|
||||
System.out.printf( "%n%s\n", messageIn ) ;
|
||||
}
|
||||
catch( IOException x )
|
||||
{
|
||||
x.printStackTrace() ;
|
||||
System.exit( 0 ) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Begin threads
|
||||
sendMessage.start() ;
|
||||
receiveMessage.start() ;
|
||||
}
|
||||
}
|
||||
// end class ChatClient
|
||||
@@ -0,0 +1,237 @@
|
||||
package javaChat;
|
||||
|
||||
import java.net.* ;
|
||||
import java.util.* ;
|
||||
import java.io.* ;
|
||||
|
||||
public class ChatServer
|
||||
{
|
||||
|
||||
// List of all active users in Server
|
||||
static ArrayList<ClientHandler> userList = new ArrayList<>() ;
|
||||
|
||||
/**
|
||||
* Accepts Client requests to join chat server, and
|
||||
* creates new thread for each individual client.
|
||||
*
|
||||
* @param args
|
||||
* @throws IOException
|
||||
*/
|
||||
public static void main( String[] args ) throws IOException
|
||||
{
|
||||
|
||||
// Register service on port 6789
|
||||
ServerSocket serverSocket = new ServerSocket( 6789 ) ;
|
||||
Socket socket = null ;
|
||||
|
||||
System.out.println( "\nServer established. Awaiting connections..." ) ;
|
||||
|
||||
// Accept client requests
|
||||
while( true )
|
||||
{
|
||||
socket = serverSocket.accept() ;
|
||||
|
||||
DataOutputStream dataStreamOut = new DataOutputStream( socket.getOutputStream() ) ;
|
||||
DataInputStream dataStreamIn = new DataInputStream ( socket.getInputStream() ) ;
|
||||
|
||||
System.out.println( "\nClient connection detected, requesting username..." ) ;
|
||||
String username = dataStreamIn.readUTF() ;
|
||||
|
||||
ClientHandler handle = new ClientHandler( socket, username, dataStreamOut, dataStreamIn ) ;
|
||||
|
||||
System.out.println( "\nCreating new thread...\n" ) ;
|
||||
Thread thread = new Thread( handle ) ;
|
||||
|
||||
userList.add( handle ) ;
|
||||
|
||||
thread.start() ;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
// end class ChatClient
|
||||
|
||||
|
||||
|
||||
|
||||
// This class manages the actual messages being sent around
|
||||
@SuppressWarnings( "javadoc" )
|
||||
class ClientHandler implements Runnable
|
||||
{
|
||||
|
||||
Socket socket ;
|
||||
String username ;
|
||||
final DataOutputStream dataStreamOut ;
|
||||
final DataInputStream dataStreamIn ;
|
||||
boolean loggedIn ;
|
||||
private ArrayList<ClientHandler> userList ;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
* @param s : client socket
|
||||
* @param user : client's user-name
|
||||
* @param dos : data stream to client
|
||||
* @param dis : data stream from client
|
||||
*/
|
||||
public ClientHandler( Socket s, String user,
|
||||
DataOutputStream dos,
|
||||
DataInputStream dis )
|
||||
{
|
||||
this.username = user ;
|
||||
this.socket = s ;
|
||||
this.dataStreamOut = dos ;
|
||||
this.dataStreamIn = dis ;
|
||||
this.loggedIn = true ;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
|
||||
// Note the connection of the new user
|
||||
String announcement = String.format( "-= User \"%s\" has successfully connected =-\n", this.username ) ;
|
||||
System.out.println( announcement ) ;
|
||||
|
||||
// Distribute announcement to entire server
|
||||
distributeAll( announcement ) ;
|
||||
|
||||
// Message management
|
||||
String message = "" ;
|
||||
while( true )
|
||||
{
|
||||
// Read incoming messages
|
||||
try
|
||||
{
|
||||
message = this.dataStreamIn.readUTF() ;
|
||||
}
|
||||
catch ( IOException x )
|
||||
{
|
||||
x.printStackTrace() ;
|
||||
}
|
||||
|
||||
// Check message for user commands, returns TRUE is user quits
|
||||
if( commands(message, this) )
|
||||
{
|
||||
break ;
|
||||
}
|
||||
|
||||
// Print the message server-side
|
||||
message = String.format( "%s: %s", this.username, message ) ;
|
||||
System.out.println( message ) ;
|
||||
|
||||
// Distribute the message to all users
|
||||
sendMessage( message ) ;
|
||||
// end try
|
||||
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
this.loggedIn = false ;
|
||||
this.socket.close() ;
|
||||
}
|
||||
catch( IOException x )
|
||||
{
|
||||
x.printStackTrace() ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// This method manages the usage of user-commands
|
||||
public boolean commands(String message, ClientHandler user)
|
||||
{
|
||||
String[] commands = new String[] {"/help", "/quit", "/userlist"} ;
|
||||
|
||||
try {
|
||||
|
||||
// Quit command terminates connection, with an announcement
|
||||
if( message.equals( "/quit" ))
|
||||
{
|
||||
String announcement = String.format( "\n-= \"%s\" has disconnected =- \n", user.username ) ;
|
||||
System.out.println( announcement ) ;
|
||||
distributeAll( announcement ) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
if( message.equals( "/userlist" ) )
|
||||
{
|
||||
user.dataStreamOut.writeUTF( "Current list of users in the server: " ) ;
|
||||
for( ClientHandler users : ChatServer.userList )
|
||||
{
|
||||
if( !users.loggedIn )
|
||||
{
|
||||
continue ;
|
||||
}
|
||||
|
||||
user.dataStreamOut.writeUTF( users.username ) ;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if( message.contentEquals( "/help" ) )
|
||||
{
|
||||
user.dataStreamOut.writeUTF( "\nAll available commands: " );
|
||||
for(int i = 0; i < commands.length; i++ )
|
||||
{
|
||||
user.dataStreamOut.writeUTF( commands[i] );
|
||||
}
|
||||
|
||||
user.dataStreamOut.writeUTF( "\n" ) ;
|
||||
}
|
||||
}
|
||||
|
||||
catch( IOException x )
|
||||
{
|
||||
System.out.println( x ) ;
|
||||
}
|
||||
|
||||
return false ;
|
||||
}
|
||||
|
||||
|
||||
// Convenience method to send messages (but not to the user that's sending the message)
|
||||
private void sendMessage(String message)
|
||||
{
|
||||
try
|
||||
{
|
||||
for( ClientHandler users : ChatServer.userList )
|
||||
{
|
||||
if( !users.loggedIn || users.equals( this ) )
|
||||
{
|
||||
continue ;
|
||||
}
|
||||
users.dataStreamOut.writeUTF( "> " + message ) ;
|
||||
}
|
||||
}
|
||||
catch ( IOException x )
|
||||
{
|
||||
x.printStackTrace() ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Convenience method to distribute messages to all clients (announcements)
|
||||
private void distributeAll(String message)
|
||||
{
|
||||
try
|
||||
{
|
||||
for( ClientHandler users : ChatServer.userList )
|
||||
{
|
||||
if( !users.loggedIn )
|
||||
{
|
||||
continue ;
|
||||
}
|
||||
users.dataStreamOut.writeUTF( message ) ;
|
||||
}
|
||||
}
|
||||
catch ( IOException x )
|
||||
{
|
||||
x.printStackTrace() ;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
// end class ClientHandler
|
||||
@@ -6,4 +6,5 @@
|
||||
*
|
||||
*/
|
||||
module javaChat
|
||||
{}
|
||||
{
|
||||
requires java.desktop;}
|
||||
Reference in New Issue
Block a user