package at.ac.uni_linz.tk.vchat; |
|
import java.io.*; |
import java.net.*; |
import java.awt.*; |
import java.awt.image.*; |
|
/** |
* Implements the methods for the client side's networking. Opens a socket |
* connection and Input- and OutputStreams to the ChatServer, sends and receives |
* data. It also includes the functionality for User logins and logouts. |
* |
* @author Arno Huetter (C)opyright by the Institute for Computer Science, |
* Telecooperation Department, University of Linz |
*/ |
|
public class ChatClient implements Runnable { |
|
private Socket clientSocket; |
private Thread clientThread; |
private String host; |
private boolean connected; |
private ChatApplet chatApplet; |
|
private ObjectOutputStream output; |
private ObjectInputStream input; |
|
private UserLoginRequest userLogin; |
|
/** |
* Constructs the ChatClient. |
* |
* @param hostParam |
* the host where the ChatApplet descends from (that is also |
* where the ChatServer ought to be running) |
* @param portParam |
* the standard port where the ChatServer is listening |
* @param chatParam |
* the ChatApplet which administrates the users |
*/ |
|
public ChatClient(String hostParam, ChatApplet chatParam) { |
host = hostParam; |
chatApplet = chatParam; |
} |
|
/** |
* Connects to the ChatServer. |
* |
* @param portParam |
* the port where the ChatServer is listening |
*/ |
|
public void connect( int portParam) { |
try { |
chatApplet.setStatus( "Connecting..." , true ); |
clientSocket = new Socket(host, portParam); |
|
/* |
* Open Input- and OutputStreams |
*/ |
input = new ObjectInputStream(clientSocket.getInputStream()); |
output = new ObjectOutputStream(clientSocket.getOutputStream()); |
|
try { |
Thread.sleep( 1000 ); |
} catch (InterruptedException excpt) { |
} |
|
/* |
* Start the thread that is receiving data |
*/ |
clientThread = new Thread( this ); |
clientThread.start(); |
connected = true ; |
chatApplet.setStatus( "Connected" , true ); |
} catch (Exception excpt) { |
connected = false ; |
System.out.println( "Exception while connecting: " + excpt); |
chatApplet |
.setStatus( |
"Exception while connecting. Server down, firewall config or file-URL applet." , |
true ); |
} |
} |
|
/** |
* Waits for the ChatServer's reply to a login request. |
*/ |
|
public void waitForLoginReply() { |
while (userLogin.status == UserLoginRequest.REQUESTED && connected()) { |
try { |
Thread.sleep( 100 ); |
} catch (InterruptedException excpt) { |
} |
} |
} |
|
/** |
* Connects to the ChatServer and sends a login request for an existing |
* User. |
* |
* @param userNameParam |
* the name of the User to login |
* @param userPasswordParam |
* the password of the User to login |
* @param portParam |
* the port where the ChatServer is listening |
*/ |
|
public void connectAsExistingUser(String userNameParam, |
String userPasswordParam, int portParam) { |
int lastUserId; |
|
connect(portParam); |
if (connected) { |
chatApplet.setStatus( "Connecting as existing user..." , true ); |
chatApplet.stopSimulator(); |
chatApplet.removeAllExceptDefaultRoom(); |
userLogin = new ExistingUserLoginRequest(userNameParam, |
userPasswordParam); |
send(userLogin); |
chatApplet.setStatus( "Waiting for server reply..." , true ); |
waitForLoginReply(); |
if (userLogin.status == UserLoginRequest.ACCEPTED) { |
lastUserId = chatApplet.getCurrentUserId(); |
chatApplet.setCurrentUser(userLogin.user); |
|
if (userLogin.user.getId() != lastUserId) |
chatApplet.removeUser(lastUserId); |
|
chatApplet.restartHistory(); |
chatApplet.setStatus( "Login accepted: " |
+ userLogin.statusString, true ); |
chatApplet.setFrameVisibility( true ); |
} else { |
disconnect(); |
chatApplet.setStatus( "Login denied: " + userLogin.statusString, |
true ); |
} |
} |
} |
|
/** |
* Connects to the ChatServer and sends a login request for a new User. |
* |
* @param userParam |
* the User to login |
* @param portParam |
* the port where the ChatServer is listening |
*/ |
|
public void connectAsNewUser(User userParam, int portParam) { |
int lastUserId; |
|
connect(portParam); |
if (connected) { |
chatApplet.setStatus( "Connecting as new user..." , true ); |
chatApplet.stopSimulator(); |
chatApplet.removeAllExceptDefaultRoom(); |
|
userLogin = new NewUserLoginRequest(userParam); |
send(userLogin); |
chatApplet.setStatus( "Waiting for server reply..." , true ); |
waitForLoginReply(); |
if (userLogin.status == UserLoginRequest.ACCEPTED) { |
lastUserId = chatApplet.getCurrentUserId(); |
chatApplet.setCurrentUser(userLogin.user); |
|
if (userLogin.user.getId() != lastUserId) |
chatApplet.removeUser(lastUserId); |
|
chatApplet.restartHistory(); |
chatApplet.setStatus( "Login accepted: " |
+ userLogin.statusString, true ); |
chatApplet.setFrameVisibility( true ); |
} else { |
disconnect(); |
chatApplet.setStatus( "Login denied: " + userLogin.statusString, |
true ); |
} |
} |
} |
|
/** |
* Disconnects from the ChatServer. |
*/ |
|
public void disconnect() { |
try { |
send( new UserLogoutEvent(chatApplet.getCurrentUserId())); |
if (clientThread != null && clientThread.isAlive()) |
clientThread.stop(); |
if (output != null ) |
output.close(); |
if (input != null ) |
input.close(); |
if (clientSocket != null ) |
clientSocket.close(); |
chatApplet.setStatus( "Disconnected" , true ); |
} catch (IOException excpt) { |
System.out.println( "Exception while disconnecting: " + excpt); |
chatApplet.setStatus( "Exception while disconnecting" , true ); |
} finally { |
connected = false ; |
chatApplet.removeAllExceptCurrentUser(); |
chatApplet.removeAllExceptDefaultRoom(); |
} |
} |
|
/** |
* Runs a thread that is receiving data from the InpuStream openend to the |
* ChatServer. |
*/ |
|
public void run() { |
Object receivedObject; |
User user; |
while (connected) { |
try { |
receivedObject = input.readObject(); |
chatApplet.setStatus( "Receiving data" ); |
if (receivedObject instanceof UserPositionEvent) |
chatApplet.setUserPosition( |
((UserPositionEvent) receivedObject).userId, |
((UserPositionEvent) receivedObject).userPosition, |
false ); |
else if (receivedObject instanceof UserHeadingEvent) |
chatApplet.setUserHeading( |
((UserHeadingEvent) receivedObject).userId, |
((UserHeadingEvent) receivedObject).userHeading, |
false ); |
else if (receivedObject instanceof UserMessageEvent) |
chatApplet.setUserMessage( |
((UserMessageEvent) receivedObject).userId, |
((UserMessageEvent) receivedObject).userMessage, |
false ); |
else if (receivedObject instanceof UserMoodEvent) |
chatApplet.setUserMood( |
((UserMoodEvent) receivedObject).userId, |
((UserMoodEvent) receivedObject).userMood, false ); |
else if (receivedObject instanceof UserRoomEvent) { |
chatApplet.moveUserToRoom( |
((UserRoomEvent) receivedObject).userId, |
((UserRoomEvent) receivedObject).roomId, false ); |
chatApplet.setUserPosition( |
((UserRoomEvent) receivedObject).userId, |
((UserRoomEvent) receivedObject).position, false ); |
} else if (receivedObject instanceof UserUpdateEvent) { |
chatApplet.updateUser( |
((UserUpdateEvent) receivedObject).user, false ); |
if (((UserUpdateEvent) receivedObject).user.getId() == chatApplet |
.getCurrentUserId()) { |
chatApplet |
.setStatus( |
((UserUpdateEvent) receivedObject).statusString, |
false ); |
} |
} else if (receivedObject instanceof UserLoginEvent) |
chatApplet.addUser(((UserLoginEvent) receivedObject).user); |
else if (receivedObject instanceof UserLogoutEvent) { |
chatApplet |
.removeUser(((UserLogoutEvent) receivedObject).userId); |
} else if (receivedObject instanceof NewUserLoginRequest) { |
chatApplet.setStatus( "Received login" , true ); |
userLogin = (NewUserLoginRequest) receivedObject; |
} else if (receivedObject instanceof ExistingUserLoginRequest) { |
chatApplet.setStatus( "Received login" , true ); |
userLogin = (ExistingUserLoginRequest) receivedObject; |
} else if (receivedObject instanceof RoomUpdateEvent) { |
chatApplet.setStatus( "Received room update" , true ); |
chatApplet.updateRoom( |
((RoomUpdateEvent) receivedObject).room, false ); |
} else if (receivedObject instanceof RoomCreateEvent) { |
chatApplet.setStatus( "Received room creation" , true ); |
chatApplet.updateRoom( |
((RoomCreateEvent) receivedObject).room, false ); |
} else if (receivedObject instanceof RoomListEvent) { |
chatApplet.setStatus( "Received room list" , true ); |
chatApplet |
.setRoomTable(((RoomListEvent) receivedObject).roomTable); |
} else if (receivedObject instanceof RoomRemoveEvent) { |
chatApplet.setStatus( "Received room removal" , true ); |
chatApplet.forceRoomRemoval( |
((RoomRemoveEvent) receivedObject).roomId, false ); |
} |
} catch (Exception excpt) { |
System.out.println( "Exception while receiving data: " + excpt |
+ ". Going offline..." ); |
chatApplet.setStatus( |
"Exception while receiving data. Going offline..." , |
true ); |
disconnect(); |
} |
} |
} |
|
/** |
* Sends data over the OutputStream openend to the ChatServer. |
* |
* @param sendObject |
* the object to be sent |
*/ |
|
public void send(Object sendObject) { |
try { |
if (connected) { |
chatApplet.setStatus( "Sending data" ); |
output.writeObject(sendObject); |
} |
} catch (IOException excpt) { |
System.out.println( "Exception while sending data: " + excpt |
+ ". Going offline..." ); |
chatApplet.setStatus( |
"Exception while sending data. Going offline..." , true ); |
disconnect(); |
} |
} |
|
/** |
* Sends data over the OutputStream openend to the ChatServer. |
* |
* @param sendObject |
* the object to be sent |
*/ |
|
public boolean connected() { |
return connected; |
} |
|
/** |
* Returns the host where the ChatClient is opening connections to. |
*/ |
|
public String getHost() { |
return host; |
} |
|
} |
中级程序员
by: 我是路人 发表于:2017-05-31 10:56:56 顶(0) | 踩(0) 回复
学习学习
回复评论