I'm testing chatting system for game.
It is chatting system but client send location information like "2 3" then, server process information and save to ConcurrentHashMap that has String type name as Key and User object as Value.
User object has a String type location variable.
First save is well. After that, Server's HashMap has changed value but Client's hashMap hasn't changed value.
I heard HashMap isn't good for thread and it need to synchronize. So I Used ConcurrentHashMap but it didn't fix.
Why client's value of HashMap isn't changed??
Help me Please
Below is my code.
serverTest.java
package SocketPractice2;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import Model.User;
public class serverTest {
static ServerSocket server;
static List clients;
static ConcurrentHashMap strTable;
static ConcurrentHashMap userTable;
static int userId = 1111;
serverTest() throws IOException {
server = new ServerSocket(5000);
clients = new ArrayList();
strTable = new ConcurrentHashMap(); //
}
public static void main(String[] args) {
try {
new serverTest();
Socket socket = null;
userTable = new ConcurrentHashMap();
while ((socket = server.accept()) != null) {
ConnectionToClient client = new ConnectionToClient(socket);
clients.add(client);
System.out.println("[Info] client connected");
String name = (String) client.read();
String initialLocation = "1 1";
User user = new User(name, initialLocation, false);
userTable.put(name, user);
new MessageHandler(client).start();
}
server.close();
} catch (Exception e) {
try {
Iterator itr = clients.iterator();
while (itr.hasNext()) {
itr.next().close();
}
} catch (Exception g) {
}
e.printStackTrace();
}
}
public static void tellEveryOne(Object message) {
try {
for (ConnectionToClient client : clients) {
client.write(message);
}
} catch (Exception e) {
}
}
private static class MessageHandler extends Thread {
ConnectionToClient client;
MessageHandler(ConnectionToClient client) {
this.client = client;
}
public void run() {
try {
String input = "";
while ((input = (String) client.read()) != null) {
System.out.println("Read : " + input);
String[] nameAndLocation = input.split(":");
String name = nameAndLocation[0];
String Location = nameAndLocation[1];
// strTable.put(name, Location);
// tellEveryOne(strTable);
userTable.get(name).setLocation(Location);
System.out.println("changed : " + userTable.get(name).getLocation());
tellEveryOne(userTable);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static class ConnectionToClient {
Socket socket;
ObjectInputStream ois;
ObjectOutputStream oos;
ConnectionToClient(Socket socket) throws IOException {
this.socket = socket;
ois = new ObjectInputStream(socket.getInputStream());
oos = new ObjectOutputStream(socket.getOutputStream());
}
public void write(Object message) throws Exception {
oos.writeUnshared(message);
oos.flush();
}
public Object read() throws Exception {
return ois.readObject();
}
public void close() throws IOException {
socket.close();
ois.close();
oos.close();
}
}
}
clientTest.java
package SocketPractice2;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import Model.User;
public class clientTest {
static Socket socket;
static final String ip = "127.0.0.1";
static final int port = 5000;
static String name;
clientTest() {
try {
socket = new Socket(ip, port);
} catch (Exception e) {
}
}
public static void main(String[] args) {
try {
new clientTest();
ConnectionToServer server = new ConnectionToServer(socket);
new MessageHandler(server).start();
BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
String input = "";
// login
System.out.print("Input name : ");
name = keyboard.readLine();
server.write(name);
System.out.println("[Info] Connection complete");
while ((input = keyboard.readLine()) != null) {
server.write(name + ":" + input);
}
socket.close();
keyboard.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private static class MessageHandler extends Thread {
static ConnectionToServer server;
MessageHandler(ConnectionToServer server) {
this.server = server;
}
ConcurrentHashMap cHashMap;
public void run() {
ConcurrentHashMap strtable = new ConcurrentHashMap();
ConcurrentHashMap usertable = new ConcurrentHashMap();
try {
while((usertable = (ConcurrentHashMap)server.read())!=null){
for(Entry user : usertable.entrySet()){
String name = user.getKey();
String location = user.getValue().getLocation();
System.out.println(name + ":" + location);
}
usertable.clear();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static class ConnectionToServer {
static Socket socket;
static ObjectInputStream ois;
static ObjectOutputStream oos;
ConnectionToServer(Socket socket) {
try {
this.socket = socket;
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
public void write(Object message) throws Exception {
oos.writeUnshared(message);
oos.flush();
}
public Object read() throws Exception {
return ois.readObject();
}
public void close() throws Exception {
ois.close();
oos.close();
}
}
}
User.java
package Model;
import java.io.Serializable;
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = -505870546358096892L;
/**
*
*/
private int userId;
private String userName;
private int hp;
private Location location;
private boolean isZombie;
private String strLocation;
public User(String userName, String location, boolean isZombie){
this.userName = userName;
this.hp = 100;
this.strLocation = location;
this.isZombie = isZombie;
}
public User(int userId, String userName, Location location, boolean isZombie) {
this.userId = userId;
this.userName = userName;
this.location = location;
this.isZombie = isZombie;
}
public int getId(){return userId;}
public String getUserName(){return userName;}
public int getHP(){return hp;}
public void setHP(int hp){this.hp = hp;}
public String getLocation(){return strLocation;}
public void setLocation(String location){this.strLocation = location;}
public String getLocationX(){return location.getLocationX();}
public void setLocationX(String locationX){location.setLocationX(locationX);}
public String getLocationY(){return location.getLocationY();}
public void setLocationY(String locationY){location.setLocationY(locationY);}
public boolean getisZombie(){return isZombie;}
}