서버와 클라이언트가 키보드입력으로 1대1로 채팅하기 단, 순차적으로 작업
public class EchoServerTest03 {
public static void main(String[] args) {
Socket client = null;
BufferedReader in = null;
PrintWriter out = null;
ServerSocket server = null;
BufferedReader keyin = null;
try {
server = new ServerSocket(50000);
System.out.println("클라이언트 접속을 기다림");
while(true) {
client = server.accept();
String ip = client.getInetAddress().getHostAddress();
System.out.println(ip+"접속");
//클라이언트와 통신할 수 있는 Input/Output 스트림 클래스를 소켓에서 가져오기
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream(),true);
keyin = new BufferedReader(new InputStreamReader(System.in));
String senM="";
String reM="";
while(true) {
//서버 <- 클라이언트
reM = in.readLine();
if(reM==null) {
break;
}
System.out.println("클라이언트>>>"+reM);
//서버 -> 클라이언트
senM = keyin.readLine();
out.println(senM);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class EchoClientTest03 {
public static void main(String[] args) {
Socket sock = null;
BufferedReader in = null;
PrintWriter out = null;
BufferedReader keyin = null;
try {
//1.서버접속
sock = new Socket("192.168.0.4",50000);
//2.서버와 통신할 입출력스트림과 키보드로 입력하는 내용을 읽을 스트림을 생성
in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
out = new PrintWriter(sock.getOutputStream(),true);
keyin = new BufferedReader(new InputStreamReader(System.in));
String senM = "";//서버로 보낼 메세지
String reM = "";//서버에서 받는 메세지
while((senM=keyin.readLine())!=null) {
//클라이언트 -> 서버(키보드입력한 데이터 보내기)
out.println(senM);
//클라이언트 <- 서버
reM = in.readLine();
System.out.println("서버>>"+reM);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}



클라이언트로 부터 메시지를 받는 일만 하는 쓰레드
public class ServerReceiverThread extends Thread{
Socket socket;//클라이언트
public ServerReceiverThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String reM ="";
while((reM = in.readLine())!=null) {
System.out.println("클라이언트>>"+reM);
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
서버가 입력한 메시지를 클라이언트로 보내는 작업을 처리하는 쓰레드
public class ServerSendThread extends Thread{
Socket socket;
public ServerSendThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
PrintWriter out =null;
BufferedReader keyin =null;
try {
out = new PrintWriter(socket.getOutputStream(),true);
keyin = new BufferedReader(new InputStreamReader(System.in));
String senM ="";
while((senM = keyin.readLine())!=null) {
out.println(senM);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class SingleChatServer {
public static void main(String[] args) {
ServerSocket server = null;
Socket client = null;
try {
server = new ServerSocket(12345);
System.out.println("클라이언트 접속을 기다림");
while(true) {
//client가 접속하면 client의 정보를 Vector와 같은 동기화가 적용되어 있는 자료구조에 저장하는 작업
client = server.accept();
String ip = client.getInetAddress().getHostAddress();
System.out.println(ip+"접속");
//클라이언트와 통신하기 위한 쓰레드 두 개를 생성해서 start
ServerReceiverThread ser_re_th = new ServerReceiverThread(client);
ServerSendThread ser_sen_th = new ServerSendThread(client);
ser_re_th.start();
ser_sen_th.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
서버로 부터 메시지를 받는 일만 하는 쓰레드
public class ClientReceiverThread implements Runnable{
Socket socket;
public ClientReceiverThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
BufferedReader in =null;
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String reM;
while((reM=in.readLine())!=null) {
System.out.println("서버>>"+reM);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ClientSendThread implements Runnable{
Socket socket;
public ClientSendThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
BufferedReader keyin = null;
PrintWriter out = null;
try {
out = new PrintWriter(socket.getOutputStream(),true);
keyin = new BufferedReader(new InputStreamReader(System.in));
String senM="";
while((senM=keyin.readLine())!=null) {
out.println(senM);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
서버와 통신하기 위한 클라이언트
public class SingleChatClient {
public static void main(String[] args) {
try {
//서버로접속
Socket socket = new Socket("192.168.0.4",12345);
//서버와 통신할 쓰레드 객체를 생성해서 start
new Thread(new ClientReceiverThread(socket)).start();
new Thread(new ClientSendThread(socket)).start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}




본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.