複数のクライアントをホストできるサーバーと、接続できるクライアントがあります。クライアントの 1 つを選択して、PrintWriter 経由でメッセージを送信できるようにしようとしています。I 以下のコードは参照用であり、使用する必要さえない場合があります。すべてのクライアントではなく、特定のクライアントにメッセージを送信する方法があるかどうか疑問に思っていました。これについてどこから始めればよいかわかりません..サーバーからクライアントへ、クライアントからサーバーへの通信を行うことができますが、サーバーからクライアントへの通信を特定のクライアントに送信したいと考えています。
クライアント:
import java.net.Socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.swing.JOptionPane;
public class Main{
private static Socket socket;
private static PrintWriter printWriter;
private static String inputLine;
private static Thread thread;
public static void main(String[] args) {
// System.out.println("What is the computer's IP address?");
String Ip_addr = JOptionPane
.showInputDialog("Enter the IP number of the server to connect: ");
String IP = Ip_addr;
while (true) {
try {
System.out.println("Client running...");
socket = new Socket(IP, 8080);
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
while ((inputLine = bufferedReader.readLine()) != null) {
System.out.println(inputLine);
JOptionPane.showMessageDialog(null, inputLine);
}
} catch (Exception e) {
}
}
}
}
サーバ:
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.awt.Desktop;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintWriter;
public class Main
{
private static ServerSocket serverSocket;
private static Socket clientSocket;
private static BufferedReader bufferedReader;
private static BufferedReader threadReader;
private static String inputLine;
private static Thread thread;
private static PrintWriter printWriter;
public static void main(String[] args) throws IOException
{
Thread cmd = new Thread(new Commands());
cmd.start();
while(ClientThread.Clients < 100) {
Scanner scan = new Scanner(System.in);
try
{
serverSocket = new ServerSocket(8080);
clientSocket = serverSocket.accept();
ClientThread.Clients += 1;
//Desktop.getDesktop().open(new File("C:/Users/Chris/Desktop/Test.txt")); // Opens notepad on Windows.
bufferedReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
printWriter = new PrintWriter(clientSocket.getOutputStream(),true);
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
try{
thread = new Thread(new ClientThread(clientSocket));
thread.start();
}catch(Exception e){System.out.println("Error 103 = failed to create thread."); break;}
try{
serverSocket.close();
}catch(Exception e){System.out.println("Error 105 = failed to close socket.");}
}
}
}
複数のクライアントのスレッド:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.StringTokenizer;
public class ClientThread extends Thread{
static Socket socket;
BufferedReader in;
PrintWriter out;
String username;
public static int Clients = 0;
static String[] Names = new String[100];
char EOF = (char)0x00;
public ClientThread(Socket s){
socket = s;
}
public void run(){
try{
in = (new BufferedReader(new InputStreamReader(socket.getInputStream())));
out = new PrintWriter(socket.getOutputStream());
System.out.println("Client Connected from " + socket.getInetAddress() + ", " + Clients + " connected.");
Names[Clients-1] = "Client" + (Clients) + " " + socket.getInetAddress();
in.readLine();
Thread.sleep(100);
}catch(Exception e){
System.out.println(("Client Disconected from " + socket.getInetAddress()));
removeClient((socket.getInetAddress()).toString());
}
}
private void removeClient(String Inet) {
int Location;
String[] Storage = new String[Clients];
int j = 0;
for(int i = 0; i < Clients; i++) {
String line = Names[i];
StringTokenizer st = new StringTokenizer(line);
String Name = st.nextToken();
String IP = st.nextToken();
if(IP.equalsIgnoreCase(Inet)) {
//System.out.println("Client removed..");
}else {
Storage[j] = Names[i];
j++;
}
}
for(int i = 0; i < Clients; i++) {
Storage[i] = Names[i];
}
Clients--;
}
}
事前に感謝します。