簡體   English   中英

多線程java程序中將“ serverSocket.accept();”行放置在何處

[英]Where to put the line “serverSocket.accept();” in a multithreaded java program

我正在嘗試創建一個程序,使服務器和客戶端可以同時相互收發消息(兩個有電話的人可以互相發短信)

我現在只想關注服務器和主文件這三個文件(主要功能文件,服務器文件,客戶端文件)。

服務器文件的問題在於,有兩個單獨的線程,其中每個線程都有自己單獨的“運行”功能,因此我想知道應該在哪里放置“ socket.accept()”行,以使它們都可以工作(也許以前,在全球范圍內?)

運行服務器的命令行參數是

java DirectMessengerCombined -l 3000

如果“ -l”不存在,它將作為客戶端運行

我認為服務器文件的流將是這樣的(偽代碼注釋)(如果我錯了,請糾正我)

//Server listens for connections 
//then accepts the connection from client
//Recieving msesages:
        //function recieves messages, create and run a functon that recieves messages
        //read from the socket until the other side closes
        //display the recieved message


//Sending: Standard input begins
        //create and run a functon that sends messages
        //write using standard input as long as the user doesn't close it, in a loop


//user close standard input to end the program

根據此流程,是否可以從線程的第一個run方法之外接受連接? 也許在構造函數中?

服務器代碼:

import java.io.*;
import java.net.*;
import java.util.*;
import javax.imageio.IIOException;
public class DirectMessengerServer
{

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

    public DirectMessengerServer(String[] args) throws IOException 
    {

        // should serverSocket.accept() go here???



        // set the instance variable
        this.serverArgs = args;
        int port_number1 = Integer.valueOf(serverArgs[1]);
        ServerSocket serverSocket = new ServerSocket(port_number1);
        socket = serverSocket.accept(); 
    }

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


        // should serverSocket.accept() go here???

    Thread ServerRecieve = new Thread();


//If i put serverSocket.accept() in both the run methods, won't that cause an "Address already in use error"? 

//run method of ServerRecieve
public void run(String args[])
{   
    System.out.println("Server recieve thread is now running");
    try
    {


        while(keepRunning)
        {
            //Reading the message from the client


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


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

Thread ServerSend = new Thread ();

//Run method of ServerSend
public void run()
{   
    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);
        }


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

        }
    }
}


}

主要功能文件代碼:

import java.io.IOException;

public class DirectMessengerCombined
{
    public static void main(String[] args) throws IOException
    {
        DirectMessengerClient Client1 = new DirectMessengerClient();
    //  Thread t1 = new Thread(Client1);
        DirectMessengerServer Server1 = new DirectMessengerServer(args);
        //DirectMessengerServer Server1 = new DirectMessengerServer(args[1], null, 0);
          for (int i = 0; i < args.length; i++)
          {
                if(!args[0].equals("-l"))
                {
                    Client1.ClientRun(args);
                }
                switch (args[0].charAt(0))
                {
                    case '-':
                    if(args[0].equals("-l"))
                    {   
                        Server1.ServerRun(args);
                    }

                }
           i=args.length + 20;
          } 
    }

}

我的問題是:在代碼中哪個位置可以接受連接,以便兩個運行方法都能正常工作,就像它們都已連接一樣?

通常,您會將其放入其自己的線程的循環中,並在每個接受的連接中啟動一個新線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM