working v 1.0

This commit is contained in:
O'Shea
2020-12-05 17:11:53 -05:00
parent 54b8ea3ac5
commit b7ff7847e9
9 changed files with 329 additions and 1 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+90
View File
@@ -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
+237
View File
@@ -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
+2 -1
View File
@@ -6,4 +6,5 @@
* *
*/ */
module javaChat module javaChat
{} {
requires java.desktop;}