Avatar billede nysted Nybegynder
19. marts 2004 - 10:58 Der er 1 kommentar

Problemer med Sockets og tråde

Hej kære eksperter!
Jeg er ved at lave et netværks skakspil. Ved brug af Socket programmering og threads.
Og for at den skal opdatere modstanderens træk havde jeg tænkt mig at den skulle sætte den ene spillers tråd til at vente indtil den anden har trukket. Men så opstår mit problem, efter at jeg har started min tråd nr.2 op kan den ikke længere sende ud til tråd nr. 1 ved hjælp af out.println();
Så selv om den siger at den har fat på den rigtige tråd når jeg kigger det hele igennem ved hjælp af system.out.println(Thread.currentThread()); så sender den altså kun til tråd nr. 2:
import java.io.*;
import java.net.*;
import java.util.*;

public class SkakServer {
   
    private static ServerSocket servSocket;
    private static final int PORT = 1234;
    private PrintWriter out;
    private SkakModel model;
    int i = 0;
    private boolean traadFarve = true;
    private boolean spillerFarve = true;
    private boolean venteFarve = false;
   
    private Thread hvidHandler;
    private Thread sortHandler;
   
   
    public SkakServer() {
       
        model =  new SkakModel();
        model.udskrivModel();
       
        try {
            servSocket = new ServerSocket(PORT);
        }
        catch (IOException e) {
            System.out.println("\nUnable to set up port!");
            System.exit(1);
        }
       
       
        try {
            //Wait for client...
            Socket client = servSocket.accept();
           
            System.out.println("\nNew client accepted.\n");
           
           
            //Create a thread to handle communication with
            //this client and pass the constructor for this
            //thread a reference to the relevant socket...
            hvidHandler = new ClientHandler(client, this, true);
           
            hvidHandler.start();//As usual, this method calls run.
            Socket sortClient = servSocket.accept();
           
            System.out.println("\nNew client accepted.\n");
            //Create a thread to handle communication with
            //this client and pass the constructor for this
            //thread a reference to the relevant socket...
            sortHandler = new ClientHandler(sortClient, this, false);
           
            sortHandler.start();//As usual, this method calls run.
           
        }
        catch (IOException e) {
            System.out.println("IOFejl i konstruktor");
        }
       
    }
   
    public static void main(String[] args) throws IOException {
        SkakServer server = new SkakServer();
    }
   
    synchronized boolean flytHvid(int _startX, int _startY, int _slutX, int _slutY) {
        while(!spillerFarve) {
            System.out.println("hvid træk venter");
           
            try {
                wait();
            }
            catch(InterruptedException e) {
            }
        }
        try {
           
            if(model.getBrik(_startX, _startY).getFarve()) {
               
                spillerFarve = false;
                venteFarve = true;
               
                notifyAll();
                return model.getBrik(_startX, _startY).rykBrik(_startX,_startY, _slutX,_slutY);
            }//afslutter if
            else
                return false;
        }//afslutter try
        catch(NullPointerException ex) {
            return false;
        }//afslutter catch
       
    }//afslutter hvid
   
    synchronized boolean flytSort(int _startX, int _startY, int _slutX, int _slutY) {
        while(spillerFarve) {
            System.out.println("Sort træk venter");
           
            try {
                wait();
            }
            catch(InterruptedException e) {
            }
        }//afslutter while
        try {
           
            if(!model.getBrik(_startX, _startY).getFarve()) {
                spillerFarve = true;
                boolean ryk = model.getBrik(_startX, _startY).rykBrik(_startX,_startY, _slutX,_slutY);
                venteFarve = false;
                notifyAll();
                return ryk;
            }
            else
                return false;
        }//afslutter try
        catch(NullPointerException ex) {
            return false;
        }//afslutter catch
    }//afslutter flyt sort
   
    synchronized void ventHvid() {
        //notifyAll();
        while(venteFarve) {
            try {
                System.out.println( Thread.currentThread()+"inden wait hvid" );
                System.out.println("hvid venter");
                wait();
            }
            catch(InterruptedException e) {
            }
           
        }
        notifyAll();
        System.out.println("Hvid er færdig med at vente");
    }
    synchronized void ventSort() {
        notifyAll();
        while(!venteFarve) {
            try {
                System.out.println( Thread.currentThread() + "inden wait sort");
                System.out.println("sort venter");
                wait();
            }
            catch(InterruptedException e) {
            }
        }
        System.out.println("Sort er færdig med at vente");
    }
   
    public String getBilledsti() {
        try{
            return model.udskrivModel();
        }
        catch (NullPointerException ex) {
            return "NULL";
        }
    }
   
   
   
   
   
}

class ClientHandler extends Thread {
    private Socket client;
    private BufferedReader in;
    public static PrintWriter out;
    private SkakModel model;
    SkakServer server;
    private boolean farve;
   
   
    public ClientHandler(Socket socket, SkakServer _server, boolean _farve) {
        //Set up reference to associated socket...
        client = socket;
        server = _server;
        farve = _farve;
        try {
            in = new BufferedReader(
            new InputStreamReader(
            client.getInputStream()));
            out = new PrintWriter(
            client.getOutputStream(),true);
           
           
        }
        catch(IOException e) {
            e.printStackTrace();
        }
    }
   
