Have problem with understanding threads and changing variable in multiple threads - java

I am trying to restrict the amount of clients on my server,so i just sending message from my server when it is full and print it in my client by ending process for him.But as i use multiple threads i cant stop my writeMessage thread
Tried AtomicBoolean,but i didnt work
public class Client {
private static final Logger LOGGER = LogManager.getLogger();
private BufferedReader consoleReader;
private String name;
private String address;
private int port;
private Thread writeMessage, readMessage;
private ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("UTC"));
private LocalTime dTime = zonedDateTime.toLocalTime();
private Net net;
private AtomicBoolean running = new AtomicBoolean(true);
public Client(String address, int port) {
this.address = address;
this.port = port;
net = new Net(address, port);
consoleReader = new BufferedReader(new InputStreamReader(System.in));
printName();
readMessage();
writeMessage();
}
private void printName() {
System.out.println("Print your name:");
try {
name = consoleReader.readLine();
while (NameValidator.nameIsValid(name)) {
System.out.println("Name should contain more than 1 letter");
name = consoleReader.readLine();
}
net.send(name + "\n");
} catch (IOException e) {
LOGGER.error(e);
}
}
private void readMessage() {
readMessage = new Thread(() -> {
String str = net.receive();
while (net.isConnected()) {
if ("full".equals(str)) {
System.out.println("server is full");
running.set(false);
break;
} else {
System.out.println(str);
str = net.receive();
}
}
net.offService();
}, "readMessage");
readMessage.start();
}
private void writeMessage() {
writeMessage = new Thread(() -> {
while (running.get()) {
String userWord;
try {
String time = dTime.getHour() + ":" + dTime.getMinute() + ":" + dTime.getSecond();
userWord = consoleReader.readLine();
if (userWord.equals("quit")) {
net.send(userWord + "\n");
ClientAmountGenerator.decrement();
running.set(false);
} else {
net.send("(" + time + ") " + name + " says : " + userWord + "\n");
}
} catch (IOException e) {
LOGGER.error(e);
}
}
net.offService();
}, "writeMessage");
writeMessage.start();
}
}
I want to change running to "false",so the writeMessage thread wont work if it gets message "full" from the server

Related

UDP Socket: java.net.SocketException: socket closed

