предложения для отдельных потоков для ввода и вывода сокета - PullRequest
2 голосов
/ 03 декабря 2011

Я пытаюсь сделать некоторые сокеты программирования в Java.Я написал эту программу для создания сервера и клиента на моем локальном компьютере и создания двух отдельных потоков для ввода и вывода сокетов в файл Se.java .Точно так же два отдельных потока для ввода и вывода сокета на стороне клиента в файле Cl.java

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

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

PS.извините, если вопрос слишком "noobie-ish". пожалуйста, будьте спокойны для меня. Это мой первый пост здесь

эта же программа, до этого работала отлично, когда у меня была только одна нить в каждом клиентефайл Cl.java для чтения ввода с сервера и его распечатки, а один на стороне сервера для чтения ввода с клиента и его распечатки.но проблема возникла, когда я создал два потока в каждой из серверной и клиентской программ для чтения и записи строк.

любое предложение будет приветствоваться. Просто хотел создать два отдельных потока на стороне клиента и на стороне сервера для чтенияи пишу.

вот мой полный код для сервера:

Se.java

import java.net.*;
import java.io.*;

public class Se
{
    public static int i=0;

    public static BufferedReader stdIn =null;

    public static void main (String [] args) throws IOException
    {
        ServerSocket serverSocket = null ;

        try {
            serverSocket = new ServerSocket (4321);
        }
        catch (IOException e)
        {
            System.err.println("Could not listen to the server port.");
            System.exit (1);
        }

        Socket clientSocket= null;

        try{
            clientSocket= serverSocket.accept();

            new Thread(new Sconsole(clientSocket)).start();
            new Thread(new Slistener(clientSocket)).start();

        }
        catch(Exception e)
        {
            System.err.println("Accept failed");
            System.exit(1);
        }

        stdIn.close();
        clientSocket.close();
        serverSocket.close();
    }
}


/* thread to listen from client and print it at server console */
class Slistener implements Runnable
{
    Socket channel=null;
    public static PrintWriter out = null;
    public static BufferedReader in = null;
    public static String inputL=null;
    public static boolean closed=true;

    public Slistener(Socket Soc)
    {
        this.channel=Soc;

        try
        {
            in=new BufferedReader(new InputStreamReader(channel.getInputStream()));
            //closed=false;

            new Thread(new Slistener(channel));
        }
        catch(IOException e)
        {
            System.out.println("error in making stream from server to client");
        }

    }
    public void run ()
    {
        try
        {
            while((inputL=in.readLine())!= null)
            {
                System.out.println("SERVER:" + inputL);

                if (inputL.equals ("Bye.")) break;
            }

        }
        catch (IOException e)
        {
            System.out.println("Exception thrown at run loop.");
        }
    }
}



/* thread to listen from console at server end and print it at client console */
class Sconsole implements Runnable
{
    Socket channel=null;
    public static PrintWriter out = null;
    public static BufferedReader in = null;
    public static String inputL=null;
    //public static boolean closed=true;

    public Sconsole() {}

    public Sconsole(Socket Soc)
    {
        this.channel=Soc;

        try
        {
            out=new PrintWriter(channel.getOutputStream(), true);
            in=new BufferedReader(new InputStreamReader(System.in));

            //closed=false;

            new Thread(new Sconsole(channel));
        }
        catch(Exception e)
        {
            System.out.println("error in writing to stream from server to client");
        }

    }
    public void run ()
    {
        try
        {
            System.out.println("SERVER:");

            while(true)
            {
                inputL=in.readLine();

                out.println(inputL);

                if (inputL.equals ("End.")) break;
            }
            //closed=true;

        }
        catch (Exception e)
        {
            System.out.println("Exception thrown at run loop.");
        }
    }
}

Теперь код клиента:

Cl.java

import java.io.*;
import java.net.*;

public class Cl extends Thread
{
    public static Socket channel= null;

    public static void main(String args[]) throws IOException
    {
        try{
            channel= new Socket ("localhost", 4321);

            System.out.println("client connected");

            new Thread(new Clistener(channel)).start();
            new Thread(new Cconsole(channel)).start();

        }
        catch (Exception e)
        {
            System.err.println("Unknown Exception");
            System.exit(1);
        }

        channel.close();
    }           
}


  /* thread to listen from server and print it at client console */
class Clistener implements Runnable
{
    Socket channel=null;
    public static PrintWriter out = null;
    public static BufferedReader in = null;
    public static String inputL=null;

    public Clistener() {}

    public Clistener(Socket Soc)
    {
        this.channel=Soc;

        try
        {
            in=new BufferedReader(new InputStreamReader(channel.getInputStream()));

            new Thread(new Clistener(channel));
        }
        catch(IOException e)
        {
            System.out.println("error in making stream from server to client");
        }

    }
    public void run ()
    {
        try
        {
            while(true)
            {
                inputL=in.readLine();

                System.out.println("SERVER:" + inputL);

                if (inputL.equals ("Bye.")) break;
            }



        }
        catch (IOException e)
        {
            System.out.println("Exception thrown at run loop.");
        }
    }
}

  /* thread to listen from client console and print it at server console */
class Cconsole implements Runnable
{
    Socket channel=null;
    public static PrintWriter out = null;
    public static BufferedReader in = null;
    public static String inputL=null;

    public Cconsole(Socket Soc)
    {
        this.channel=Soc;

        try
        {
            out=new PrintWriter(channel.getOutputStream(), true);
            in=new BufferedReader(new InputStreamReader(System.in));

            new Thread(new Cconsole(channel));
        }
        catch(Exception e)
        {
            System.out.println("error in making stream from server to client");
        }
    }

    public void run ()
    {
        try
        {
            while((inputL=in.readLine())!= null )
            {
                System.out.println("CLIENT:");

                out.println(inputL);

                if (inputL.equals ("Bye.")) break;
            }



        }
        catch (Exception e)
        {
            System.out.println("Exception thrown at run loop.");
        }
    }
}

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

Ответы [ 2 ]

3 голосов
/ 03 декабря 2011

Когда я запускаю ваш код, он не зависает: он падает с StackOverflowError.

И это ожидаемо: конструктор Slistener вызывает конструктор Slistener, который вызывает конструктор Slistener, который вызывает конструктор Slistener, который вызывает конструктор Slistener, который вызывает конструктор Slistener, который вызываетконструктор Slistener, который вызывает конструктор Slistener, который вызывает конструктор Slistener, который вызывает конструктор Slistener, который вызывает конструктор Slistener, который вызывает конструктор Slistener, который вызывает конструктор Slistener, который вызываетконструктор Slistener, который вызывает конструктор Slistener, который вызывает конструктор Slistener ...

То же самое для Clistener.

Кроме того, строка new Thread(new Sconsole(clientSocket)); не имеет особого смысла.Какой смысл создавать поток, а не запускать его?

Наконец, запуск потока из конструктора - очень плохая практика.Никогда не делай этого.

1 голос
/ 03 декабря 2011

Сначала вы должны вызвать метод записи потока вывода клиентского сокета, потому что в сокете нет ничего между клиентом и сервером, но вы сначала что-то записываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...