안녕하세요. 안드로이드 독학한지 2주일정도 된 초보입니다.
우선 글이 길텐데 읽어주시면 감사하겠습니다.
현재 자바 채팅서버와 안드로이드 클라이언트를 구현한 상태입니다.
(자바이클립스로 서버를, 안드로이드스튜디오로 클라이언트를 구현함)
여기에 추가로 서버에서 1분마다 문제가 출력되고 정답을 맞추면
"사용자 님이 문제를 맞췄습니다"
라고 출력이 되는 채팅서버를 구현하는것이 목표입니다.
우선 자바 서버에 1분마다 문제가 출력되는 기능은 구현한 상태입니다.
그렇다면 정답 String 값을 구현해야 하는데 제가 해본방법은
String s1 = "자전거";
String s2 = "바람";
라고 선언을 하고(1번문제 정답은 자전거이고 2번문제정답은 바람이라고 가정했습니다)
클라이언트에서 입력한 데이터 "line" 과 s1 을 비교합니다
if(s1.equals(line))
{
System.out.println("사용자 님이 문제를 맞췄습니다");
s1 = s2;
}
클라이언트에서 입력한 데이터 line과 s1을 비교하여 같다면
문제를맞췄습니다 라고 출력을 한후
2번답으로 넘겨줍니다.
이방법을 사용할때 클라이언트가 한명일때는 정상적으로 잘됩니다.
하지만 클라이언트가 3명일때
유저1, 유저2, 유저3이 있을때
유저1이 자전거를 치면 유저1의 정답은 바람으로 넘어갑니다.
하지만 유저2, 유저3 의 정답까지 넘어가지않습니다..
유저1이 자전거를 쳐서 맞췄음에도 불구하고
유저2가 자전거를 입력하면 다시또 정답을 맞았다고합니다...
그러니까 유저1, 유저2, 유저3이 각각의 String 정답값을 가지고있는게
문제입니다.
유저1이 자전거를 입력할경우
정답처리를하고 유저1, 유저2, 유저3이 가지고있는
모든 String s1 값을 s2로 변경을 시켜주고싶습니다. <-핵심입니다.
자바채팅서버 보여드리겠습니다.
public class ChatServer {
public static void main(String[] args) throws IOException
{
ServerSocket serverSoc = null;
try
{
serverSoc = new ServerSocket(3333);
System.out.println("서버가 시작되었습니다.");
HashMap hm = new HashMap();
while(true)
{
Socket sock = serverSoc.accept();
ChatThread chatthread = new ChatThread(sock,hm);
chatthread.start();
}
}
catch (Exception ex)
{
System.out.println(ex);
}
}
}
class ChatThread extends Thread
{
private Socket socket;
private String id;
private BufferedReader br;
private PrintWriter pw;
private HashMap hm;
private boolean initFlag = false;
public ChatThread(Socket socket, HashMap hm)
{
this.socket = socket;
this.hm = hm;
try
{
pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
id=br.readLine();
System.out.println("사용자["+ id +"]님이 접속하셨습니다.");
synchronized(hm)
{
hm.put(this.id,pw);
}
initFlag = true;
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
private String s1 = new String("자전거");
private String s2= new String("바람");
public void run()
{
try
{
String line = null;
while((line = br.readLine()) != null)
{
broadcast(id + " : " +line);
System.out.println(id + " : " +line);
if(s1.equals(line)){
System.out.println("사용자가 정답을 맞췄습니다.");
s1 = s2;
}
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
synchronized(hm)
{
hm.remove(id);
}
try
{
if(socket!=null)
socket.close();
}
catch (Exception ex)
{
}
}
}
public void broadcast(String msg) throws IOException
{
synchronized(hm)
{
Collection col = hm.values();
Iterator iter = col.iterator();
while(iter.hasNext())
{
PrintWriter pw = (PrintWriter)iter.next();
pw.println(msg);
pw.flush();
}
}
}
}
자바소스를 보면 사실문제가있습니다.
서버에서 클라이언트가 접속한사람마다 각각의 String s1 = "자전거" 를 주기때문이죠
현재접속한 클라이언트 들에게 String s1을 던지는 방법을 알고싶습니다.
그리고 클라이언트중에 한명이라도 정답을 맞추면 s1을 String s2로 변경하는 방법이 필요합니다.
아니면 이방법이 아니더라도 다른좋은방법이 있거나 관련키워드가 있다면 알려주시면 감사하겠습니다.
전체소스를 보고 도움을 주실수있는분은 oht7202 카톡주시면 정말감사하겠습니다.
긴글읽어주셔서 감사합니다 댓글하나라도 달아주신다면 제가 구글검색
열심히해서 도움되도록하겠습니다.