Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Im writing a multithreaded socket program in java and i am stuck. I have what is

ID: 3794575 • Letter: I

Question

Im writing a multithreaded socket program in java and i am stuck. I have what is think is a multithreaded server and i i want to connect multiple clients to it. When a client connects to it i want each client to be able to send messages to specfic client connected to the server. I have two classes for the server, one called server.java and one called ServerConnection.java. Ill post the code i have for both the classes bellow. I am completely stuck!

package Server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Server {
ServerSocket ss;
ArrayList<ServerConnection> connections = new ArrayList<ServerConnection>();//adds new cconnection to array
boolean shouldRun =true;
  
public static void main(String[] args){
new Server();

  
}
public Server(){
  
  
//accepts new clients
try{
System.out.println("Starting server");
ss = new ServerSocket(8080);
while(shouldRun){
Socket s = ss.accept();
ServerConnection sc = new ServerConnection(s,this);
sc.start();
connections.add(sc);
System.out.println("New client");
for(int i =0; i < connections.size(); i++){
System.out.println(" " + connections.get(i));
System.out.println(s.getInetAddress());
}
  
  
}
  
  

}catch(IOException e){
e.printStackTrace();
}
}
}

-------------------------------------------------------------------------------------------------------------------------------------

package Server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ServerConnection extends Thread {
Socket socket;
DataInputStream din;
DataOutputStream dout;
boolean shouldRun = true;
Server server;
  
public ServerConnection(Socket socket, Server server){
super("ServerConnectionThread");
this.socket = socket;
this.server = server;
}
public void sendStringToAllClients(String text){
System.out.println("Message sending to clients");
  

for(int i = 0; i<server.connections.size();i++){
ServerConnection sc = server.connections.get(i);
sc.sendStringToClient(text);
  
}
}
  
public void sendToClient(String text){
ServerConnection sc = server.connections.get(MIN_PRIORITY);
for(int i = 0; i<server.connections.size(); i++){
if(sc.server.connections.get(i).equals(i)){
sc.sendStringToClient(text);
}
}
}
  
public void sendStringToClient(String text){
try {
dout.writeUTF(text);
dout.flush();
} catch (IOException ex) {
Logger.getLogger(ServerConnection.class.getName()).log(Level.SEVERE, null, ex);
}
}
  
@Override
public void run(){
String mg = "";
try {
din = new DataInputStream(socket.getInputStream());
dout = new DataOutputStream(socket.getOutputStream());
  
while(shouldRun){
while(din.available() == 0){
try {
Thread.sleep(1);
} catch (InterruptedException ex) {
Logger.getLogger(ServerConnection.class.getName()).log(Level.SEVERE, null, ex);
}
}
System.out.println("Reading message from client");
//String namein = din.readUTF();
String itemin = din.readUTF();
  

//sendStringToAllClients(namein);
sendStringToAllClients(itemin);
  
String ready = "order ready in 15";
  
//String msgback = din.readUTF();
   
}
  
din.close();
dout.close();
socket.close();
} catch (IOException ex) {
Logger.getLogger(ServerConnection.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

Explanation / Answer

package Server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ServerConnection extends Thread {
Socket socket;
DataInputStream din;
DataOutputStream dout;
boolean shouldRun = true;
Server server;
  
public ServerConnection(Socket socket, Server server){
super("ServerConnectionThread");
this.socket = socket;
this.server = server;
}
public void sendStringToAllClients(String text){
System.out.println("Message sending to clients");
  

for(int i = 0; i<server.connections.size();i++){
ServerConnection sc = server.connections.get(i);
sc.sendStringToClient(text);
  
}
}
  
public void sendToClient(String text){
ServerConnection sc = server.connections.get(MIN_PRIORITY);
for(int i = 0; i<server.connections.size(); i++){
if(sc.server.connections.get(i).equals(i)){
sc.sendStringToClient(text);
}
}
}
  
public void sendStringToClient(String text){
try {
dout.writeUTF(text);
dout.flush();
} catch (IOException ex) {
Logger.getLogger(ServerConnection.class.getName()).log(Level.SEVERE, null, ex);
}
}
  
@Override
public void run(){
String mg = "";
try {
din = new DataInputStream(socket.getInputStream());
dout = new DataOutputStream(socket.getOutputStream());
  
while(shouldRun){
while(din.available() == 0){
try {
Thread.sleep(1);
} catch (InterruptedException ex) {
Logger.getLogger(ServerConnection.class.getName()).log(Level.SEVERE, null, ex);
}
}
System.out.println("Reading message from client");
//String namein = din.readUTF();
String itemin = din.readUTF();
  

//sendStringToAllClients(namein);
sendStringToAllClients(itemin);
  
String ready = "order ready in 15";
  
//String msgback = din.readUTF();
   
}
  
din.close();
dout.close();
socket.close();
} catch (IOException ex) {
Logger.getLogger(ServerConnection.class.getName()).log(Level.SEVERE, null, ex);
}
}
}