자바소스 수정 좀 부탁드립니다^^
행복녀
서버에 클라이언트들이 접속해서 채팅을 하도록 많들어진 소스입니다.
여기에 서버창에서 클라이언트들이 접속 할 때마다 클라이언트의 IP와 현재접속한 클라이언트들의 갯수를 표시하도록 하고 싶습니다.
도움 좀 부탁드려요~
좀 급해서요^^;서버 소스
import java.net.*;
import java.io.*;
import java.util.*;
public class Server extends Thread
{
private Socket sk;
private static Vector clients = new Vector();//각각의 클라이언트를 담는 그릇
private PrintWriter pw;
public int port; // 클라이언트를 식별하는 주소입니다.
public Server(Socket sk) // Vector에 지금 생성된 자기 쓰레드를 담는다
{
this.sk = sk;
port = sk.getPort(); // 클라이언트 포트 번호 뽑기
clients.add(this);
}
public void run()
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream())); //소켓에서 오는 스트림 정보를 받을수 있는 InputStream객체가 튀어나옴
// BufferedReader는 한라인씩 읽어오기 위한 클래스 nputStreamReader는 키보드 입력을 한라인씩 해주기 위해서 BufferedReader의 형식에 맞게 변환해주는 일종의 어뎁터
pw = new PrintWriter(new OutputStreamWriter(sk.getOutputStream())); // ufferedReader의 반대클래스 한줄씩 화면에 써주기 위한
String line = null;
while((line = br.readLine()) != null)
{
sendMsg(this,line);
}
}
catch(Exception e){e.printStackTrace();} //예외가 발생하면 Excetption e 에 닮아서 화면에 출력
}
// 모든 서버 스레드가 공유하는 함수입니다. 따라서 synchronized가 필요하죠
public synchronized static void sendMsg(Server s,String msg) throws Exception
{
Iterator it = clients.iterator(); //Iterator는 Vector의 내용을 줄을 세워주는 역할
while(it.hasNext()) //hasNext는 Iterator에 있는 함수(다음내용이 있다면 트루 없으면 펄스)
{
Server serverThread = (Server)it.next(); // Vector에 담겨져있던 클라이언트가 하나씩 튀어나옴
if(!(serverThread.port == s.port) ) //endMsg로 넘어온 클라이언트의 port 정보와 줄서져있는 클라이언트의 port 정보가 같지 않을때에만 메세지를 뿌려줘라
serverThread.println(msg);
}
}
// 각자가 사용하는 말 전달 함수.
public void println(String msg) throws Exception
{
pw.println(msg);
pw.flush();
}
public int getNumberOfClient() {
return clients.size();
}
public static void main(String[] args) throws Exception
{
ServerSocket ssk = new ServerSocket(1234); //서버를 여는 부분 (Socket, ServerSocket은 java.net패기키에 정의됨)
while(true)
{
Socket sk = ssk.accept(); //Clinet접속을 기다림
Server sv = new Server(sk); //쓰레드를 클래스에 담고 스레드 생성
System.out.println(client IP: + sk.getInetAddress().getHostAddress());
System.out.println(number of clients: + sv.getNumberOfClient());
sv.start(); // 쓰레드 스타트 public void run()이 실행
}
}
}
클라이언트 소스
import java.net.*;
import java.io.*;
public class Client extends Thread
{
private Socket sk;
public Client(Socket sk)
{
this.sk = sk;
}
public void run()//입력을 받아 화면에 출력하는 스레드 입니다.
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
String line = null;
while((line = br.readLine()) != null)
{
System.out.println(+line);
}
}catch(Exception e){e.printStackTrace();}
}
public static void main(String[] args) throws Exception
{
Socket sk = new Socket(192.168.1.2,1234);
PrintWriter pw = new PrintWriter(new OutputStreamWriter(sk.getOutputStream()));
Client client = new Client(sk);
client.start();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = br.readLine()) != null)
{
pw.println(line);
pw.flush();
}
}
}