반응형
TCP통신
서버는 서버의 역할을 하기 위해 소켓 객채를 생성한 후 클라이언트로부터 들어오는 데이터를 받기 위해 포트를 열어놓고 대기해야 한다. ( Servet Socket )
클라이언트는 서버의 IP와 포트의 정보를 알아야 한다. ( Socket )
- 소켓 끼리의 통신하는 것이다 !!
서버와 클라이언트가 1대1로 채팅을 할 수 있도록 구현하기
- ConsoleChatServer.java : 서버
- ConsoleChatClient.java : 클라이언트
클라이언트와 서버의 input/output을 쓰레드로 구현
- ClientSenderThread
- ClientReceiveThread
- ServerSenderThread
- ServerReceiveThread
package single.console.chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
class ClientSenderThread extends Thread{
Socket socket;
public ClientSenderThread(Socket socket) {
super();
this.socket = socket;
}
//키보드로 입력한 내용을 서버로 보내는 작업
public void run() {
PrintWriter out= null;
BufferedReader keyin = null;
try {
out = new PrintWriter(socket.getOutputStream(), true);
keyin = new BufferedReader(new InputStreamReader(System.in));
String sendMsg ="";//서버로 보낼 메시지
while(true) {
sendMsg = keyin.readLine();
if(sendMsg ==null) break;
out.println(sendMsg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//서버가 전송하는 데이터를 클라이언트에서 읽는 작업을 수행하는 쓰레드
class ClientReceiveThread extends Thread{
Socket socket;
public ClientReceiveThread(Socket socket) {
super();
this.socket = socket;
}
public void run() {
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String resMsg = "";
while(true) {
resMsg = in.readLine();
if(resMsg==null) break;
System.out.println("서버>>"+resMsg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//서버에서 클라이언트로 데이터를 전송하는 작업을 수행하는 쓰레드
class ServerSenderThread extends Thread{
Socket socket;
public ServerSenderThread(Socket socket) {
super();
this.socket = socket;
}
//키보드로 입력한 내용을 서버로 보내는 작업
public void run() {
PrintWriter out= null;
BufferedReader keyin = null;
try {
out = new PrintWriter(socket.getOutputStream(), true);
keyin = new BufferedReader(new InputStreamReader(System.in));
String sendMsg ="";//클라이언트로 보낼 메시지
while(true) {
sendMsg = keyin.readLine();
if(sendMsg ==null) break;
out.println(sendMsg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//서버에서 클라이언트가 전송하는 데이터를 읽는 작업을 수행하는 쓰레드
class ServerReceiveThread extends Thread{
Socket socket;
public ServerReceiveThread(Socket socket) {
super();
this.socket = socket;
}
public void run() {
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String resMsg = "";
while(true) {
resMsg = in.readLine();
if(resMsg==null) break;
System.out.println("클라이언트>>"+resMsg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ConsoleChatServer {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(12345);
while(true) { // 1:1 통신이므로 While 하나만 있어도 된다.
Socket socket = server.accept();
InetAddress clientInfo = socket.getInetAddress();
System.out.println("접속한 클라이언트:"+clientInfo.getHostAddress());
ServerSenderThread senderThread = new ServerSenderThread(socket);
senderThread.start();
new ServerReceiveThread(socket).start();
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package single.console.chat;
//바이너리데이터를 읽고 쓰지 않는 경우 - 문자열
public class ConsoleChatClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("70.12.115.65", 12345);
new ClientReceiveThread(socket).start();
new ClientSenderThread(socket).start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 안드로이드에서 별도의 네트워크에 관한 모든 작업은 쓰레드로 처리해야 한다.
- 확인!! 안드로이드에서 DB를 이용해서 작업하려면 JSON으로 데이터를 받은후 작업해야 한다!!
20-05-07 목
멀티채팅 구현하기
- 클라이언트가 접속하면, 클라이언트와 통신할 수 있는 실행흐름이 쓰레드로 돌고있음.
- 각각의 유저들이 자신들의 독립적인 실행 흐름을 구현해야 하기 때문에 User객체를 이용.
반응형
'Computer Science > [ Network ]' 카테고리의 다른 글
[ Network ] 05. TCP와 UDP (0) | 2020.09.22 |
---|---|
[ Network ] 04. 전송계층(Transport Layer) (0) | 2020.09.22 |
[ Network ] 03. CAN통신에 관하여 (0) | 2020.08.14 |
[ Network ] 02. I2C통신에 관하여 (0) | 2020.08.14 |
[ Network ] 00. 네트워크란 무엇인가 (0) | 2020.08.11 |