내 코드에 문제가 있습니다. 나는 연결을 기다리는 자바 서버를 만든다. 클라이언트가 연결되면 우리 (서버)가 "showinfo"명령을 보내면 cliend는 IP 주소를 다시 서버로 보냅니다.JAVA의 서버/클라이언트 프로그램 솔루션
문제는 멀티 스레드 서버이며 많은 클라이언트가 연결된다는 것입니다. 예를 들어, 2 개의 클라이언트가 서버에 연결되면 showinfo를 2 번 타이핑 한 다음 클라이언트가 정보를 제공해야합니다. 어떻게하면 클라이언트가 즉시 "showinfo"를 입력하여 응답하도록 할 수 있으며 모든 클라이언트에 대해 showinfo를 입력 할 때까지 기다리지 마십시오. 명령을 실행하기 전에 50 명의 클라이언트가있는 경우 showinfo를 50 번 입력하면 약간 지루합니다. 미리 감사합니다 (내가 어떤 스레드 동기화 및 일부 sleep()
join()
명령을 시도하지만 난 당신이 좀 도와 수 있기를 바랍니다 아직 결론에 도달하지 않았습니다.) 여기
의 서버 코드
import java.io.*;
import java.net.*;
import java.security.*;
public class Server implements Runnable{
private Socket server;
private static String command,info,message;
BufferedReader infromclient =null;
InputStream infromclient2=null;
DataOutputStream outtoclient =null;
static BufferedReader infrommaster=null;
private static int port=6789;
Server(Socket server){
try{
this.server=server;
infromclient =new BufferedReader(new InputStreamReader(server.getInputStream()));
outtoclient =new DataOutputStream(server.getOutputStream());
infrommaster=new BufferedReader(new InputStreamReader(System.in));
}catch(IOException e){
System.out.println("Exception accessing socket streams: "+e);
}
}
// main()
// Listen for incoming connections and handle them
public static void main(String[] args) {
ThreadGroup clients = new ThreadGroup("clients");
System.out.print("Waiting for connections on port " + port + "...");
System.out.println("\nIn total there are:"+clients.activeCount()+" clients\n");
try{
ServerSocket server = new ServerSocket(port);
Socket nextsocket;
// waiting for connections
while(true){
nextsocket = server.accept();
Thread client= new Thread(clients,new Server(nextsocket),"client"+(clients.activeCount()+1));
System.out.println("Client connected");
System.out.println("There are "+clients.activeCount()+" clients connected");
client.start();
}
}catch (IOException ioe){
System.out.println("IOException on socket listen: " + ioe);
ioe.printStackTrace();
}
}
public void run(){
try{
command=infrommaster.readLine();
outtoclient.writeBytes(command+"\n");
// showinfo
if(command.equals("showinfo")){
info=infromclient.readLine();
System.out.println("\nClient information\n\n" +info+"\n");
}
server.close();
}catch (IOException ioe){
System.out.println("IOException on socket listen: " + ioe);
ioe.printStackTrace();
}
}
}
import java.io.*;
import java.net.*;
import java.lang.*;
public class Client{
public static void main(String args[]) throws Exception{
String command2;
String info;
Socket clientSocket=null;
Socket scket=null;
BufferedReader inFromUser=null;
DataOutputStream outToServer=null;
BufferedReader inFromServer=null;
BufferedWriter tosite=null;
try{
clientSocket = new Socket(InetAddress.getLocalHost().getHostName(), 6789);
inFromUser =new BufferedReader(new InputStreamReader(System.in));
outToServer =new DataOutputStream(clientSocket.getOutputStream());
inFromServer =new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
}catch(UnknownHostException | IOException e){
System.out.println("Problem "+e);
}
command2=inFromServer.readLine();
System.out.println("From Server:" +command2);
// showinfo
if (command2.equals("showinfo")){
try{
InetAddress myip=InetAddress.getLocalHost();
info =("IP: " +myip.getHostAddress()+"\n");
System.out.println("\nSome system information\n" + info);
outToServer.writeBytes(info);
}catch (Exception e){
System.out.println("Exception caught ="+e.getMessage());
}
}
outToServer.flush();
outToServer.close();
inFromUser.close();
inFromServer.close();
clientSocket.close();
}
}
이 ** 명령 clientSocket = new Socket(InetAddress.getLocalHost().getHostName(), 6789);
그것이 내 PC (포트 6789에서 내 IP)을 테스트하는 것을 의미한다 :
이곳은 클라이언트의 코드입니다.
을 그래서 당신이 말한대로, 만약 그것의 IP를 보낼 수있는 방법을 서버에서 문자열 정보를 전송하지 않습니다 클라이언트? – user1195787
클라이언트는 계속 보내지 만 사용자로부터 가져올 필요는 없습니다. – Sid
사람이 코드는 내가 만드는 가장 큰 프로젝트의 작은 부분이며 클라이언트에게 명령을 내리기 위해 서버가 필요하기 때문에 사용자가 입력해야합니다. 몇 가지 동기화 명령을 시도했지만 성공한 유일한 방법은 다른 스레드가 가장 먼저 기다렸다가 두 번째 등 스레드가 작업을 종료 할 때까지 기다리는 것이 었습니다. 나는 당신에게 묻고 싶습니다. 다른 방법이 있습니다. 더 많은 프로그램을 운영하고 있습니까? 나는 멀티 태스킹/방송에 대해서도 생각해 왔지만 나는 많은 것을 알지 못한다. Btw 귀하의 답변을 주셔서 감사합니다 – user1195787