Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
为什么服务器收到第一条消息而没有收到第二条消息(“您好”)?(多线程java套接字编程)_Java_Multithreading_Sockets - Fatal编程技术网

为什么服务器收到第一条消息而没有收到第二条消息(“您好”)?(多线程java套接字编程)

为什么服务器收到第一条消息而没有收到第二条消息(“您好”)?(多线程java套接字编程),java,multithreading,sockets,Java,Multithreading,Sockets,我正在尝试创建一个包含三个文件(主功能文件、客户端文件、服务器文件)的短信程序 如果命令行上有“-l”,它将作为服务器运行,否则它将作为客户端运行 要运行服务器的命令行参数: java DirectMessengerCombined -l 3000 要运行客户端的命令行参数: java DirectMessengerCombined 3000 这三个文件都需要能够访问主函数文件中的字符串args[],因为这就是它获取端口号的方式 错误屏幕截图(服务器在左侧,客户端在右侧): 此屏幕截图的问

我正在尝试创建一个包含三个文件(主功能文件、客户端文件、服务器文件)的短信程序

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

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

java DirectMessengerCombined -l 3000
要运行客户端的命令行参数:

java DirectMessengerCombined 3000
这三个文件都需要能够访问主函数文件中的字符串args[],因为这就是它获取端口号的方式

错误屏幕截图(服务器在左侧,客户端在右侧):

此屏幕截图的问题是服务器从未收到“你好”消息(左窗口)

服务器文件的代码(DirectMessenger服务器):

import java.io.*;
导入java.net。*;
导入java.util.*;
导入javax.imageio.IIOException;
公共类DirectMessenger服务器
{

私有字符串[]serverArgs;//嗯,您从未将
可运行的
分配给
ListeningLoop
ServerSend
。也没有启动
ListeningLoop
@bradimus如何向ListeningLoop或ServerSend函数添加可运行的?看起来像服务器调用run()中的runSend()方法同样,在它的循环中,您打算如何进行呢?服务器将只接收一条消息,然后调用run()等待另一个连接。在中启动。@nos run方法有一个ConnectOnce变量,该变量被设计为只等待一次连接,因为在它被接受后,它被分配了4个变量。查看
if(ConnectOnce==0)
import java.io.*;
import java.net.*;
import java.util.*;
import javax.imageio.IIOException;


public class DirectMessengerServer
{

    private String[] serverArgs; // <-- added variable
    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 
      {
          //How do I get the String[] args in this method be able to access it in the run methods?
        serverArgs = args;
        serverArgs = Arrays.copyOf(args, args.length);

        return serverArgs;

      }




Thread ListeningLoop = new Thread();    
//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
    {
    }
}

Thread ServerSend = new Thread ();

//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 DirectMessengerClient
{
    private String[] clientArgs; // <-- added variable
    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;
    }

    Thread ClientSend = new Thread();   
    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);
            }

        }


    Thread ClientRead = new Thread();
    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);

    }
}
 import java.io.IOException;

public class DirectMessengerCombined
{
    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;
          } 
    }

}