일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 자바 #관리프로그램 기초
- 자바기본
- Spring 게시판 상세 조회
- spring framework
- spring 게시판 만들기
- Spring 게시판 작성
- #자바 #로또
- 데이터베이스
- Spring 게시판 수정삭제
- Today
- Total
JeongseokDEV-SimpleU
[자바]채팅 프로그램(2) 본문
1)자바 채팅프로그램 ( Server 부분 소스코드)
코드 붙여넣기 = Color Scripter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static final int PORT = 6077;
public static void main(String[] args)
{
ServerSocket serverSocket = null;
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream os = null;
OutputStreamWriter osw = null;
PrintWriter pw = null;
Scanner sc = new Scanner(System.in);
try {
serverSocket = new ServerSocket();
InetAddress inetAddress = InetAddress.getLocalHost();
String localhost = inetAddress.getHostAddress();
serverSocket.bind(new InetSocketAddress(localhost, PORT));
System.out.println("[server] binding" + localhost);
Socket socket = serverSocket.accept();
InetSocketAddress socketAddress = (InetSocketAddress) socket.getRemoteSocketAddress();
System.out.println("[server] connected by client");
System.out.println("[server] connect with" + socketAddress.getHostString()+ " " +socket.getPort());
while(true)
{
is = socket.getInputStream();
isr = new InputStreamReader(is,"UTF-8");
br = new BufferedReader(isr);
os = socket.getOutputStream();
osw = new OutputStreamWriter(os, "UTF-8");
pw = new PrintWriter(osw, true);
String buffer = null;
buffer = br.readLine();
if(buffer == null)
{
System.out.println("[server] closed by client");
break;
}
System.out.println("[server] recived : " +buffer);
pw.println(buffer);
}
}catch(IOException e)
{
e.printStackTrace();
}finally{
try {
if(serverSocket != null && !serverSocket.isClosed())
}catch(Exception e)
{
e.printStackTrace();
}
}
}
}
|
1 - 12 라인 ) BufferedReader - Buffer에 있는 I/O클래스로 입력된 데이터가 바로 전달 되지않고 중간에 버퍼링이 된 후 전달
IOEception - I/O 오류가 발생하는 경우에 throws되는 예외
ServerSocket - 서버 역할을 하는 소켓 객체 / 클라이언트의 연결 요청을 기다리면서
연결 요청에 대한 수락을 담당
Socket - 클라이언트와 서버간의 통신을 직접 담당
InetAddress - IP주소를 표현 할 떄 사용하는 클래스
InetSocketAddress - SocketAddress를 상속받은 클래스로서 소켓의 IP주소와 PORT번호를
알 수 있도록 구현한 클래스 도메인 이름만 알아도 객체 생성 가능
InputStream / OutputStream - byte데이터를 입출력 하기 위한 I/O클래스
PrintWriter - 원본 텍스트 파일을 복사해주는 프로그램
15 라인 ) 서버의 포트 번호를 6077로 설정
19 - 28 라인 ) InputStream / InputStreamReader / BufferedReader / OutputStream / OutputStreamReader
/ PrintWriter 의 변수를 생성하고 값은 null로 설정
Scanner객체 sc 생성
30 - 65 라인 ) ServerSocket의 객체를 생성하고 InetAddress의 주소를 받아옴 받아온 주소값을 localhost에 넣고 localhost와 port를 bind함.
서버의 ServerSocket객체가 accept메소드를 호출하면 서버는 클라이언트에서ServerSocket의 객체를 생성
InetAddress.getLocalHost InetAddress의 주소를 받아옴
받아온 주소값을 localhost에 넣음localhost와 port를 bind함
서버의 ServerSocket객체가 accept메소드를 호출하면 서버는 클라이언트에서 연결 요청을 받을 때까지 대기
연결 요청을 받으면 accept메소드는 클라이언트와 통신할 수 있는 Socket객체를 반환 이 후 Socket객체를 통해서 통신
클라이언트로부터의 연결 요청을 수락하고 Socket객체를 반환
클라이언트로부터 연결 요청이 있을 떄까지 블로킹 됨
연결된 클라이언트의 주소를 알고 싶다면 socket의 getRemoteAddress()메소드를 호출하면 됨 /
이 메소드는 SocketAddress객체를 반환하는데 실제로는 InetSocketAddress을 반환하기 때문에
InetSocketAddress로 참조할 수 있음 소켓에서 InputStream과 OutStream을 가져와서 IO를 수행할 준비
보조스트림을 연결함
클라이언트로 부터 온 문자열을 읽음 넘어오는 문자열이 null이면 클라이언트가 소켓을 닫았다는 뜻이므로
while루프를 탈출하여 서버를 종료
53 라인 ) PrintWriter를 생성하고 autoFlush옵션을 true로 주었을때 println매소드를 사용해야 autoflush가 작동 됨
만약 다른 메소드를 사용할 시에 버퍼를 비워주는 메소드를 명시해 주어야함
//*-------------while문으로 무한루프를 돌리는 이유는 한번의 요청과 응답이 끝나면 소켓이 종료되기 때문
요청과 응답을 계속 이어지게 하기 위해서 무한루프로 클라이언트가 소켓을 닫을 때 까지 계속 연결을 유지시켜줌
2)자바 채팅프로그램 (Client 부분 소스코드)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPCliient {
public static void main(String[] args)
{
Socket socket = new Socket();
Scanner sc = new Scanner(System.in);
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream os = null;
OutputStreamWriter osw =null;
PrintWriter pw = null;
try {
socket.connect(new InetSocketAddress(InetAddress.getLocalHost(), 6077));
System.out.println("[Client] connected with server");
while(true)
{
is = socket.getInputStream();
isr = new InputStreamReader(is, "UTF-8");
br = new BufferedReader(isr);
os = socket.getOutputStream();
osw = new OutputStreamWriter(os, "UTF-8");
pw = new PrintWriter(osw, true);
System.out.print(">>");
String data = sc.nextLine();
if("exit".equals(data))
break;
pw.println(data);
data = br.readLine();
System.out.println("<<" + data);
}
} catch(IOException e)
{
e.printStackTrace();
} finally {
try {
if(socket != null && !socket.isClosed()) {
}
} catch(IOException e) {
e.printStackTrace();
}
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
1 - 12 라인 ) BufferedReader - Buffer에 있는 I/O클래스로 입력된 데이터가 바로 전달 되지않고 중간에 버퍼링이 된 후 전달
IOEception - I/O 오류가 발생하는 경우에 throws되는 예외
ServerSocket - 서버 역할을 하는 소켓 객체 / 클라이언트의 연결 요청을 기다리면서
연결 요청에 대한 수락을 담당
Socket - 클라이언트와 서버간의 통신을 직접 담당
InetAddress - IP주소를 표현 할 떄 사용하는 클래스
InetSocketAddress - SocketAddress를 상속받은 클래스로서 소켓의 IP주소와 PORT번호를
알 수 있도록 구현한 클래스 도메인 이름만 알아도 객체 생성 가능
InputStream / OutputStream - byte데이터를 입출력 하기 위한 I/O클래스
PrintWriter - 원본 텍스트 파일을 복사해주는 프로그램
48 - 57 라인 ) data에 sc.nextLine()으로 입력 data에 exit가 입력 되면 종료 pw.println(data) data에 입력 값을 복사
데이터를 주고 받음.
'자바' 카테고리의 다른 글
[자바] (0) | 2020.02.11 |
---|---|
[자바]BubbleSort, SelectionSort, InsertionSort (0) | 2020.02.07 |
[자바]관리 프로그램 기초( 도서 ) (0) | 2020.02.07 |
[자바]채팅프로그램(1) (0) | 2020.01.31 |
[자바]로또 프로그램 (0) | 2020.01.30 |