클라이언트가 서버에 간단한 문자열을 보내고 서버에 연결된 각 클라이언트가이 문자열을받는 Java 클라이언트/서버 프로그램을 만들려고합니다. 그래서 각 클라이언트에 대해 새 스레드를 만들고이를 수신하는 서버에 대해 2 개의 서버 클래스를 만들었습니다. 또한 클라이언트 소켓 목록이 있습니다. 각 클라이언트에 클라이언트 중 하나가 보낸 문자열을 보내고 싶습니다. 내가 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());
}
}
그래서 만이 클라이언트가 (그 자체를 전송하는) 문자열을 접수에 :하지만 난 단지 서버에 문자열을 보낸 클라이언트에 대한 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 개당. 그러나 클라이언트가 차단되지 않도록하려면 어떻게해야합니까 ?? –
즉시 수신되지 않습니다. 다른 클라이언트의 메시지를 보내 다른 클라이언트의 차단을 해제해야합니다. Alexey 님이 보낸 메일을 보내려고하면 아무 것도 나타나지 않습니다. 그러나 client2로 가서 메시지를 보내면 알렉스 메시지가 client2에 표시됩니다. –