2013년 7월 3일 수요일

(130703) 8일차 ChatServer.java, ChatClient.java, SendThread.java, ReceiveThread.java (Thread와 TCP/IP를 이용한 채팅 프로그램)

 - ChatServer.java 소스
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class ChatServer {

public static void main(String[] args) {
// 서버소켓 클래스
ServerSocket server = null; 
// 데이터를 주고받는 소켓 클래스 설정
Socket socket = null;

try{
// 서버 소켓을 설정해야 클라이언트가 접속 가능
server = new ServerSocket(9000);
// 데이터를 주고 받는 소켓 클래스 생성
socket = server.accept();

// 송신 쓰레드 객체 생성
ReceiveThread rt = new ReceiveThread(socket);

// 수신 쓰레드 객체 생성
SendThread st = new SendThread(socket);

// 쓰레드 클래스의 run()호출 - start로 호출
rt.start();
st.start();

} catch (Exception e){
}
}
}


 - ChatClient.java 소스
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class ChatClient {

public static void main(String[] args) {

// 데이터를 주고받는 소켓 클래스 설정
Socket socket = null;

try {
// 서버에 접속 후 데이터를 주고받을 수 있는 소켓 클래스 선언
socket = new Socket("203.233.196.185", 9000);

// 송신 쓰레드 객체 생성
ReceiveThread rt = new ReceiveThread(socket);

// 수신 쓰레드 객체 생성
SendThread st = new SendThread(socket);

// 쓰레드 클래스의 run()호출 - start로 호출
rt.start();
st.start();

} catch (Exception e){
}
}
}


 - SendThread.java 소스
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class SendThread extends Thread {

// 소켓을 통하여 데이터를 주고 받아야 하기에 생성자에 소켓을 받아옴.
// 멤버변수로 소켓을 설정
Socket socket;

@Override
public void run(){

// 키보드를 통해서 데이터를 입력받은후에
Scanner sc = new Scanner(System.in);

try {
// 입력받은 데이터를 네트워크를 통해 배출하기 위해 outputstream() 객체 생성
PrintWriter pw = new PrintWriter(socket.getOutputStream());

// 반복문을 이용하여 계속적으로 입력받은 데이터를 송신하면 됩니다.
while(true){
String data = sc.nextLine(); // 줄 단위로 입력받음

// 데이터를 넘겨줌
pw.println(data);
pw.flush(); // 즉시 넘겨줌

if(data.equals("1")){ // 1을 누르면 종료
pw.close();
break;
}
}
} catch (Exception e) {

}

public SendThread(Socket so) {
// ChatServer와 ChatClient로부터 넘어온 소켓클래스를 맴버변수로 넘겨줌
socket = so;
}
}


 - ReceiveThread.java 소스
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class ReceiveThread extends Thread {

// 소켓을 통하여 데이터를 주고 받아야 하기에 생성자에 소켓을 받아옴.
// 멤버변수로 소켓을 설정
Socket socket;

@Override
public void run(){

try {
// 소켓을 통하여 들어온 데이터를 스캐너가 받아주기 위해 getInputStream() 객체 생성
Scanner sc = new Scanner(socket.getInputStream());

// 반복문을 이용하여 계속적으로 스캐너의 데이터를 화면에 출력함.
while(true){
// 클라이언트로부터 데이터를 통해 넘어온 값을 읽어드림
String data = sc.nextLine(); // 어떤게 넘어올지 모르므로 nextLine()이 적당
System.out.println(data);
}

} catch (Exception e) {
}
}

public ReceiveThread(Socket so) {
// ChatServer와 ChatClient로부터 넘어온 소켓클래스를 맴버변수로 넘겨줌
socket = so;
}
}


 - Client 실행




















 - 결과