2016-04-20 16 views
0

1つのクライアント接続で動作するコードがあります。私が必要とするのは、サーバーがマルチスレッド・アプローチを使用して複数のクライアント要求を処理する能力です。複数のクライアントを使用したJavaソケットプログラミング

import java.io.IOException; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Server extends User { 
    private Socket clientSocket; 
    private ServerSocket serverSocket; 


    public Server() { 
     super(); 
    } 

    private void createConnection() { 
     try { 
      InetAddress locIP = InetAddress.getByName("127.0.0.1"); 
      serverSocket = new ServerSocket(9999, 0, locIP); 


      //  serverSocket = new ServerSocket(4444, 4444, InetAddress.getByName("192.168.0.101")); 
     } catch (IOException e) { 
      System.err.println("Could not listen on port: 9999 ." + e); 
      System.exit(1); 
     } 
    } 

    private void closeConnection() { 
     try { 
      serverSocket.close(); 
     } catch (IOException e) { 
      System.err.println(e); 
     } 
    } 

    @Override 
    public void connect() { 
     createConnection(); 

     //Socket clientSocket=null; 
     try { 
      clientSocket = serverSocket.accept(); 

      System.out.println("Client connected! " 
        + "IP: " 
        + clientSocket.getInetAddress() 
        + ", port: " 
        + clientSocket.getPort()); 


     } catch (IOException e) { 
      System.err.println("Accept failed. " + e); 
      System.exit(1); 
     } 
    } 


    @Override 
    public void disconnect() { 
     try { 
      clientSocket.close(); 
     } catch (IOException e) { 
      System.err.println(e); 
     } 

     closeConnection(); 
    } 


    @Override 
    public Socket getSocket() { 
     return clientSocket; 
    } 

    @Override 
    public String toString() { 
     return new String("Server"); 
    } 

} 

Client.java

import java.io.IOException; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class Client extends User { 

    private Socket socket; 


    public Client() { 
     super(); 
    } 

    @Override 
    public Socket getSocket() { 
     return socket; 
    } 

    @Override 
    public void connect() { 
     try { 
      InetAddress locIP = InetAddress.getByName("127.0.0.1"); 
      // socket = new Socket(9999, 0, locIP); 
      // socket = new Socket("localhost", 9999);  oryginalny 
       socket = new Socket(locIP, 9999); 

     } catch (UnknownHostException e) { 
      System.err.println("The host not found! " + e); 
      System.exit(1); 
     } catch (IOException e) { 
      System.err.println("Can't find connection! " + e); 
      System.exit(1); 
     } 
    } 


    @Override 
    public void disconnect() { 
     try { 
      socket.close(); 
     } catch (IOException e) { 
      System.err.println(e); 
     } 
    } 

    @Override 
    public String toString() { 
     return new String("Client"); 
    } 
} 

私はいくつかの解決策を見つけたが、それは私の要件を満たしていない、this、または this

ようServer.java SendButton.java

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.BufferedOutputStream; 
import java.io.IOException; 
import java.io.PrintStream; 


import javax.swing.JButton; 
import javax.swing.JTextPane; 


@SuppressWarnings("serial") 
public class SendButton extends JButton { 
    private JTextPane incomingMessages; 
    private JTextPane messageToSend; 
    private User user; 

    public SendButton(User user, JTextPane incomingMessages, JTextPane messageToSend) { 
     super("Send!"); 
     this.user = user; 
     this.incomingMessages = incomingMessages; 
     this.messageToSend = messageToSend; 

     this.addActionListener(new SendListener()); 
    } 

    public class Write { 
     private PrintStream out; 


     public Write() { 
      try { 
       out = new PrintStream(new BufferedOutputStream(
         user.getSocket().getOutputStream(), 1024), false); 
      } catch (IOException e) { 
       System.err.println(e); 
      } 
     } 


     public void send(String message) { 
      if (message != null) { 
       out.println(message); 
       out.flush(); 


       incomingMessages.setText(new String(incomingMessages.getText() + "\nMe: " + message)); 
      } 
     } 
    } 


    public class SendListener implements ActionListener { 
     private Write write = new Write(); 
     private String toSend; 


     @Override 
     public void actionPerformed(ActionEvent event) { 
      toSend = messageToSend.getText(); 


      if (toSend != null || event.getActionCommand() == "\n") { 
       write.send(toSend); 
      } 


      messageToSend.setText(new String("")); 
     } 
    } 
} 
+0

私たちがあなたを助けることができるように、受け取っているエラーメッセージを追加してください。 –

+0

あなたのメソッド 'createConnection()'、 'closeConnection()'、 'connect()'の名前はあまりにも貧弱です。その名前が意味することは、彼らの誰もがしません。 – EJP

答えて

2

あなたは、そのデータメンバーSocketで構成されており、その入力および出力ストリーム新しいRunnableクラスを作成する必要があります。このクラスはサーバー側で使用されます。そのrun()メソッドは、そのクライアントへのすべてのI/Oを処理します。 ConnectionHandlerは、上記のようにRunnableを実装

while (true) 
{ 
    new Thread(new ConnectionHandler(serverSocket.accept())).start(); 
} 

:次に、あなたのaccept()ループは、ちょうどこのようになります。

+0

@DROY 'run()'メソッドの最後、 'finally'ブロックに属します。 – EJP

+0

@DROYもちろん、 'accept()'が失敗する唯一の方法は、 'ServerSocket'のタイムアウトかクロージャーです。今これをやめてもいいですか?私はここで完全な作業ソリューションを投稿しようとしていません。私は読者がいくつかのイニシアチブを発揮すると期待しています。 – EJP

0

あなたがする必要があるのは、クライアントからのリクエストを受け入れた後(メインスレッドを使用して)、クライアントソケットを持つ新しいスレッドにリクエストが渡され、新しいスレッド内でリクエストが処理されます。したがって、メインスレッドは新しい要求を受け入れることが自由です。

関連する問題