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);
}
}
}