How to send and receive multiple messages at a time (java thread socket programming)

时光总嘲笑我的痴心妄想 提交于 2020-01-17 08:00:10

问题


I am creating a chat program between a server and a client but is run by a main function file.

If "-l" is present on the command line, it will run as a server, otherwise it will run as a client

Command line arguments to run server:

java DirectMessengerCombined -l 3000

Command line arguments to run client:

java DirectMessengerCombined 3000

All three files need to be able to access String args[] in the main function file because that is how it gets the port number

Right now the program is able to send and receive one message at a time successfully (see screenshot)

What changes can I make to the code that will allow me to send and receive multiple messages? (probably involves the use of java threads)

Code of main function file:

import java.io.IOException;

public class MainThread
{
    public static void main(String[] args) throws IOException
    {
        DirectMessengerClient client1 = null;
        DirectMessengerServer server1 = null;

          for (int i = 0; i < args.length; i++)
          {
              if (args.length == 1) 
              {
                 client1 = new DirectMessengerClient(args);
                 client1.ClientRun(args);
              }
              else if (args.length == 2)
              {
                 server1 = new DirectMessengerServer(args);
                 server1.ServerRun(args);
              }
           i=args.length + 20;
          } 
    }
}

Code of Server File:

import java.io.*;
import java.net.*;
import java.util.*;
import javax.imageio.IIOException;

public class ServerThread
{
    private String[] serverArgs;
    public Socket socket;
    public boolean keepRunning = true;
    int ConnectOnce = 0;

    public ServerThread(String[] args) throws IOException
    {
        // set the instance variable
        this.serverArgs = args;

        run();
    }

    public String[] ServerRun(String[] args) throws IOException
    {
        serverArgs = args;
        serverArgs = Arrays.copyOf(args, args.length);

        return serverArgs;
    }

    //run method of ServerRecieve
    public void run() throws IOException
    {
        try
        {
            if(ConnectOnce == 0)
            {
                int port_number1 = Integer.valueOf(serverArgs[1]);
                ServerSocket serverSocket = new ServerSocket(port_number1);
                socket = serverSocket.accept();
                ConnectOnce = 4;
            }
            while(keepRunning)
            {
                //Reading the message from the client

                //BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String MessageFromClient = br.readLine();
                System.out.println("Message received from client: "+ MessageFromClient);

                // ServerSend.start();

                runSend();
            }
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {
        }
    }


    //Run method of ServerSend
    public void runSend()
    {
        while(keepRunning)
        {
            System.out.println("Server sending thread is now running");
            try
            {
                //Send the message to the server
                OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);

                //creating message to send from standard input
                String newmessage = "";
                try
                {
                    // input the message from standard input
                    BufferedReader input= new BufferedReader(
                            new InputStreamReader(System.in));
                    String line = "";

                    line= input.readLine();
                    newmessage += line + " ";

                }
                catch ( Exception e )
                {
                    System.out.println( e.getMessage() );
                }
                String sendMessage = newmessage;
                bw.write(sendMessage + "\n");
                bw.flush();
                System.out.println("Message sent to client: "+sendMessage);
                run();
            }

            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            finally
            {
            }
        }
    }
}

Code of Client file:

import java.io.*;
import java.net.*;
import java.util.*;
import static java.nio.charset.StandardCharsets.*;

public class ClientThread implements Runnable
{
    int ConnectOnce = 0;
    private String[] clientArgs; // <-- added variable
    private static Socket socket;
    public boolean keepRunning = true;

    public ClientThread(String[] args) throws IOException
    {
        // set the instance variable
        this.clientArgs = args;
        run(args);
    }

    public String[] ClientRun(String[] args)
    {
        clientArgs = args;
        clientArgs = Arrays.copyOf(args, args.length);
        return clientArgs;
    }

    public void run(String args[]) throws IOException
    {
        System.out.println("Client send thread is now running");
        while(keepRunning)
        {
            if(ConnectOnce == 0)
            {
                String port_number1= args[0];
                System.out.println("Port number is: " + port_number1);
                int port = Integer.valueOf(port_number1);
                String host = "localhost";
                InetAddress address = InetAddress.getByName(host);
                socket = new Socket(address, port);
                ConnectOnce = 4;
            }

            //Send the message to the server
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);

            //creating message to send from standard input
            String newmessage = "";
            try
            {
                // input the message from standard input
                BufferedReader input= new BufferedReader(new InputStreamReader(System.in));
                String line = "";

                line= input.readLine();
                newmessage += line + " ";
            }
            catch (Exception e)
            {
                System.out.println(e.getMessage());
            }

            String sendMessage = newmessage;
            bw.write(sendMessage + "\n");
            bw.flush();
            System.out.println("Message sent to server: "+sendMessage);
            runClientRead(args);
        }

    }

    public void runClientRead(String args[]) throws IOException
    {
        System.out.println("Client recieve/read thread is now running");

        //Integer port= Integer.valueOf(args[0]);
        //String host = "localhost";
        //InetAddress address = InetAddress.getByName(host);
        //socket = new Socket(address, port);

        //Get the return message from the server
        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String MessageFromServer = br.readLine();
        System.out.println("Message received from server: " + MessageFromServer);
    }

    @Override
    public void run()
    {
        // TODO Auto-generated method stub
    }
}

Currently I can only send and receive one line of text at a time, what changes can I make to the code that will allow me to send and receive multiple messages?

来源:https://stackoverflow.com/questions/44032929/how-to-send-and-receive-multiple-messages-at-a-time-java-thread-socket-programm

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!