2017-05-10 4 views
0

三つのファイル(メイン関数ファイル、サーバファイル、およびクライアント・ファイル)サーバ(Javaのスレッドのソケットプログラミング)

は、主な機能ファイルがどこの存在に実行されますがあります"-l"が存在しない場合、サーバまたはクライアントとして動作するかどうかを決定します。サーバーを実行するための

コマンド引数は、4つのスレッド(クライアント側でメッセージを受信するための1、送信するための1があり、クライアントが

java DirectMessengerCombined 3000 

で実行するように

java DirectMessengerCombined -l 3000 

コマンド引数でありますクライアント側のメッセージ、サーバ側のメッセージ受信用、メッセージはサーバ側のメッセージ送信用)

スクリーンショットの問題は、「Hello client I am server」というメッセージがクライアントに送信されなかったことです。サーバーの

コード:クライアントの

import java.io.*; 
import java.net.*; 
import java.util.*; 

import javax.imageio.IIOException; 
//import static java.nio.charset.StandardCharsets.*; 
public class DirectMessengerServer 
{ 
    private static Socket socket; 
    boolean KeepRunning = true; 
    void ServerRun(String[] args) 
    { 
     Thread ServerRecieve = new Thread() 
     { 
      public void run() 
      { 
       System.out.println("Server recieve thread is now running"); 
       try 
       { 
        System.out.println("Try block begins.."); 
        int port_number1= Integer.valueOf(args[1]); 
        System.out.println("Port number is: " + port_number1); 
        ServerSocket serverSocket = new ServerSocket(port_number1); 
        //SocketAddress addr = new InetSocketAddress(address, port_number1); 
        System.out.println("Listening for connections on port: " + (port_number1)); 

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

         socket = serverSocket.accept();  
         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 
       { 
       } 
      } 
     };ServerRecieve.start(); 

      Thread ServerSend = new Thread() 
      { 
       public void run() 
       { 
        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 
        { 

        } 
       } 
      };ServerSend.start(); 










    } 
} 

コード:主な機能ファイルの

import java.io.*; 
import java.net.*; 
import java.util.*; 
import static java.nio.charset.StandardCharsets.*; 
public class DirectMessengerClient 
{ 
    boolean KeepRunning = true; 
    private static Socket socket; 
    //static String[] arguments; 
    //public static void main(String[] args) 
    //{ 
    // arguments = args; 
    //} 
    public DirectMessengerClient() 
    { 

     //System.out.println("test."); 

    } 
    public void ClientRun(String[] args) 
    { 

     Thread ClientSend = new Thread() 
     { 
      public void run() 
      { 
       System.out.println("Client sending thread is now running"); 

        try 
        { 
          System.out.println("Try block begins.."); 
          String port_number1= args[0]; 
          System.out.println("Port number is: " + port_number1); 
          int port = Integer.valueOf(port_number1); 
          System.out.println("Listening for connections.."); 
          System.out.println("Listening on port: " + port_number1); 
          while(KeepRunning) 
          { 

           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); 
          } 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        finally 
        { 

        } 

        //finally 
       // { 
        //} 


      } 
     }; ClientSend.start(); 

     Thread ClientRecieve = new Thread() 
     { 
      public void run() 
      { 
       while(KeepRunning) 
       { 
        try 
        { 

           System.out.println("Client Reieving thread is now running"); 
           //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); 
           if(MessageFromServer.equals("")) 
           { 
            KeepRunning=false; 
            System.out.println("Shutting down"); 
            System.exit(0); 
            socket.close(); 
           } 
           if(MessageFromServer.equals(null)) 
           { 
            KeepRunning=false; 
            System.out.println("Shutting down"); 
            System.exit(0); 
            socket.close(); 
           } 
           if(MessageFromServer=="") 
           { 
            KeepRunning=false; 
            System.out.println("Shutting down"); 
            System.exit(0); 
            socket.close(); 
           } 
           if(MessageFromServer==null) 
           { 
            KeepRunning=false; 
            System.out.println("Shutting down"); 
            System.exit(0); 
            socket.close(); 
           } 
           if(MessageFromServer=="\n") 
           { 
            KeepRunning=false; 
            System.out.println("Shutting down"); 
            System.exit(0); 
            socket.close(); 
           } 
        } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
        finally 
        { 

        } 
       } 
      } 
     };ClientRecieve.start(); 
    } 
} 

コード:

public class DirectMessengerCombined 
{ 
    public static void main(String[] args) 
    { 
     DirectMessengerClient Client1 = new DirectMessengerClient(); 
     DirectMessengerServer Server1 = new DirectMessengerServer(); 
      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; 
      } 
    } 

} 

私の質問は、サーバーとクライアントの両方を作成する方法であります互いにメッセージを連続的に送受信することができます(クライアント側での送信は動作しますが、受信はw ork)

+0

ソケットがnullであるため、サーバー上のあなたの第二のスレッドがかなり早く死ぬことを除いて、その時点でクライアントに何も送信されません。最初のヒント:スレッドベースの並行処理のコーディングを開始する前に、データ型のスレッド安全性またはスレッド間通信に関するいくつかの基本事項をお読みください。 –

答えて

0

良い方法は、接続を受け入れることと、ほとんどのサーバーが行う接続で動作させることです。

たとえば、メインスレッド上の着信接続を受け入れ、エグゼキュータ・サービスを使用して、スレッドプール内の接続で動作:この例では、入力と出力で

AtomicBoolean running = new AtomicBoolean(); 
    ExecutorService pool = Executors.newFixedThreadPool(10; 
    ServerSocket listen = new ServerSocket(11000); 
    while(running.get()){ 
     Socket socket = listen.accept(); 
     pool.submit(() -> { 

      try(InputStream is = socket.getInputStream(); 
       OutputStream os = socket.getOutputStream()){ 

       //put I/O logic here 


      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     }); 
    } 

は同じスレッドで処理され、同時に読み書きする場合は、入力上で動作する2つのタスクを出力し、出力の1つを実行します。重要:の後にソケットのみが接続されます。

スレッド間で通信する場合は、共有オブジェクト、つまりメッセージキューを使用して通信できます。 ConcurrentSkipListSetの

    • のConcurrentHashMap
    • CopyOnWriteArrayListと
    • ...:しかし、このデータ構造はスレッドセーフ、およびJDKは、これらのデータ構造の多くを提供しなければなりません

      final ConcurrentLinkedDeque<String> queue = new ConcurrentLinkedDeque<>(); 
      
      while(running.get()){ 
          Socket socket = listen.accept(); 
          pool.submit(() -> { 
      
           try(BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))){ 
            while(socket.isConnected()){ 
             queue.push(reader.readLine()); 
            } 
           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
          }); 
          pool.submit(() -> { 
           try(OutputStream os = socket.getOutputStream()){ 
            if(!queue.isEmpty()){ 
             os.write(queue.pop().getBytes()); 
            } 
           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
          }); 
      } 
      

      とクライアントのために基本的には同じ例えば

    、あなたが接続を受け入れるいけないが、オープン1

  • +0

    ありがとう、ありがとう。 –

    関連する問題