이번 글에는 재밌는 쓰레드(Thread)에 대해서 적어보도록 하겠습니다.
먼저, 소스 부터 보도록 하겠습니다.
ServerThread.java
import java.net.*;
import java.io.*;
import java.awt.*;
import javax.swing.*;
public class ServerThread implements Runnable {
private Server server;
private Socket soc;
private ObjectOutputStream out;
private ObjectInputStream in;
private String name = null;
private boolean bStop = true;
private ServerData data;
private ServerAbout sa;
private int turn;
public ServerThread(Server server,Socket soc) throws IOException {
this.server = server;
this.soc = soc;
this.sa = server.cp;
out = new ObjectOutputStream(soc.getOutputStream());
in = new ObjectInputStream(soc.getInputStream());
new Thread(this).start();
}
public void run() {
while (bStop) {
try {
data = (ServerData)in.readObject();
if (name == null) {
name = data.getName();
turn = sa.getUser().size();
}
server.updateData(data);
} catch(EOFException eof) {
System.exit(0);
} catch (IOException e) {
this.setStop();
sa.removeClient(name);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// Client로부터 Socket이 끊어질 경우
try {
in.close();
out.close();
soc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public String getName() {
return this.name;
}
public String toString() {
return this.name;
}
public int getTurn() {
return this.turn;
}
public void setStart(){
this.bStop = true;
}
public void setStop() {
this.bStop = false;
}
public synchronized void sendMessage(ServerData data) {
try {
out.writeObject(data);
}catch(IOException e) {
JOptionPane.showMessageDialog(null,e,"ServerThread",JOptionPane.INFORMATION_MESSAGE);
}
}
}
각 메소드별 역활에 대해서 적겠습니다.
public ServerThread(Server server,Socket soc) throws IOException {
이 클래스가 맨처음 실행되는 첫부분입니다. 이때 변수값과
쓰레드를 실행하는 것이 들어있습니다.
throws 란 쉽게 말해서 예외가 생기면 강제로 IOException 으로 던진다(throw) 라고 생각하시면 됩니다.
한가지더, this.sa = server.cp; cp란 ServerAbout.java 이란 클래스가 있습니다. 그걸 말하는 것입니다.(나중에 이거에 대해서 포스팅 하겠습니다.)
public void run() {
쓰레드 실행하는 메서드입니다.
그리고 데이터 값이 바뀔때마다 server.updateData(data); 합니다.
public synchronized void sendMessage(ServerData data) {
이것은 데이터를 보내는 메서드 입니다.
메서드마다 어떤 역활을 하는지 영어로 해석하면 어떤 역활하는지 알기 떄문에 딱히 더 설명할 부분은
없는거 같습니다.
그럼 ClientThread 에 대해서 소스 보여드리겠습니다.
ClientThread.java
import java.io.*;
import java.util.*;
public class ClientThread implements Runnable {
private Client ct;
private ObjectInputStream in;
private boolean bStop = true;
public ClientThread(Client ct,ObjectInputStream in) {
this.ct = ct;
this.in = in;
Thread t = new Thread(this);
t.start();
}
public void run()
{
while(bStop)
{
try {
ServerData data = (ServerData)in.readObject();
ct.updateData(data);
}
catch(EOFException eof) {
System.exit(0);
}
catch (IOException e) {
this.bStop=false;
}
catch(ClassNotFoundException e) {
e.printStackTrace();
}
}
}
public void setStop() {
bStop = false;
}
}
각 메서드별 역활에 대해서 설명하도록 하겠습니다.
public ClientThread(Client ct,ObjectInputStream in) {
ClientThread 가 작동하면 맨처음 들어가는 부분입니다.
이 부분에서는 변수를 재 조정 하다던가 쓰레드이니 쓰레드를 start() 하는 부분이 되겠습니다.
public void run()
쓰레드를 start() 하면 실행 되는 메서드 입니다.
안에는 ServerThread 와 마찬가지로 데이터를 보내는 부분입니다.
이상 마치도록 하겠습니다.
ps. 학교에서 배우는 서버 & 클라이언트 같은 경우네는 서버클래스 안에 소켓과 그의 맞는 쓰레드 그리고
클라이언트 클래스 안에 소켓과 그의 맞는 쓰레드 이렇게 한꺼번에 안에 들어가 있는 것을 배웠는데
저같은 경우는 그것을 각각 따로따로 나눈 것 뿐입니다. 사실 별반 차이는 없습니다. :D