    public void run() {
        try {
            String received;
            do {
               
                //Accept message from client on
                //the socket's input stream...
                received = in.readLine();
              /* while( received== null) {
                    received = in.readLine();
                    System.out.println(received);
                }*/
                System.out.println(received+" - "+ farve);
               
                if (received.equals("1")) { //Venter på træk fra klienten
                   
                    String sortTraek = in.readLine();
                   
                    StringTokenizer STStart = new StringTokenizer(sortTraek);
                   
                   
                    int startX = Integer.parseInt(STStart.nextToken("-"));
                    int startY = Integer.parseInt(STStart.nextToken("-"));
                    int slutX = Integer.parseInt(STStart.nextToken("-"));
                    int slutY = Integer.parseInt(STStart.nextToken("-"));
                    System.out.println(sortTraek +" - "+ farve);
                    if(!farve) //NOT farver er sort client
                    {
                        if(server.flytSort(startX,startY, slutX,slutY)) {
                            out.println("TRUE");
                            out.println(server.getBilledsti());
                          System.out.println( Thread.currentThread() + "flytsort inden vent");
                            //server.ventSort();
                            System.out.println( Thread.currentThread() + "flytsort efter vent");
                            out.println("GO");
                        }
                        else {
                            out.println("FALSE");
                        }
                    }
                    else if(farve) // farve er hvid klient
                    {
                        if(server.flytHvid(startX,startY, slutX,slutY)) {
                            out.println("TRUE");
                            out.println(server.getBilledsti());
                            System.out.println(client);
                            System.out.println( Thread.currentThread()+"flyt hvid inden vent" );
                          // server.ventHvid();
                            System.out.println( Thread.currentThread()+ "flyt hvid efter vent" );
                            System.out.println("GO hvid"+Thread.currentThread());
                            System.out.println(client);
                            System.out.println("spillerens farve er "+farve);
                            out.println("GO"+farve);
                        }
                        else
                            out.println("FALSE");
                    }
                   
                }
               
               
                else if(received.equals("2")) //Sender billedsti af brik på angivet plads
                {
                   
                    out.println(server.getBilledsti());
                   
                }
                else if(received.equals("3")) {
                    if(!farve) {
                        System.out.println("Sort venter");
                        server.ventSort();
                        System.out.println("Fortsætter tråden");
                        out.println("GO");
                       
                    }
                    else if(farve) {
                        System.out.println("Hvid venter");
                        server.ventHvid();
                        System.out.println("Fortsætter tråden");
                        out.println("GO");
                       
                    }
                }
               
               
            }while (true);
        }
       
        catch(IOException e) {
            e.printStackTrace();
        }
       
       
        finally {
            try {
                if (client!=null) {
                    System.out.println(
                    "Closing down connection...");
                    client.close();
                }
            }
            catch(IOException e) {
                e.printStackTrace();
            }
        }
    }//afslutter run()
   
   
}

import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class SkakKlient extends JFrame {
    private static String/*InetAddress*/ host = "10.2.18.10";
    private static final int PORT = 1234;
    private static Socket link;
    private static BufferedReader in;
    private static PrintWriter out;
    private static BufferedReader keyboard;
   
    private static SkakPladeKlient brædt = new SkakPladeKlient();
    private JPanel minBorder = new JPanel(new BorderLayout(0,0));
   
    private void initComponents() {
        minBorder.setBorder(BorderFactory.createTitledBorder("The Game"));
        minBorder.add(brædt, "Center");
        getContentPane().add(minBorder, "Center");
        brædt.setLayout(null);
    }//afslutter initcomponents
   
    public SkakKlient() {
        super("SPACE ChessMaster 2004");
        initComponents();
    }//afslutter constructor
   
    public static void main(String[] args)    throws IOException {
        SkakKlient klient = new SkakKlient();
        klient.setSize(900, 700);
        klient.setVisible(true);
        klient.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });//afslutter windowlistener
        try {
            link = new Socket(host, PORT);
            in = new BufferedReader(
            new InputStreamReader(
            link.getInputStream()));
            out = new PrintWriter(
            link.getOutputStream(),true);
           
            keyboard = new BufferedReader(
            new InputStreamReader(System.in));
           
            String message, response;
            do {
               
               
                out.println("2");
               
                String sti = in.readLine();
                System.out.println(sti);
                brædt.tegnBrikker(sti);
                //Send message to server on
                //the socket's output stream...
                String træk = brædt.flytBrik();
                System.out.println(træk);
                out.println("1");
                out.println(træk);
                System.out.println("klient 66");
                System.out.println(in.readLine()); //modtager true for rigtigt træk
                sti = in.readLine(); //modtager ny sti
                System.out.println(sti);
                brædt.tegnBrikker(sti);
                /*while(in.readLine().equals("FALSE")) {
                    System.out.println("nyt træk");
                    træk = brædt.flytBrik();
                    out.println("1");
                    out.println(træk);
                }
                */
                System.out.println(in.readLine()); //modtager go for at være færdig med at vente
               
               
               
               
            }while (true);
        }
        catch(UnknownHostException uhEx) {
            System.out.println(
            "\nHost ID not found!\n");
        }
        catch(IOException ioEx) {
            ioEx.printStackTrace();
        }
        finally {
            try {
                if (link!=null) {
                    System.out.println(
                    "Closing down connection...");
                    link.close();
                }
            }
            catch(IOException ioEx) {
                ioEx.printStackTrace();
            }
        }//afslutter whatever its called
    }//afslutter main
   
   
}//afslutter det hele

Som sagt fryser klient nr. 1 fordi den ikke længere modtager de svar den skulle, disse svar bliver i stedet sendt til tråd nr. 2.
Alle forslag til hvad der går galt er velkommen.
Og hvis I har brug for at få mere at vide så spørg endelig.
Avatar billede nysted Nybegynder
16. juni 2004 - 20:40 #1
Lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester