クライアントがサーバーに単純な文字列を送り、サーバーに接続された各クライアントがこのStringを取得するJavaでクライアント/サーバープログラムを作成しようとしています。 私は、各クライアントのための新しいスレッドを作成し、それらを聞くサーバーの2つのサーバークラスを作成しました。また、クライアントソケットのリストもあります。クライアントの1人が送信した文字列を各クライアントに送信するために使用したいと思います。私はそのためにforeachループを使用します。ソケットのDataOutputStreamをソケットリストのループに入れることができません
public void run(){
try{
while(true){
String data = in.readUTF();
for(Socket soc : GlobalQdaServer.allClients){
DataOutputStream sOut = new DataOutputStream(soc.getOutputStream());
sOut.writeUTF(data + ". Total clients number in list: " + GlobalQdaServer.allClients.size());
}
}
}
catch(EOFException ex){
System.out.println(ex.getMessage());
}
catch(IOException ex){
System.out.println(ex.getMessage());
}
}
だから、これだけのクライアントが(それは自分自身を送信した)文字列をrecieves:しかし、私は唯一のサーバに文字列を送信したクライアントのためにDataOutputStreamのです。他は何も受け取りません。 これらは完全なクラスです:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.*;
import java.util.ArrayList;
import java.util.List;
public class GlobalQdaServer {
public static List<Socket> allClients = new ArrayList<Socket>();
public static void main(String[] args) {
try{
int serverPort = 7896;
ServerSocket listenSocket = new ServerSocket(serverPort);
while(true){
Socket clientSocket = listenSocket.accept();
allClients.add(clientSocket);
Connection c = new Connection(clientSocket);
}
}
catch(IOException ex){
System.out.println("Server Socket creating failiure");
}
}
}
class Connection extends Thread{
DataInputStream in;
DataOutputStream out;
Socket clientSocket;
public Connection(Socket aClientSocket){
try{
clientSocket = aClientSocket;
in = new DataInputStream(clientSocket.getInputStream());
out = new DataOutputStream(clientSocket.getOutputStream());
this.start();
}
catch(IOException ex){
System.out.println(ex.getMessage());
}
}
public void run(){
try{
while(true){
String data = in.readUTF();
for(Socket soc : GlobalQdaServer.allClients){
DataOutputStream sOut = new DataOutputStream(soc.getOutputStream());
sOut.writeUTF(data + ". Total clients number in list: " + GlobalQdaServer.allClients.size());
}
}
}
catch(EOFException ex){
System.out.println(ex.getMessage());
}
catch(IOException ex){
System.out.println(ex.getMessage());
}
}
}
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
public class GlobalQdaClient {
public static void main(String[] args) throws IOException {
int serverPort = 7896;
Socket s = new Socket("localhost", serverPort);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String input = "";
while(!input.equals("end")){
input = reader.readLine();
try{
DataInputStream in = new DataInputStream(s.getInputStream());
DataOutputStream out = new DataOutputStream(s.getOutputStream());
out.writeUTF(input);
String data = in.readUTF();
System.out.println("Recieved this: " + data);
}
catch(UnknownHostException ex){
System.out.println(ex.getMessage());
}
catch(EOFException ex){
System.out.println(ex.getMessage());
}
catch(IOException ex){
System.out.println(ex.getMessage());
}
}
}
}
、問題のコースを見つけて助けてください。私はソケットには新しいです。ありがとうございます
ありがとうございます。あなたが書いたように私はやろうとしました。しかし、クライアント2はクライアント1から送信されたメッセージを受信せず、クライアント1はクライアント2から送信されたメッセージを受信しませんでした。 –
オハイオ州、オクラホマ、私は以前のメッセージがクライアントによって得られていることを知りました...しかし、ちょうど奇妙な順序の1つまたは別のクライアントからのメッセージの1つにつき。しかし、クライアントがブロックされないようにするにはどうすればよいですか? –
それは即座に受信されません、あなたからのメッセージを送信して、他のクライアントのブロックを解除する必要があります。 クライアント1から送信しようとすると、まだブロックされていないクライアント2には何も表示されませんが、クライアント2に行きメッセージを送信すると、クライアント2にアレックスメッセージが表示されます。 –