如何一次发送和接收多条消息(java线程套接字编程)

时间:2017-05-17 19:04:58

标签: java multithreading sockets

我正在服务器和客户端之间创建聊天程序,但是由主函数文件运行。

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

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

java DirectMessengerCombined -l 3000

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

java DirectMessengerCombined 3000

所有三个文件都需要能够访问主函数文件中的String args [],因为这是获取端口号的方式

现在该程序能够成功地一次发送和接收一条消息(见截图)

enter image description here

我可以对允许我发送和接收多条消息的代码进行哪些更改? (可能涉及使用java线程)

主要功能文件代码:

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

服务器文件代码:

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

客户档案代码:

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

目前我一次只能发送和接收一行文本,我可以对允许发送和接收多条消息的代码进行哪些更改?

0 个答案:

没有答案