Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Виснет многопоточный Socket-Server.??:( (http://forum.oszone.net/showthread.php?t=233683)

Killer_13 28-04-2012 18:13 1907405

Виснет многопоточный Socket-Server.??:(
 
Здравств, идея проста сделать сервер для двух игроков и чтоб была возможность не только одним слушать порт. Тоисть многопоточный. Взял с туториалов стандартные примеры, но почему-то клиент виснет при чтении.
Виснет на этой строке
Код:

this.responseMessage = dataInputStream.readUTF();
Я не могу отдебажить сервер. Не срабатывают брейкпоинты... Гляньте где ошибка...
Запуск и коннект происходит, - смотрел с дебаггером.
А вот дальше ничего посмотреть не могу..

Вот два стандартных класса(пока что тестовый вариант).
Код:

package chess.network;

import java.io.IOException;
import java.net.ServerSocket;

public class ChessServer {

        public static void main(String[] args) throws IOException {
                ServerSocket serverSocket = null;
                boolean listening = true;
                System.err.println("SERVER!: 4444.");
                try {
                        serverSocket = new ServerSocket(4444);
                } catch (IOException e) {
                        System.err.println("Could not listen on port: 4444.");
                        System.exit(-1);
                }
                while (listening) {
                        new ChessMultiServerThread(serverSocket.accept()).start();
                }
                serverSocket.close();
        }
}

Код:

package chess.network;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ChessMultiServerThread extends Thread {

        private Socket socket = null;

        public ChessMultiServerThread(Socket socket) {
                super("KKMultiServerThread");
                this.socket = socket;
        }

        public void run() {
                try {
                        System.out.println("Thred");
                        PrintWriter out = new PrintWriter(socket.getOutputStream());
                        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                        System.out.println("In Stream: "+in.toString());
                        out.write("To Client");
                        System.out.println("Out Stream: "+out.toString());
                        out.flush();
                        out.close();
                        in.close();
                        socket.close();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
}

И вот мой тестовый клиент.
Код:

package chess.network;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class CHClient {

        private Socket clientSocket;
        private InputStream inputStream;
        private OutputStream outputStream;

        private DataInputStream dataInputStream;
        private DataOutputStream dataOutputStream;

        private final String hostName = "localhost";
        private final int PORT = 4444;

        private String requestMessage = null;
        private String responseMessage = null;

        public CHClient() {
                System.out.println("-CLIENT-");

                try {
                        this.clientSocket = new Socket(this.hostName, this.PORT);

                        this.inputStream = clientSocket.getInputStream();
                        this.outputStream = clientSocket.getOutputStream();

                        this.dataInputStream = new DataInputStream(inputStream);
                        this.dataOutputStream = new DataOutputStream(outputStream);

                                this.requestMessage = "Lallllaaaaaa";
                                sendMessage(this.requestMessage);
                                this.responseMessage = dataInputStream.readUTF();
                                System.out.println(this.responseMessage);
                        System.out.println("ClientStopped!");

                } catch (UnknownHostException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                } finally {
                        try {
                                this.inputStream.close();
                                this.outputStream.close();
                                this.clientSocket.close();
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                }
        }

        private void sendMessage(String msg) {
                try {

                        this.dataOutputStream.writeUTF(msg);
                        this.dataOutputStream.flush();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
}

Спасибо.

ferget 28-04-2012 22:40 1907534

Цитата:

Цитата Killer_13
но почему-то клиент виснет при чтении. »

у меня клиент срабатывает, но выпадает здесь

Код:

                catch (IOException e)
                {
                   
                }

проверяйте
DataInputStream
DataOutputStream

Killer_13 28-04-2012 22:43 1907537

Цитата:

Цитата ferget
у меня клиент срабатывает, но выпадает здесь »

- дык соственно спрашиваю, что не так, смотрел, проверял. :( Спасибо что попробовали...

ferget 28-04-2012 23:33 1907564

вот пример рабочего клиент сервера

сервер

Код:

package nserver;
import java.io.*;
import java.net.Socket;

public class ServerOne extends Thread
{
    private Socket socket;
    private BufferedReader in;
    private PrintWriter out;
   
    public ServerOne(Socket s) throws IOException
    {
        socket = s;
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                .getOutputStream())), true);
        start();
    }
    @Override
    public void run()
    {
        try
        {
            while (true)
            {
                String str = in.readLine();
                if (str.equals("END"))
                    break;
                System.out.println("Echoing: " + str);
                out.println(str);
            }
            System.out.println("closing...");
        }
        catch (IOException e)
        {
            System.err.println("IO Exception");
        }
        finally
        {
            try
            {
                socket.close();
            }
            catch (IOException e)
            {
                System.err.println("Socket not closed");
            }
        }
    }
}

Код:

package nserver;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class MServer {
    static final int PORT = 8888;
    public static void main(String[] args) throws IOException
    {
        ServerSocket s = new ServerSocket(PORT);
        System.out.println("Server Started");
        try
        {
            while (true)
            {
                Socket socket = s.accept();
                try
                {
                    ServerOne serverOne = new ServerOne(socket);
                }
                catch (IOException e)
                {
                    socket.close();
                }
            }
        }
        finally
        {
            s.close();
        }
    }
}

клиент

Код:

package nserver;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException
    {
        int PORT = 8888;
        InetAddress addr = InetAddress.getByName(null);
        System.out.println("addr = " + addr);
        Socket socket = new Socket(addr, PORT);
        try
        {
            System.out.println("socket = " + socket);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket
                    .getInputStream()));
            PrintWriter out = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream())), true);
            for (int i = 0; i < 10; i++)
            {
                out.println("HELLO " + i);
                String str = in.readLine();
                System.out.println(str);
            }
            out.println("BYE");
        }
        finally
        {
            System.out.println("closing...");
            socket.close();
        }
    }
}


Killer_13 28-04-2012 23:40 1907566

Спасиб, просмотрю, чем отличается от моего...

Killer_13 29-04-2012 20:24 1907947

Еще раз спасибо, ваш пример работает. думаю вопрос решен

Killer_13 29-04-2012 21:49 1908000

А еще вот вопрос по теме..
Как мне определять двух игроков на одну игру?

К примеру таков вариант возможен, или это делается как-то по другому?

Один игрок, создает сервер, а у другого например в комбобоксе он появляется, другой соответственно берет это имя из комбобокса, топчет на сервер и спрашивает у него, - эй у тебя есть клиент с таким соединением, если есть, то что?
Я мыслю в правильном направлении?

Спасибо.

ferget 30-04-2012 14:49 1908263

Цитата:

Цитата Killer_13
Я мыслю в правильном направлении? »

не совсем понял ход мысли, но в простейшем случае должно быть так:
каждому одиночному серверу добавляется свойство имя, каждый клиент при подключении посылает свое имя
главный сервер содержит список всех имен и по запросу выдает кто подключен, если два клиента хотят играть, то для них создается игра


Время: 11:00.

Время: 11:00.
© OSzone.net 2001-