Unicast?
echo program 과 비슷하다.
echo program 은 Client 가 Server로 메시지 전송 후 Server 가 Client로 메시지를 전송하면 그 즉시 Client는 종료해 버린다.
하지만 Unicast Program은 Client 가 Server 로 전송하고 Server 가 Client에게 다시 전송하여도 Client, Server는 종료하지 않고 계속적으로 서로 메시지를 전송할 수 있다.
또한 echo program 은 오직 하나의 Client 에게만 전송할 수 있지만, Unicast 채팅은 한 Server 가 여러 대의 Client에게 1:1로 메시지를 전송할 수 있다.
Server 부분 코드
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class UniServer {
ServerSocket ss=null;
public static void main(String[] args) {
UniServer server=new UniServer();
Socket socket=null;
try {
server.ss=new ServerSocket(12345);
System.out.println("Server > Server Socket is Created... ");
while(true) {
socket=server.ss.accept();
UniChat c=new UniChat(socket);
c.start();
}
}catch(IOException e) {
System.out.println("Server > 입출력예외 발생");
}
}
}
class UniChat extends Thread{
Socket socket;
private BufferedReader bufferR;
private BufferedWriter bufferW;
private InputStream is;
private OutputStream os;
UniChat(Socket _socket){
this.socket=_socket;
}
public void run() {
try {
is=socket.getInputStream();
os=socket.getOutputStream();
while(true) {
bufferR=new BufferedReader(new InputStreamReader(is));
bufferW=new BufferedWriter(new OutputStreamWriter(os));
String message = bufferR.readLine();
System.out.println("수신메시지 : "+ message);
message += System.getProperty("line.separator");
bufferW.write(message);
bufferW.flush();
}
}catch(Exception e) {
}
}
}
Client 부분 코드
import java.io.*;
import java.net.*;
public class UniClient {
private String ip;
private int port;
private String str;
BufferedReader file;
MsgListener msgListener=null;
public UniClient(String ip, int port) throws IOException {
this.ip = ip;
this.port = port;
Socket tcpSocket = getSocket();
OutputStream os_socket = tcpSocket.getOutputStream();
msgListener=new MsgListener(tcpSocket);
msgListener.start();
BufferedWriter bufferW = new BufferedWriter(
new OutputStreamWriter(os_socket));
while(msgListener.isAlive()) {
System.out.print("입력 : ");
file = new BufferedReader(
new InputStreamReader(System.in));
str = file.readLine();
// str += System.getProperty("line.separator"); 구버전용 개행문자
str +=System.lineSeparator();
bufferW.write(str);
bufferW.flush();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public Socket getSocket() {
Socket tcpSocket = null;
try {
tcpSocket = new Socket(ip, port);
} catch (IOException ioe) {
ioe.printStackTrace();
System.exit(0);
}
return tcpSocket;
}
public static void main(String[] args)throws IOException {
new UniClient("localhost", 12345);
}
}
class MsgListener extends Thread{
Socket socket;
private String str;
MsgListener(Socket _s){
this.socket=_s;
}
public void run() {
try {
InputStream is_socket = socket.getInputStream();
BufferedReader bufferR = new BufferedReader(
new InputStreamReader(is_socket));
while(true) {
str = bufferR.readLine();
if(str.equals("bye")) {
System.out.println("소켓통신 종료하겠습니다.");
break;
}else {
System.out.println("Echo Result : " + str);
}
}
}catch(Exception e) {
System.out.println("err");
}
}
}
하지만 이방식은 객체지향적이지 못한거 같다,, 그러므로 객체지향적으로 짯을때 아래의 코드와 같다
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class UniServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
try {
serverSocket = new ServerSocket(55555);
socket = serverSocket.accept();
Thread thread1 = new SenderThread(socket);
Thread thread2 = new ReceiverThread(socket);
thread1.start();
thread2.start();
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
try {
serverSocket.close();
} catch (Exception ignored) {
}
}
}
}
import java.io.*;
import java.net.*;
class UniClient{
public static void main(String[] args) {
Socket socket = null;
try{
socket = new Socket("localhost",55555);
Thread thread1 = new SenderThread(socket);
Thread thread2 =new ReceiverThread(socket);
thread1.start();
thread2.start();
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
송신전용 쓰레드
import java.io.*;
import java.net.Socket;
public class SenderThread extends Thread {
Socket socket;
public SenderThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.flush();
while (true) {
System.out.print("입력:");
String str = reader.readLine();
if (str.equals("bye"))
break;
writer.println(str);
writer.flush();
}
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
try {
socket.close();
} catch (Exception ignored) {
}
}
}
}
수신전용 쓰레드
import java.net.*;
import java.io.*;
public class ReceiverThread extends Thread{
Socket socket;
public ReceiverThread(Socket socket) {
this.socket = socket;
}
public void run() {
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String str = reader.readLine();
if(str == null)
break;
System.out.println("from>" + str);
}
}catch(IOException e){
System.out.println(e.getMessage());
}
}
}'Java기초' 카테고리의 다른 글
| [Java]Random 클래스 사용 로또생성기활용 (0) | 2022.07.11 |
|---|---|
| [Java]상속관계 간단급여관리 프로그램 Team Project (0) | 2022.07.10 |
| [Java]Map<E> 성적관리 (0) | 2022.07.07 |
| [Java]Set<E> 성적관리 (0) | 2022.07.07 |
| [Java] List 성적관리 (0) | 2022.07.07 |
댓글