-
package ch15;
class MyOuterClass {
int outerNum = 10;
public MyOuterClass() {
MyInnerClass mc = new MyInnerClass();
System.out.println(mc.innerNum);
}
class MyInnerClass {
int innerNum = 20;
}
}
public class InnerEx01 {
public static void main(String[] args) {
MyOuterClass moc = new MyOuterClass();
MyOuterClass.MyInnerClass d = moc.new MyInnerClass();
}
}
package Chat;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
public class MySocketServer {
ServerSocket serverSocket;
Vector<NewSocketThread> vt; // 어레이리스트와 비슷하지만 여러곳에서 동시접근 시 queue를 이용하여 순서대로 처리한다
public MySocketServer() throws Exception {
vt = new Vector<>(); // 새 벡터 객체 생성
serverSocket = new ServerSocket(3000);
while (true) {
// socket 을 보관해놔야한다 - 메시지 보내야할 소켓을 기억해야 하기 때문
// 요청을 대기 - 연결이 되면 소켓을 리턴하고 서버소켓에 연결된 선을 끊는다
Socket socket = serverSocket.accept();
System.out.println("요청이 들어옴");
// 스레드를 돌리기 위한 객체 생성(socket을 받는다)
// 각각 스레드는 자기가 연결해야할 socket을 객체 안에 들고 있게 된다
NewSocketThread nt = new NewSocketThread(socket);
// 새 스레드에 nt객체(타겟)을 넣는다
Thread newWorker = new Thread(nt);
// 스레드를 실행한다
newWorker.start();
// 벡터배열에 nt객체를 추가한다
vt.add(nt);
}
}
// 딴곳에 쓸일이없이 클래스 내부에서만 쓸거라면 내부클래스 생성
// 새로운 스레드에게 버퍼를 연결할 수 있게 socket을 전달
class NewSocketThread implements Runnable {
Socket socket; // MySocketServer()에서 서버소켓이 받은 소켓을 저장
BufferedReader br;
BufferedWriter bw;
public NewSocketThread(Socket socket) {
this.socket = socket; // 받은 소켓을 저장
}
@Override
public void run() {
try {
// 소켓에서 데이터를 받기 위한 버퍼
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 소켓에 데이터를 쓰기 위한 버퍼
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String msg = "";
// 버퍼에서 받은 데이터를 msg로 넣고 msg가 null이 아니면 내용을 실행한다
while ((msg = br.readLine()) != null) {
System.out.println("클라이언트 : " + msg);
// 클라이언트들에게 누군가가 보낸 메시지를 다시 보낸다
for (NewSocketThread newSocketThread : vt) {
// 메시지를 보낸 당사자를 제외하고 나머지 클라이언트들에게 보낸다
if (newSocketThread != this) {
newSocketThread.bw.write(msg + "\n");
newSocketThread.bw.flush(); // 버퍼를 비우는 것
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
new MySocketServer(); // 소켓 서버 가동
} catch (Exception e) {
e.printStackTrace();
}
}
}
package Chat;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class MySocketClient {
// 소켓 통신을 위한 변수 생성
Socket socket;
public MySocketClient() throws Exception {
// 소켓 객체 생성 - ip주소와 포트를 입력한다
socket = new Socket("192.168.0.85", 3000);
// 서버에서 보낸 데이터를 읽어들이는 쓰레드의 타겟을 생성한다
ReadThread rt = new ReadThread();
// 타겟을 쓰레드에 넣는다
Thread newWorker = new Thread(rt);
// 쓰레드 실행
newWorker.start();
// 소켓에 데이터를 보낼 bw 객체 생성
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 키보드로 받은 데이터를 읽어들일 버퍼 keyboardIn 생성
BufferedReader keyboardIn = new BufferedReader(new InputStreamReader(System.in));
String outPutMsg = "";
// 메인쓰레드는 여기서 무한루프
while ((outPutMsg = keyboardIn.readLine()) != null) {
bw.write(outPutMsg + "\n");
bw.flush();
}
}
// 쓰레드 실행을 위한 런 메서드를 포함한 러너블 클래스
class ReadThread implements Runnable {
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inputMsg = "";
// 상대방이 보낸 데이터를 서버가 이 클라이언트로 보내면 br로 읽어서 실행
while ((inputMsg = br.readLine()) != null) {
System.out.println("상대방 : " + inputMsg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
new MySocketClient(); // 클라이언트 메서드 실행
} catch (Exception e) {
e.printStackTrace();
}
}
}
-
'Programming Language > Java' 카테고리의 다른 글
자바 GUI (0) | 2020.04.17 |
---|---|
오라클 SQL 문제 및 정답 / 상관쿼리, DML (0) | 2020.04.17 |
자바 finally (0) | 2020.04.14 |
자바 채팅 프로그램 (0) | 2020.04.14 |
200414 // 통신 - 모스키토, 브로드캐스트, 블루투스, 소켓 (0) | 2020.04.14 |