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
|
module javaChat
|
||||||
{}
|
{
|
||||||
|
requires java.desktop;}
|
||||||
Reference in New Issue
Block a user