Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“在哪里放线?”;accept()&引用;在多线程java程序中_Java_Multithreading_Sockets - Fatal编程技术网

“在哪里放线?”;accept()&引用;在多线程java程序中

“在哪里放线?”;accept()&引用;在多线程java程序中,java,multithreading,sockets,Java,Multithreading,Sockets,我正在尝试创建一个程序,在这个程序中,服务器和客户端可以同时相互发送和接收消息(就像两个使用手机的人可以互相发短信一样) 有三个文件(主功能文件、服务器文件和客户机文件),我现在只想关注服务器和主文件 服务器文件的问题是有两个独立的线程,每个线程都有自己的“run”函数,因此我想知道应该将“socket.accept()”行放在哪里,以便使它们都能工作(也许以前,以某种方式全局运行?) 运行服务器的命令行参数包括 java DirectMessengerCombined -l 3000 如果“

我正在尝试创建一个程序,在这个程序中,服务器和客户端可以同时相互发送和接收消息(就像两个使用手机的人可以互相发短信一样)

有三个文件(主功能文件、服务器文件和客户机文件),我现在只想关注服务器和主文件

服务器文件的问题是有两个独立的线程,每个线程都有自己的“run”函数,因此我想知道应该将“socket.accept()”行放在哪里,以便使它们都能工作(也许以前,以某种方式全局运行?)

运行服务器的命令行参数包括

java DirectMessengerCombined -l 3000
如果“-l”不存在,则它将作为客户端运行

我认为服务器文件的流程是这样的(psuedo代码注释)(如果我错了,请纠正我)

根据此流,是否可以从线程接受第一次运行方法之外的连接?也许在构造器中

服务器代码:

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

}
import java.io.IOException;
公共类DirectMessenger
{
公共静态void main(字符串[]args)引发IOException
{
DirectMessenger客户端1=新的DirectMessenger客户端();
//线程t1=新线程(客户端1);
DirectMessenger服务器1=新的DirectMessenger服务器(args);
//DirectMessenger服务器Server1=新的DirectMessenger服务器(args[1],null,0);
对于(int i=0;i

我的问题是:在代码中,哪里是接受连接的正确位置,以便两个运行方法都能够像它们都被连接一样工作?

通常,您会将它放在自己线程的循环中,并且您将为每个接受的连接启动一个新线程。

我明白了。ThreadName.start()的位置;寻找外线程和内线程?是否类似于
threadlistingloop=new Thread();public void run(String args[]){try{while(keepRunning){int port_number1=Integer.valueOf(serverArgs[1]);ServerSocket ServerSocket=new ServerSocket(port_number1);socket=ServerSocket.accept();Thread receivingloop=new Thread();void run(){//code to loop reading/receivng messages}
不要让我在注释中对代码进行注释。你可以自己看到它完全难以辨认。将它发布在你的问题或其他问题中,在那里可以格式化并阅读。
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;
          } 
    }

}