有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程如何从不同的文件中将四个线程分配给四个方法?(多线程javasocket编程)

我正在尝试创建一个包含三个文件(主功能文件、客户端文件、服务器文件)的短信程序,可以同时发送和接收短信,多次(能够在每条消息后按enter键发送多条消息,能够在另一方在每条消息后按enter键连接后接收多条消息)

有四个线程(一个线程用于在服务器上接收消息,一个线程用于在服务器上发送消息,一个线程用于在客户端接收消息,一个线程用于在客户端发送消息)

如果命令行上有“-l”,它将作为服务器运行,否则它将作为客户端运行

要运行服务器的命令行参数:

java DirectMessengerCombined -l 3000

运行客户端的命令行参数:

java DirectMessengerCombined 3000

命令行参数(字符串[]args)应可供所有3个文件访问

以下是创建线程的代码:

主功能文件代码:

 import java.io.IOException;


public class DirectMessengerCombined implements Runnable
{
    public static void main(String[] args) throws IOException
    {

        DirectMessengerClient client1 = null;
        DirectMessengerServer server1 = null;
        Thread ServerRead = new Thread ();
        Thread ServerWrite = new Thread ();
        Thread ClientRead = new Thread ();
        Thread ClientWrite = new Thread ();
          for (int i = 0; i < args.length; i++)
          {

              if (args.length == 1) 
              {
                 client1  = new DirectMessengerClient(args);
                 client1.ClientRun(args);
                 ClientRead.start();
                 ClientWrite.start();


              }
              else if (args.length == 2)
              {
                 server1 = new DirectMessengerServer(args);
                 server1.ServerRun(args);
                 ServerRead.start();
                 ServerWrite.start();

              }
           i=args.length + 20;
          } 
    }

    @Override
    public void run()
    {
        //This method is just to get rid of the "implements" error
        //There are four threads, so which one is accessing this method??
    }

}

在下面的代码中有“//我希望这是ServerRead线程方法”之类的注释。我想知道如何使该注释可行,或者以某种方式将其放入实际代码中,使其与主函数文件中的相应线程一起工作

服务器文件的代码:

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


public class DirectMessengerServer implements Runnable
{

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

    public DirectMessengerServer(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;

      }



//I would like this to be the ServerRead thread method 
public void run() 
{  


    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
    {
    }
}

//I would like this to be the ServerWrite thread method 
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);
            ConnectOnce = 4;
           // run();
        }


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

        }
    }
}


}

客户端文件代码:

import java.io.*;
import java.net.*;
import java.util.*;
import static java.nio.charset.StandardCharsets.*;
public class DirectMessengerClient
{
    private String[] clientArgs;
    private static Socket socket;
    public boolean keepRunning = true;
    public DirectMessengerClient(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;
    }

  //I would like this to be the ServerWrite thread method 
    public void run(String args[]) throws IOException
    {   
        System.out.println("Client send thread is now running");
        while(keepRunning)
        {             
             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);


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

        }


  //I would like this to be the ClientRead thread method 
    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);

    }
}

我的问题是如何使这些方法与主函数文件中的线程一起工作,以及/或者如何将注释转换为主文件中相应线程的实际代码

编辑:我现在可以让它一次成功地发送一条消息了,有没有办法让我一次发送和接收多条消息


共 (0) 个答案