MessageCreator: Encapsulate and resolve ports and device unique identifiers.
public class MessageCreator {
private static final String HEADER_PORT = "to port:";
private static final String HEADER_SN = "My sn:";
public static String buildWithPort(int port) {
return HEADER_PORT + port;
}
public static int parsePort(String data) {
if (data.startsWith(HEADER_PORT)) {
return Integer.parseInt(data.substring(HEADER_PORT.length()));
}
return -1;
}
public static String buildWithSn(String sn) {
return HEADER_SN + sn;
}
public static String parseSn(String data) {
if (data.startsWith(HEADER_SN)) {
return data.substring(HEADER_SN.length());
}
return null;
}
}
UdpProvider: Loop to listen to a specific port, then parse the received data, determine whether the data conforms to the predetermined format, get the sender's response port from it, and respond with the uniquely identified UUID value to the UDP searcher.
public class UdpProvider {
public static void main(String[] args) throws IOException {
String sn = UUID.randomUUID().toString();
Provider provider = new Provider(sn);
provider.start();
// Warning: Result of 'InputStream.read()' is ignored
System.in.read();
provider.exit();
}
private static class Provider extends Thread {
private DatagramSocket ds = null;
private boolean done = false;
private final String sn;
public Provider(String sn) {
super();
this.sn = sn;
}
#Override
public void run() {
super.run();
try {
ds = new DatagramSocket(20000);
while (!done) {
final byte[] buf = new byte[512];
DatagramPacket receivePak = new DatagramPacket(buf, buf.length);
ds.receive(receivePak);
String ip = receivePak.getAddress().getHostAddress();
int port = receivePak.getPort();
byte[] receivePakData = receivePak.getData();
String receiveData = new String(receivePakData, 0, /*receivePakData.length*/receivePak.getLength());
System.out.println("received from -> ip: " + ip + ", port: " + port + ", data: " + receiveData);
int responsePort = MessageCreator.parsePort(receiveData.trim());
if (responsePort != -1) {
String responseData = MessageCreator.buildWithSn(sn);
byte[] bytes = responseData.getBytes(StandardCharsets.UTF_8);
DatagramPacket responsePak = new DatagramPacket(bytes, bytes.length,
/*InetAddress.getLocalHost()*/
receivePak.getAddress(),
responsePort);
ds.send(responsePak);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
}
public void exit() {
done = true;
close();
}
public void close() {
if (ds != null) {
ds.close();
ds = null;
}
}
}
}
UdpSearcher: Listening to a specific port and sending a LAN broadcast, sending a broadcast sets the listening port in the data, so you need to turn on listening first to finish before you can send a broadcast, and once you receive the response data, you can parse the device information
public class UdpSearcher {
private static final int LISTENER_PORT = 30000;
public static void main(String[] args) throws IOException, InterruptedException {
Listener listener = listen();
sendBroadcast();
// Warning: Result of 'InputStream.read()' is ignored
System.in.read();
List<Device> deviceList = listener.getDevicesAndClose();
for (Device device : deviceList) {
System.out.println(device);
}
}
public static void sendBroadcast() throws IOException {
DatagramSocket ds = new DatagramSocket();
String sendData = MessageCreator.buildWithPort(LISTENER_PORT);
byte[] sendDataBytes = sendData.getBytes(StandardCharsets.UTF_8);
DatagramPacket sendPak = new DatagramPacket(sendDataBytes, sendDataBytes.length);
sendPak.setAddress(InetAddress.getByName("255.255.255.255"));
sendPak.setPort(20000);
ds.send(sendPak);
ds.close();
}
public static Listener listen() throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(1);
Listener listener = new Listener(LISTENER_PORT, countDownLatch);
listener.start();
countDownLatch.await();
return listener;
}
private static class Listener extends Thread {
private final int listenPort;
private DatagramSocket ds = null;
private boolean done = false;
private final CountDownLatch countDownLatch;
private List<Device> devices = new ArrayList<>();
public Listener(int listenPort, CountDownLatch countDownLatch) {
super();
this.listenPort = listenPort;
this.countDownLatch = countDownLatch;
}
#Override
public void run() {
super.run();
countDownLatch.countDown();
try {
ds = new DatagramSocket(listenPort);
while (!done) {
final byte[] buf = new byte[512];
DatagramPacket receivePak = new DatagramPacket(buf, buf.length);
ds.receive(receivePak);
String ip = receivePak.getAddress().getHostAddress();
int port = receivePak.getPort();
byte[] data = receivePak.getData();
String receiveData = new String(data, 0, /*data.length*/receivePak.getLength());
String sn = MessageCreator.parseSn(receiveData);
System.out.println("received from -> ip: " + ip + ", port: " + port + ", data: " + receiveData);
if (sn != null) {
Device device = new Device(ip, port, sn);
devices.add(device);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
}
public void close() {
if (ds != null) {
ds.close();
ds = null;
}
}
public List<Device> getDevicesAndClose() {
done = true;
close();
return devices;
}
}
private static class Device {
private String ip;
private int port;
private String sn;
public Device(String ip, int port, String sn) {
this.ip = ip;
this.port = port;
this.sn = sn;
}
#Override
public String toString() {
return "Device{" +
"ip='" + ip + '\'' +
", port=" + port +
", sn='" + sn + '\'' +
'}';
}
}
}
UdpProvider and UdpSearcher worked fine and printed corrresponding data until I input a char sequence from keyboard follwed by pressing Enter key on each console window, both threw an exception on this line ds.receive(receivePak); :

How to fix 'Server sending data faster than client can handle, server freezes'

I'm using a java server to facilitate online multiplayer in my game made with GameMaker Studio, the players will send data to the java server which will process the data and send it to the players. The problem is that when a player with a slow internet connection is not being able to handle the amount of data being send to it, it will cause the server to freeze for all players (the server will no longer process any data send by other players).
I have simulated slow internet speeds by using NetLimiter and setting the download speed of one laptop at 5 kb/s, while maintaining proper speed at other laptops. I have tried to send ACK packets from the java server to the client and if it doesn't respond in 1 second no more data will be send to that client (and eventually the client will be kicked). This has reduced the chance of freezing the server, but it will still happen occasionally.
Main.java
import java.net.Socket;
import java.net.SocketAddress;
import java.net.InetSocketAddress;
import java.io.IOException;
import java.util.HashMap;
import java.net.ServerSocket;
import java.net.SocketTimeoutException;
public class Main
{
static ServerSocket serverSocket_;
static HashMap<String, ServerInformation> servers_;
static int verboseLevel_;
static int threadTimeout_;
static int masterPort_;
static int serverNumber_;
static int socketTimeOut_;
static {
Main.serverSocket_ = null;
Main.servers_ = new HashMap<String, ServerInformation>();
Main.verboseLevel_ = 5;
Main.threadTimeout_ = 10;
Main.masterPort_ = 6510;
Main.serverNumber_ = 1;
Main.socketTimeOut_ = 6000;
}
public static void main(final String[] args) {
try {
setupServerAndCleanup(Main.masterPort_);
while (true) {
handleIncomingConnection();
}
}
catch (IOException e) {
e.printStackTrace();
}
}
static void setupServerAndCleanup(final int port) throws IOException {
(Main.serverSocket_ = new ServerSocket()).setReuseAddress(true);
Main.serverSocket_.bind(new InetSocketAddress(Main.masterPort_));
System.out.println("Server socket up and running on port " + Main.masterPort_);
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
#Override
public void run() {
if (Main.serverSocket_ != null) {
try {
Main.serverSocket_.close();
System.out.println("Server socket closed, port released");
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}));
}
static void handleIncomingConnection() throws IOException {
final Socket clientSocket = Main.serverSocket_.accept();
clientSocket.setSoTimeout(Main.socketTimeOut_);
final ClientThread client = new ClientThread(clientSocket);
client.start();
}
}
ClientThread.java
Case 1 is the part dealing with sending data to the clients, in particular this line:
thread2.out_.print(msg);
If more data is being send than one client can handle the server will freeze for all other clients as well.
import java.util.Iterator;
import java.io.IOException;
import java.io.Reader;
import java.io.InputStreamReader;
import java.util.regex.Pattern;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class ClientThread extends Thread
{
Socket clientSocket_;
String clientIp_;
String serverIp_;
ServerInformation server_;
PrintWriter out_;
BufferedReader in_;
boolean prepareTermination_;
boolean terminated_;
private static final Pattern numberPattern;
static {
numberPattern = Pattern.compile("\\d+");
}
public ClientThread(final Socket sock) {
this.clientSocket_ = sock;
this.clientIp_ = this.clientSocket_.getRemoteSocketAddress().toString();
this.serverIp_ = null;
this.server_ = null;
this.prepareTermination_ = false;
this.terminated_ = false;
}
#Override
public void run() {
try {
this.out_ = new PrintWriter(this.clientSocket_.getOutputStream(), true);
this.in_ = new BufferedReader(new InputStreamReader(this.clientSocket_.getInputStream()));
long lastActionTime = System.currentTimeMillis();
while (true) {
if (this.in_.ready() || System.currentTimeMillis() - lastActionTime >= 1000 * Main.threadTimeout_) {
if (System.currentTimeMillis() - lastActionTime >= 1000 * Main.threadTimeout_) {
//this.logDebugMessage(3, "Thread was killed due to prolonged inactivity (" + Main.threadTimeout_ + " seconds)");
this.terminateThread();
return;
}
final String tempInputLine;
if(((tempInputLine = this.in_.readLine()) == null )){
this.terminateThread(); //end thread
return;
}
else
{
lastActionTime = System.currentTimeMillis();
final String inputLine = tempInputLine.trim();
if (ClientThread.numberPattern.matcher(inputLine).matches()){
final int val = Integer.parseInt(inputLine);
switch (val) {
case 1: { //send data to other players
final int parseCount = Integer.parseInt(this.in_.readLine().trim());
final StringBuilder msg = new StringBuilder();
for (int j = 0; j < parseCount; ++j) {
msg.append(String.valueOf(this.in_.readLine().trim()) + "|");
}
for (final ClientThread thread2 : this.server_.ipToClientThread_.values()) {
if (thread2 != this) {
thread2.out_.print(msg);
thread2.out_.flush();
}
}
//this.logDebugMessage(5, "Packet for others: '" + msg.toString() + "'");
break;
}
case 2: { //remove game server
//this.logDebugMessage(1, "A game server has been deleted, ip: " + ipServer);
Main.servers_.remove(this.server_.ip_);
this.serverIp_ = null;
for (final ClientThread thread : this.server_.ipToClientThread_.values()) {
thread.prepareTermination_ = true;
}
this.terminateThread();
return;
}
case 3: { //connect new client
final String ipServer = this.in_.readLine().trim();
final String ipClient = this.in_.readLine().trim();
this.logDebugMessage(1, "A client wishes to connect to a server, client: " + ipClient + ", server: " + ipServer);
final ServerInformation info = Main.servers_.getOrDefault(ipServer, null);
if (info == null) {
System.out.println("Connection to the server failed, no such server in the server list");
this.out_.print("*" + 1 + "|" + 1 + "~" + "|");
this.out_.flush();
break;
}
this.server_ = info;
this.server_.ipToClientThread_.put(ipClient, this);
this.logDebugMessage(1, "Connection success");
this.logDebugMessage(5,"Map: " + this.server_.ipToClientThread_);
this.out_.print("*" + 1 + "|" + 2 + "~" + "|");
this.out_.flush();
break;
}
case 4: { //disconnect client
final String ipClient = this.in_.readLine().trim();
this.server_.ipToClientThread_.remove(ipClient);
this.logDebugMessage(1, String.valueOf(ipClient) + " disconnected from the server at " + this.server_.ip_);
this.serverIp_ = null;
this.terminateThread();
return;
}
case 5: { //host create new game
if (Main.serverNumber_ > 1000000) {
Main.serverNumber_ = 10;
}
Main.serverNumber_ += 1;
final String ipServer = Integer.toString(Main.serverNumber_); //unique server number
final String ipHost = this.in_.readLine().trim(); //host
final String name = this.in_.readLine().trim(); //Server name
final String description = this.in_.readLine().trim(); //class
final String servervar1 = this.in_.readLine().trim(); //max players
final String servervar3 = this.in_.readLine().trim(); //current lap
final String servervar4 = this.in_.readLine().trim(); //total laps
final String servervar5 = this.in_.readLine().trim(); //status
final String servervar6 = this.in_.readLine().trim(); //Password
final String servervar7 = this.in_.readLine().trim(); //Online version
final String servervar8 = this.in_.readLine().trim(); //Game server
final long servervar9 = System.currentTimeMillis(); //server creation time
//this.logDebugMessage(1, "A game server has been registered, ip: " + ipServer + ", name: " + name + ", description: " + description + ", servervar1: " + servervar1);
final ServerInformation gameServer = new ServerInformation(name, servervar1, servervar3, servervar4, servervar5, servervar6, servervar7, servervar8, servervar9, ipHost, ipServer, this.clientSocket_, this.out_, this.in_);
gameServer.description_ = description;
gameServer.ipToClientThread_.put(ipHost, this);
this.server_ = gameServer;
Main.servers_.put(ipServer, gameServer);
this.serverIp_ = ipServer;
break;
}
default: {
this.logDebugMessage(0, "Unrecognized case: '" + inputLine + "', " + val);
break;
}
}
}
else if (inputLine.length() > 0) {
this.logDebugMessage(0, "Unformated '" + inputLine + "'");
if (this.server_ != null) {
this.server_.out_.print(inputLine);
this.server_.out_.flush();
}
}
if (this.prepareTermination_) {
this.terminateThread();
return;
}
continue;
}
}
}
}
catch (SocketTimeoutException e) {
e.printStackTrace();
try {
this.terminateThread();
}
catch (IOException e2) {
e2.printStackTrace();
}
}
catch (IOException e3) {
e3.printStackTrace();
try {
this.terminateThread();
}
catch (IOException e4) {
e4.printStackTrace();
}
}
}
//debug messages
void logDebugMessage(final int requiredVerbose, final String msg) {
if (Main.verboseLevel_ >= requiredVerbose) {
System.out.println("[" + this.clientIp_ + "] " + msg);
}
}
//terminate thread
void terminateThread() throws IOException {
if (!this.terminated_) {
if (this.serverIp_ != null) {
Main.servers_.remove(this.serverIp_);
}
this.clientSocket_.close();
this.in_.close();
this.out_.close();
this.logDebugMessage(3, "Cleanup successful");
this.terminated_ = true;
}
}
}
How to avoid the server from freezing if more data is being send to a client than it can handle, so that the server can continue sending data to the other clients?
Edit
So I have tried using ExecutorService, but I must be doing something completely wrong because no data is being send by the java server.
for (final ClientThread thread2 : this.server_.ipToClientThread_.values()) {
if (thread2 != this) {
executorService = Executors.newSingleThreadExecutor();
executorService.execute(new Runnable() {
public void run() {
thread2.out_.print(msg);
thread2.out_.flush();
}
});
executorService.shutdown();
}
}
It would be great if you could show me how to implement ExecutorService the right way.
If a delay in the client processing doesn't matter, this part should be done in a distinct flow execution for each client :
for (final ClientThread thread2 : this.server_.ipToClientThread_.values()) {
thread2.out_.print(msg);
thread2.out_.flush();
}
For example :
for (final ClientThread thread2 : this.server_.ipToClientThread_.values()) {
if (thread2 != this) {
new Thread(()-> {
thread2.out_.print(msg);
thread2.out_.flush();
})
.start();
}
}
Note that creating Threads has a cost. Using ExecutorService could be a better idea.

IRC login missing return statement

I need to do IRC client and I have a problem with login. I am trying to loop through server input to find the massage 004 or 433 which states for success login or for login in use. This is my code: `
import ecs100.*;
import java.io.*;
import java.net.Socket;
import java.util.*;
public class ChatClient {
private String server = "irc.ecs.vuw.ac.nz";
private static final int IRC_PORT = 6667;
private static String nick;
private static String name;
private Socket socket;
private Scanner serverIn;
private PrintStream serverOut;
private String line;
private String channel;
// Constructor
public ChatClient (){
this.setupGUI();
}
public void setupGUI(){
UI.addButton("Connect", this::connect);
}
public void connect(){
try {
socket = new Socket(server,IRC_PORT);
serverIn = new Scanner(socket.getInputStream());
serverOut = new PrintStream(socket.getOutputStream());
UI.println("login");
this.login();
UI.println("listening");
this.listenToServer();
}catch(IOException e){UI.println("IO failure "+ e);}
}
private boolean login(){
String username = UI.askToken("Enter your usercode: ");
String realname = UI.askString("Enter your real name: ");
this.nick = username;
this.name = realname;
send("NICK " + username);
send("USER " + username + " 0 unused :" + realname);
UI.println("listening to server");
while(this.serverIn.hasNext()){
this.line = serverIn.nextLine();
UI.println("SERVER" + line);
if (line.indexOf("004") >= 0){
UI.println("true");
return true;
} else if(line.indexOf("433") >= 0){
UI.println("failed to connect, username already in use");
return false;
} else {
UI.println("else");
return false;
}
}
}
private void send(String msg){
serverOut.print(msg + "\r\n");
serverOut.flush();
}
private void listenToServer() {
while(this.serverIn.hasNext()){
String line = serverIn.nextLine();
UI.println("SERVER" + line);
if(line.equals("SQUIT")){
this.closeConnection();
}
if(line.equals("PING")){
String pingMsg = line.split(" ",2)[1];
this.send("PONG " + pingMsg);
}
}
}
public void closeConnection(){
try {
this.socket.close();
this.serverIn.close();
this.serverOut.close();
UI.println("Closed");
} catch(IOException e){UI.println("IO failure "+ e);}
}
public void joinChannel(){
String channel = UI.askString("Enter channel name: ");
send("JOIN " + channel);
}
public void leaveChannel(){
send("PART " + channel);
}
public static void main(String[] args) {
new ChatClient();
}
}
The problem is that it keeps trowing missing return statement in login method. Can anyone please look and my code and see what might be wrong here ?
EDIT:
ok so when i change the if statement to two if's and put return false outside of the loop, program works. Can someone explain why the if/else statement inside of the while loop is not working ?
private boolean login(){
String username = UI.askToken("Enter your usercode: ");
String realname = UI.askString("Enter your real name: ");
this.nick = username;
this.name = realname;
send("NICK " + username);
send("USER " + username + " 0 unused :" + realname);
UI.println("listening to server");
while(this.serverIn.hasNext()){
this.line = serverIn.nextLine();
UI.println("SERVER" + line);
if (line.indexOf("004") >= 0){
UI.println("true");
return true;
}
if(line.indexOf("433") >= 0){
UI.println("failed to connect, username already in use");
return false;
}
}
UI.println("else");
return false;
}
enter code here
Because there's a code path that would result in no return being called, and the compiler can't allow that for a non-void method.
If this.serverIn.hasNext() returns false, what would the method return if you don't have a return statement at the end? It needs to return a boolean after all.
The program logic may be written so that the particular code path is never taken, but it's theoretically possible and that's why the compiler complains.

How can i make this use multiple threads as clients - who all perform a task each within the switch statement

How can I make this use multiple threads as clients - who all perform a task each within the switch statement? I would also like the threads to perform these tasks and once they have carried them out they stop (currently these tasks are performed from user input).
There are 3 classes the server, client and developer database - which holds a constructor for the 'developer' objects within an ArrayList in the server. This array list is providing the information which is being passed to the clients upon their specific requests.
Here is my code: Client:
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.*;
public class QuoteOfTheDayClient_2 {
static String devName;
static String devSkill;
static Boolean devHire;
static Socket echoSocket = null; // holds the Socket object
static Scanner fromServer = null; // input stream from remote host
static Scanner fromServer1 = null; // input stream from remote host
static PrintWriter toServer = null; // output stream to remote host
static PrintWriter toServer1 = null; // output stream to remote host
static Scanner stdIn = new Scanner(System.in);
static String remoteServer = "localhost"; // are you 'local'?!
//String remoteServer = "193.61.190.96"; // remote host is not 'local'!
static int port;
static String reply;// holds reply from remote host
public static void searchForSkill(String skill) {
toServer.println(1);
String quoteNum = "php"; //Search for a specific coding language -
Specific to the entered parameters
System.out.println("Searching for Skill: " + skill + " in Developer
Database");
toServer.println(quoteNum);
while (!(reply = fromServer.nextLine()).isEmpty()) {
// System.out.println(reply1);
System.out.println(reply);// print reply to screen
}
fromServer.nextLine(); // Consume the newline
System.out.println();
}
public static void addDeveloper(String name, String skill,boolean
hire)
{
toServer.println(2);
System.out.println("Add Developer to system ");
stdIn.nextLine(); // flush newline
String quoteString = name;//stdIn.nextLine();
String quoteString1 = skill;//stdIn.nextLine();
boolean quoteString2 = hire;//stdIn.nextLine();
toServer.println(quoteString);
toServer.println(quoteString1);
toServer.println(quoteString2);
fromServer.next();
System.out.println("\nDeveloper entered: " + quoteString + "\n");
while (!(reply = fromServer.nextLine()).isEmpty()) {
// System.out.println(reply1);
System.out.println(reply);// print reply to screen
}
}
public static void checkAvailability(String developerName) {
try {
toServer.println(3);
System.out.println("Send Developer Name to Find Availability:
");
String quoteDel = developerName;
toServer.println(quoteDel);
while (!(reply = fromServer.nextLine()).isEmpty()) {
// System.out.println(reply1);
System.out.println(reply);// print reply to screen
}
} catch (NoSuchElementException e) {
}
}
public static void hireDeveloper(String name) {
toServer.println(4);
String quoteNum = name; //Search for a specific coding language -
Specific to the entered parameters
System.out.println("Searching for: " + name + " in Developer
Database");
toServer.println(quoteNum);
while (!(reply = fromServer.nextLine()).isEmpty()) {
// System.out.println(reply1);
System.out.println(reply);// print reply to screen
}
fromServer.nextLine(); // Consume the newline
System.out.println();
}
public static void printAllDevelopers(){
toServer.println(5);
while (!(reply = fromServer.nextLine()).isEmpty()) {
// System.out.println(reply1);
System.out.println(reply);// print reply to screen
}
fromServer.nextLine(); // Consume the newline
System.out.println();
}
public static void clientMenu(){
try {
port = 4444; // 17 for localhost
echoSocket = new Socket(remoteServer, port);
fromServer = new Scanner(echoSocket.getInputStream());
fromServer1 = new Scanner(echoSocket.getInputStream());
toServer = new PrintWriter(echoSocket.getOutputStream(), true);
toServer1 = new PrintWriter(echoSocket.getOutputStream(),
true);
OutputStream os = echoSocket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
} catch (Exception e) {
System.err.println("Exception: " + e);
System.exit(1);
} // try-catch
String reply;// holds reply from remote host
int command;
String reply1;
String devName="David Blaine";
String devSkill="Java";
System.out.println("Enter command: 1:Search Skill 2:Add
Developer 3:Search Availability 4:Hire Developer 5:Show all
Developers 6:Exit");
command = 0;
command = command+1;
// while (command != 0) {
for(int i=1;i<6;i++) {
command=i;
switch (i) {
case 1: {
// get quote
searchForSkill("PHP");
break;
}
case 2: {
// add quote
addDeveloper("David Blaine", "Java", true);
break;
}
case 3: {
// delete quote
checkAvailability("David Ferguson");
break;
}
case 4: {
hireDeveloper("Thompson");
break;
}
case 5: {
printAllDevelopers();
}
case 6: {
System.exit(6);
}
default:
System.out.println("*** Command not recognised ***");
break;
}
System.out.println("Enter command: 1:Search Skill 2:Add Developer
3:Search Availability 4:Hire Developer 5:Show all Developers
6:Exit");
command = stdIn.nextInt();
//}
}
toServer.println(command);
try {
echoSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
fromServer.close();
toServer.close();
stdIn.close();
}
public static void main(String[] args) throws IOException {
clientMenu();
} // main
} // EchoClient
Server code:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
public class QuoteOfTheDayServer_2 {
private static DeveloperDatabase[] developerList = new
DeveloperDatabase[7];
static DeveloperDatabase temp []=new DeveloperDatabase[7];
static String userAddDevName;
static String userAddCodeSkills;
static Boolean userAddHireAvailability;
static int command;
static List<DeveloperDatabase> list = new
ArrayList<DeveloperDatabase>(){
{
add(new DeveloperDatabase(1,"David Ferguson", "Java",
true));
add(new DeveloperDatabase(2,"Grant Thompson", "Java",
true));
add(new DeveloperDatabase(3,"Craig Jackson", "C++", true));
add(new DeveloperDatabase(4,"Kevin James","C++", true));
add(new DeveloperDatabase(5,"Greg Troupe", "Python",
true));
add(new DeveloperDatabase(6,"James Smith", "Python",
true));
add(new DeveloperDatabase(7,"Jamie Richie", "PHP", true));
add(new DeveloperDatabase(8,"Rory McGrattan", "PHP",
false));
}
};
public static String printJava(){
String message="";
for (int i=0;i<2;i++){
message +=list.get(i).toString();
message+=" \n";
}
return message;
}
public static String printC(){
String message="";
for (int i=2;i<4;i++){
message +=list.get(i).toString();
message+=" \n";
}
return message;
}
public static String printPy(){
String message="";
for (int i=4;i<6;i++){
message +=list.get(i).toString();
message+=" \n";
}
return message;
}
public static String printPHP(){
String message="";
for (int i=6;i<8;i++){
message +=list.get(i).toString();
message+=" \n";
}
return message;
}
public static void addDeveloper(String name,String
codeSkill,Boolean hire){
userAddDevName=name;
userAddCodeSkills = codeSkill;
userAddHireAvailability = hire;
System.out.println("*********Adding Developer***********");
System.out.println(userAddDevName+ " has been added to the
system");
list.add(new DeveloperDatabase(9,
userAddDevName,userAddCodeSkills, userAddHireAvailability));
System.out.println(list.get(8));
}//addDeveloper
public static String checkAvail(String clientMessage){
String message="";
for (int i=0;i<list.size();i++){
if
(clientMessage.equalsIgnoreCase(list.get(i).getDeveloperName())) {
message+= list.get(i).toString();
message+="\n";
}
} return message;
}
public static String printAllDevelopers(){
String message="";
for (int i=0;i<8;i++){
message +=list.get(i).toString();
message+=" \n";
}
return message;
}
public static void main(String[] args) throws IOException {
// Wrap the standard System.in stream with a Scanner so that
Scanner stdIn = new Scanner(System.in);
Scanner fromClient = null;
PrintWriter toClient = null;
PrintWriter toClient1=null;
int pNum = 4444;
ServerSocket sSocket = null;
Socket cSocket = null;
try {
sSocket = new ServerSocket(pNum);
} catch (IOException e) {
System.out.println("Couldn't listen on port: " + pNum + ";
" +
e);
System.exit(1);
}
// Continuously wait for client; accept them; and send a quote
to
them.
while (true) {
try {
System.out.println("Waiting for client ....");
// Blocking 'accept' i.e. wait for a client
cSocket = sSocket.accept();
System.out.println("Client connected from: " +
cSocket.getInetAddress());
// Set up the output stream for the server, i.e. a
PrintWriter stream
toClient = new PrintWriter(cSocket.getOutputStream(),
true);
toClient1 = new PrintWriter(cSocket.getOutputStream(),
true);
ObjectInputStream ois = new
ObjectInputStream(cSocket.getInputStream());
fromClient = new Scanner(cSocket.getInputStream());
try {
command = fromClient.nextInt();
//fromClient.nextLine();
} catch (InputMismatchException e){
System.out.print("Your selection can only be an
integer!");
}
System.out.println("Received command: " + command + "
from
client at " + cSocket.getInetAddress());
while (command != 0) {
switch (command) {
case 1: // get skills
{
System.out.println("GET skill");
fromClient.nextLine();
String quoteNum =
fromClient.nextLine();//receive from client
if (quoteNum.equalsIgnoreCase("Java")) {
toClient1.println(printJava());
} else if
(quoteNum.equalsIgnoreCase("C++")) {
toClient1.println(printC());
} else if
(quoteNum.equalsIgnoreCase("Python"))
{
toClient.println(printPy());
} else if
(quoteNum.equalsIgnoreCase("PHP")) {
toClient.println(printPHP());
}
else {
toClient.println("No developer with
those
skills found");
}
//
toClient.println(list.equals("Java"));//number -1 for array (0) to
client print
System.out.println("Pushed Developer
number: "
+ quoteNum + " to client at " + cSocket.getInetAddress());
//toClient.println(quotes[quoteNum]); //
return
quote //if "java' { get(0) get(1)
break;
}
case 2: // add quote
{
System.out.println("ADD Developer to
System");
fromClient.nextLine(); // flush newline
String quote = fromClient.next();
fromClient.nextLine();
String quote1 = fromClient.next();
fromClient.nextLine();
boolean quote2 = fromClient.nextBoolean();
toClient.println("The\t*************Developer
has been Added to the Developer Database********");
list.add(new DeveloperDatabase(9, quote,
quote1, quote2));
toClient.println(list.get(8).toString());
//addDeveloper(quote,quote1,quote2);
System.out.println(list.get(8));
//System.out.println("Received quote from
client:" + quote);
quote = quote + "\n\n";
//list.add((quote);
System.out.println("Added Developer: " +
quote);
break;
}
case 3: // Check if Developer is available
{
System.out.println("Check if developer is
Available\n");
fromClient.nextLine();
String quoteNum = fromClient.nextLine();
System.out.println("Checking availability
for:
" + quoteNum);
if (quoteNum.equalsIgnoreCase("Rory
McGrattan")) {
toClient.println("The Developer is not
available for hire");
} else {
toClient.println("The Developer is
available for hire");
}break;
}case 4: {
System.out.println("Hire A Developer");
String quoteNum =fromClient.next();
System.out.println("Client wants to hire:
"+quoteNum);
String message = quoteNum;
for(int i=0;i<list.size();i++){
if
(quoteNum.equalsIgnoreCase(list.get(i).getDeveloperName())){
list.get(i).hireDeveloper();
}//if
}//if
//System.out.println(message);
toClient.println("******* You have Hired:
"+
message+" ********");
break;
}
case 5: {// Print all Developers
String message="";
for (int i=0;i<8;i++){
message +=list.get(i).toString();
message+=" \n";
}
toClient.println(message);
}
default:
break;
}
try {
//command = fromClient.nextInt();
}catch(InputMismatchException e){
}
System.out.println("Received command: " + command +
"from client at " + cSocket.getInetAddress());
}
// Close all streams
toClient.close();
cSocket.close();
fromClient.close();
stdIn.close();
} catch (IOException e) {
System.out.println("Accept failed: " + pNum + "; " +
e);
System.exit(1);
}
}
} // main
} // QuoteOfTheDayServer_2
DeveloperDatabase code:
public class DeveloperDatabase {
private int id;
private String developerName;
private String codingLanguage;
private boolean freeForHire;
public DeveloperDatabase(){
}
public DeveloperDatabase(int id,String name,String codeSkills,boolean
hire){
this.id = id;
this.developerName = name;
this.codingLanguage=codeSkills;
this.freeForHire=hire;
}
public String toString() {
String message = "\tName: " +developerName;
message += "\n" + "\tCoding Language: "+ codingLanguage+"\n";
if (freeForHire== true) {
message += "\tThe developer is Available! for Hire!\n";
} else {
message += "\tThe developer is not Available for Hire!\n";
}
return message;
}//toString
public boolean getFreeForHire() {
if (freeForHire==true){
System.out.println("The Developer is free to hire!");
}else{
System.out.println("The Developer is not free to hire!");
}
return freeForHire;
}
public String getCodingLanguage() {
return codingLanguage;
}
public void hireDeveloper(){
if (freeForHire==true)
freeForHire = false;
System.out.println(developerName +" is Hired!");
}
public String getDeveloperName() {
return developerName;
}
public static void main(String[] args) {
}//main
}//class
you could use something like
//define executor service to have 5 thread
1)
ExecutorService service=Executors.newFixedThreadPool(5);
2)
//replace move code insde while (command != 0) into a separate class that implements runnable, lets call this Task.
public class Task implements Runnable{
private final Integer command;
public Task(Integer command) {
this.command=command;
}
#Override
public void run() {
//do something, like switch statement
}
}
3) create a helper method, and call this method
public void process(Task t){
service.submit(t);
}

package activeMq with tomcat (java)

In my application,i have activeMq to send the message from client to server and vice versa.I run it as a standalone server.So when a client machine sends the message,the messages are passed in the activeMq queue and then retrieve by the server(my Application) if and only if the transaction is done locally,meaning the client machine and server(my application) live in the same computer. But when i run the client and server from two different computer meaning server in one and client in another then the client can only establish connection to the server but the messages are not passed to the activeMq queue.I think this is something with activeMq problem.
can anyone tell me how to solve this?
thanks
here is the code which passes the data sent by client to the queue.
package event.activeMq;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.console.command.store.amq.CommandLineSupport;
import org.apache.activemq.util.IndentPrinter;
public class ProducerTool extends Thread {
private Destination destination;
private int messageCount = 1;
private long sleepTime;
private boolean verbose = true;
private int messageSize = 1000;
private static int parallelThreads = 1;
private long timeToLive;
private String user = ActiveMQConnection.DEFAULT_USER;
private String password = ActiveMQConnection.DEFAULT_PASSWORD;
private String url = ActiveMQConnection.DEFAULT_BROKER_URL;
private String subject = "CLOUDD.DEFAULT";
private boolean topic;
private boolean transacted;
private boolean persistent;
private static Object lockResults = new Object();
private static String DateTime="";
private static String TaskID="";
private static String UniqueEventID="";
private static String Generator="";
private static String GeneratorBuildVsn="";
private static String Severity="";
private static String EventText="";
private static String SubsystemID="";
private static String EventNumber="";
private static String atmId="";
public void element(String[] element) {
this.DateTime = element[0];
this.TaskID = element[1];
this.Generator = element[2];
this.Severity = element[3];
this.EventText = element[4];
this.SubsystemID = element[5];
this.EventNumber = element[6];
this.GeneratorBuildVsn = element[7];
this.UniqueEventID = element[8];
this.atmId = element[9];
}
public static void main(String[] args) {
System.out.println("came here");
ArrayList<ProducerTool> threads = new ArrayList();
ProducerTool producerTool = new ProducerTool();
producerTool.element(args);
producerTool.showParameters();
for (int threadCount = 1; threadCount <= parallelThreads; threadCount++) {
producerTool = new ProducerTool();
CommandLineSupport.setOptions(producerTool, args);
producerTool.start();
threads.add(producerTool);
}
while (true) {
Iterator<ProducerTool> itr = threads.iterator();
int running = 0;
while (itr.hasNext()) {
ProducerTool thread = itr.next();
if (thread.isAlive()) {
running++;
}
}
if (running <= 0) {
System.out.println("All threads completed their work");
break;
}
try {
Thread.sleep(1000);
} catch (Exception e) {
}
}
}
public void showParameters() {
System.out.println("Connecting to URL: " + url);
System.out.println("Publishing a Message with size " + messageSize + " to " + (topic ? "topic" : "queue") + ": " + subject);
System.out.println("Using " + (persistent ? "persistent" : "non-persistent") + " messages");
System.out.println("Sleeping between publish " + sleepTime + " ms");
System.out.println("Running " + parallelThreads + " parallel threads");
if (timeToLive != 0) {
// System.out.println("Messages time to live " + timeToLive + " ms");
}
}
public void run() {
Connection connection = null;
try {
// Create the connection.
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url);
connection = connectionFactory.createConnection();
connection.start();
// Create the session
Session session = connection.createSession(transacted, Session.AUTO_ACKNOWLEDGE);
if (topic) {
destination = session.createTopic(subject);
} else {
destination = session.createQueue(subject);
}
// Create the producer.
MessageProducer producer = session.createProducer(destination);
if (persistent) {
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
} else {
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
}
if (timeToLive != 0) {
producer.setTimeToLive(timeToLive);
}
// Start sending messages
sendLoop(session, producer);
// System.out.println("[" + this.getName() + "] Done.");
synchronized (lockResults) {
ActiveMQConnection c = (ActiveMQConnection) connection;
// System.out.println("[" + this.getName() + "] Results:\n");
c.getConnectionStats().dump(new IndentPrinter());
}
} catch (Exception e) {
// System.out.println("[" + this.getName() + "] Caught: " + e);
e.printStackTrace();
} finally {
try {
connection.close();
} catch (Throwable ignore) {
}
}
}
protected void sendLoop(Session session, MessageProducer producer) throws Exception {
for (int i = 0; i < messageCount || messageCount == 0; i++) {
TextMessage message = session.createTextMessage(createMessageText(i));
if (verbose) {
String msg = message.getText();
if (msg.length() > 50) {
msg = msg.substring(0, 50) + "...";
}
// System.out.println("[" + this.getName() + "] Sending message: '" + msg + "'");
}
producer.send(message);
if (transacted) {
// System.out.println("[" + this.getName() + "] Committing " + messageCount + " messages");
session.commit();
}
Thread.sleep(sleepTime);
}
}
private String createMessageText(int index) {
StringBuffer buffer = new StringBuffer(messageSize);
buffer.append("DateTime "+DateTime+" EventNumber "+EventNumber+" TaskID "+TaskID+" AtmId "+atmId+
" Generator "+Generator+" GeneratorBuildVsn "+GeneratorBuildVsn+" Severity "+Severity+
" UniqueEventID "+UniqueEventID+" EventText "+EventText+" SubsystemID "+SubsystemID+" End ");
if (buffer.length() > messageSize) {
return buffer.substring(0, messageSize);
}
for (int i = buffer.length(); i < messageSize; i++) {
buffer.append(' ');
}
DateTime="";
EventNumber="";
TaskID="";
atmId="";
Generator="";
GeneratorBuildVsn="";
Severity="";
UniqueEventID="";
EventText="";
SubsystemID="";
return buffer.toString();
}
public void setPersistent(boolean durable) {
this.persistent = durable;
}
public void setMessageCount(int messageCount) {
this.messageCount = messageCount;
}
public void setMessageSize(int messageSize) {
this.messageSize = messageSize;
}
public void setPassword(String pwd) {
this.password = pwd;
}
public void setSleepTime(long sleepTime) {
this.sleepTime = sleepTime;
}
public void setSubject(String subject) {
this.subject = subject;
}
public void setTimeToLive(long timeToLive) {
this.timeToLive = timeToLive;
}
public void setParallelThreads(int parallelThreads) {
if (parallelThreads < 1) {
parallelThreads = 1;
}
this.parallelThreads = parallelThreads;
}
public void setTopic(boolean topic) {
this.topic = topic;
}
public void setQueue(boolean queue) {
this.topic = !queue;
}
public void setTransacted(boolean transacted) {
this.transacted = transacted;
}
public void setUrl(String url) {
this.url = url;
}
public void setUser(String user) {
this.user = user;
}
public void setVerbose(boolean verbose) {
this.verbose = verbose;
}
}
you need to update your questin with answers on this questions:
What os do you use?
Do you have a firewall like software on pc?
Could you provide here ActiveMQ conf file?
Could you provide a function
which implemented connection establishment?
upd:
I do't understand all your logic but i thk bug here:
try {
Thread.sleep(1000);
} catch (Exception e){
e.printStackTrace();
}
And never never never catch all exceptions! it's very dangerous.
if you want to catch exception, you need to handle it.

Categories