<b> ~ </b>

- 글자 강조 태그(Bold), 볼드체(굵은 글씨체)

- 키워드, 리뷰에서의 상품명, 기타 보통 볼드체로 표현하는 텍스트에 사용

 

<em> ~ </em>

- 텍스트 강조 태그(Emphasis). 주관적인 강조를 나타낼 뿐, 중요성을 나타내지는 않는다.

- 강조체(이탤릭체). i 태그와 동일하게 출력

 

<i> ~ </i>

- 이탤릭체 태그

- 다른 언어에서 널리 쓰이는 숙어의 인용, 생각, 꿈, 분류학 명칭, 기타 보통 이탤릭체로 표현하는 텍스트에 사용

 

<dfn> ~ </dfn>

- 용어 정의 태그(Defining Instance of aTerm)

- 웹 페이지 내의 용어, 단어 등의 정의할 때 사용(이탤릭체로 표시)

 

<pre> ~ </pre>

- 서식 설정 텍스트 태그 (Preformatted Text)

- 서식이 설정된 텍스트를 표시하는 데 사용

- <pre> 태그는 텍스트 박스에 입력된 그대로 상태를 웹 페이지 상에 보여주는 태그. 예를 들면 공백, 탭(Tab), 엔터키 등을 그대로 화면상에 표현할 수 있다.

 

<sub> ~ </sub>

- 첨자 텍스트 태그 (Subscript)

- 아래 첨자

 

<sup> ~ </sup>

- 슈퍼 스크립트 태그 (SuperScript)

- 위 첨자

 

<s> ~ </s>

- 텍스트 가운데 선 정의 태그(Strikethrough)

- 문자의 가운데에 선을 넣어 준다. HTML5에서는 지원하지 않음

 

<u> ~ </u>

- 밑줄 태그(Underline). HTML 5 에서는 지원하지 않음

 

<cite> ~ </cite>

- 인용 태그(Citation)

- 제목(책, 노래, 영화, TV 쇼, 그림, 조각 등 제목)을 나타낼 때 사용

 

<code> ~ </code>

- 코드 예제 태그(Code Listing)

- 컴퓨터와 관련된 모든 코드 마크업 하는 코드, XML 속성이름, 파일이름 등 표시하기 위해 사용

 

ex07 >>

더보기

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h3>formatting 관련 태그</h3>

<p>b : 글자 <b>강조</b> 태그</p>
<p>em : 텍스트 <em>강조</em>. 이탤릭체. i 태그와 동일</p>
<p>i : <i>이텔릭체</i> 태그</p>
<hr>

<p> pre : 문서 서식 설정 텍스트 태그. 공백, 탭, 엔터등을 화면상에 표현할 수 있다.</p>
<pre>
	자바
	스프링
	HTML CSS		Javascript
</pre>
<hr>

<p> sub : 아래첨자, sup : 위첨자</p>
<p> log<sub>2</sub>x<sup>10</sup></p>
<hr>

<p> code : 코드 예제 태그. 마크업 하는 코드, XML 속성이름, 파일명 등을 표시 </p>
<code>sample.html</code>

</body>
</html>

공통적으로 사용하는 속성(Global Attributes)

- accesskey : 문서의 요소에 단축키 설정

- class : 문서의 요소를 식별. 스타일시트 선택자(CSS의 셀렉터)

- dir : HTML문서의 요소 안에 있는 텍스트의 방향을 설정

- id : 요소의 유일한 식별. 스타일시트 선택자

- lang : 요소 내용의 언어를 지정

- style : 요소에 대한 인라인 스타일을 지정

- tabindex : 탭 순서에서의 위치를 지정

- title : 해당 element 의 제목

 

+ HTML 5 추가 속성

- contenteditable : 편집 가능한 영역임을 표시하는 속성

- data-* : HTML 안에 속성처럼 데이터를 저장하거나 추가

- draggable : 지정된 요소를 드래그 할 수 있게 한다. 웹 브라우저 외부로까지 드래그가 가능하다.

- dropzone : 드래그된 데이터를 드롭할 때 복사, 이동, 링크

- hidden : CSS를 사용하지 않고도 HTML 내에서 요소를 숨길 수가 있다.

 

ex06 >>

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

<style type="text/css">
.box {
	border: 3px solid gray;
	width: 500px;
	height: 100px;
}
</style>

</head>
<body>

<h3>공통 속성</h3>

<p>노랑 상자에 마우스를 올려 보세요...</p>
<div title="안녕.." style="width: 300px; height: 50px; background: yellow;"></div>
<hr>

<!-- contenteditable : 내용을 입력할 수 있는지의 여부를 지정하며 입력된 내용의 제어는 자바스크립트로  -->
<p class="box" contenteditable="true"></p>
<hr>

<p>data-* : 개발자가 임의의 속성을 html 요소에 추가할 때 사용 </p>
<ul>
	<li data-subject="java">자바</li>
	<li data-subject="spring">스프링</li>
	<li data-subject="oracle">오라클</li>
</ul>
<hr>

<p> draggable : 지정된 요소의 드래그 가능 여부를 지정</p>
<div class="box" draggable="true">드래그 예제</div>


</body>
</html>

 

 

블록 레벨 요소 (Block Level Element)

- 블록 레벨 요소는 전후 줄 바꿈이 들어가 다른 요소들을 다른 줄로 밀어내고 혼자 한줄을 차지

- 특징

 · 항상 새로운 라인에서 시작한다.

 · 화면 크기 전체의 가로 폭을 차지한다. (width : 100%)

 · width, height, margin, padding 프로퍼티 지정이 가능하다.

 · block 레벨 요소 내에 inline 레벨 요소를 포함할 수 있다.

 · block 레벨 요소 예 div, h1~h6, p, ol, ul, li, hr, table, form 등 . . .

 

인라인 레벨 요소 (Inline Level Elemet)

- 인라인 레벨 요소는 전후 줄 바꿈 없이 한 줄에 다른 요소들과 나란히 배치

- 특징

 · 새로운 라인에서 시작하지 않으며 문장의 중간에 들어갈 수 있다.

   즉, 줄을 바꾸지 않고 다른 요소와 함께 한 행에 위치한다.

 · content의 너비만큼 가로 폭을 차지한다.

 · width, height 속성은 무시되며, margin과 padding 속성은 좌우 간격만 반영이 되고, 상하 간격은 반영이 되지 않는다. 즉, padding-top, padding-bottom, margin-top, magrin-bottom속성은 무시된다.

상, 하 여백은 line-height로 지정한다.

 · inline 레벨 요소 뒤에 공백(엔터, 스페이스 등)이 있는 경우, 정의하지 않은 공백(4px)이 자동 지정된다.

- inline 레벨 요소 내에 block 레벨 요소를 포함할 수 없다.

- inline 레벨 요소는 일반적으로 block 레벨 요소에 포함되어 사용된다.

- inline 레벨 요소 예 : span, a, string, img, br, input, select, textarea, button 등 . . .

 

ex04 >>

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h3>block 태그와 inline 태그</h3>

<div>
<p>
   - block 태그 : 혼자 한줄을 차지하며, 항상 새로운 라인에서 시작<br>
     화면 전체가 가로폭을 차지<br>
     width, height, margin, padding 프로퍼티 지정이 가능<br>
     block 태그에는 inline 태그를 포함할 수 있음
     주요 block 태그 : div, h!h6, p, ol, ul, li, table, form 등
</p>
</div>
<p>
   - line 태그 : 새로운 라인에 시작하지 않고 다른 요소들과 나란히 배치<br>
     content 요소 만큼 폭을 차지<br>
     width, height는 무시되고, margin, padding은 좌우 간격만 적용<br>
     line 태그 뒤에 공백(엔터 포함)이 있는 경우 4px 정도의 공백이 자동으로 생김<br>
     주요 inline 태그 : span, a, img, input, select, textarea, button 등 
</p>
<hr>

<h3>block 태그 예</h3>
<p style="background: yellow;">자바</p><p style="background: tomato;">스프링</p>
<p style="width: 200px; background: gray;">웹</p>
<p style="background: blue;">CSS</p>
<hr>

<h3>inline 태그 예</h3>
<span style="background: red;">자바</span><span style="background: green;">안드로이드</span>
<span style="background: tomato;">인라인태그의 공백 엔터등은 4px정도의 자동공백이 생김</span>
<span style="width: 300px; background: black; color: white;">안드로이드</span>
<hr>

</body>
</html>

 

HTML 특수문자

 

ex05 >>

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h3>html 특수문자</h3>

<p>
	&lt;br&gt; : 라인을 넘긴다.
</p>
<hr>

<p>
html은                             공백을 많이 띄어도 한칸만 떨어진다.
이럴 경우에는 &amp;nbsp;으로 공백을 띄을 수 있다.
</p>
<p>
스&nbsp;&nbsp;&nbsp;&nbsp;프&nbsp;&nbsp;&nbsp;&nbsp;링
</p>


</body>
</html>

 

<body> ~ </body>

- body 요소는 문서의 주된 콘텐츠를 나타낸다.

- HTML 문서에는 body 요소를 반드시 하나 기술한다.

 

<hx> ~ </hx>

- 글자크기를 지정하는 태그로 x는 1~6 사이의 숫자(1: 가장 큰 글씨, 6: 가장 작은 글씨)이다.

- <h> 태그는 자동으로 줄 바꿈이 이루어지며 타이틀을 입력할 경우에 보통 사용한다.

 

<p> ~ </p>

- 문단 태그 (Paragraph)

- 단락을 정의하며 한 문단을 바꾸는 경우 사용

- <p> 태그는 <br><br>과 유사하다. <p>태그의 원래 목적은 단순히 줄을 나누는 것이 아니라 문단을 브라우저에게 알려준다.

- <p> 태그는 종료 태그를 생략할 수 있는데, 이는 웹 브라우저들이 <p>태그와 만나게 되면 그 이전의 문단이 끝났다고 해석하기 때문이다.

 

<br>

- 줄 바꿈 태그 (Line Break). 줄 바꿈을 지정하는 데 사용한다.

 

<hr>

- 수평선 태그(Horizontal Rule). 문서 내에 수평선을 넣어주는 태그이다.

 

ex02 >>

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h3> h 태그</h3>

<p>
  글자 크기를 지정하는 태그로 보통 제목을 나타낼 때 사용
  크기는 1~6 이며 1이 가장 큼
</p>

<h1>h1 태그 예제</h1>
<h2>h2 태그 예제</h2>
<h3>h3 태그 예제</h3>
<h4>h4 태그 예제</h4>
<h5>h5 태그 예제</h5>
<h6>h6 태그 예제</h6>

</body>
</html>

 

ex03 >>

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h3>기본 태그</h3>

<div>
 - p 태그 : 문단 태그. 단락을 정의하여 한 문단을 나타내는데 사용<br>
   p태그는 &lt;br&gt;&lt;br&gt;과 유사한 정도의 간격이 생김<br>
 - br 태그 : 줄 바꿈 태그. <br>
   HTML은 엔터로 줄을 바꿀 수 없으며 공백도 한칸만 표시됨<br>
 - hr 태그 : 수평선 태그. 문서 내에 수평선을 넣어주는 태그.<br>
</div>

<p> p 태그 예제 1 </p>
<p> p 태그 예제 2 </p>
자바
안드로이드<br>
HTML
CSS<br><br>
servlet
JSP

<hr>
<hr color="blue">
<hr width="50%" align="center">
<hr size="5" width="50%" align="right">
<hr noshade="noshade" size="5" width="50%">

</body>
</html>

<!-- 주석 내용 입력 -->

- 문서의 내용을 설명하거나 나중에 태그 분석 등에 사용하기 위해서 사용한다. 하지만 나중에는 쓰면 안된다. client 에게도 데이터가 가므로 주석은 공부할 때만 사용할 것

 

<html> ~ </html> 

- HTML 문서의 최상위 태그로 HTML 문서의 시작과 끝을 나타낸다.

- head 요소와 body 요소를 포함할 수 있다.

- lang 속성으로 내용에서 사용할 언어를 지정할 수 있다.

<html lang="ko"> ~ </html>

 

<head> ~ </head>

- HTML 요소 내부의 첫 번째 요소로 사용

- head 요소는 문서의 메타데이터 집합을 나타낸다.

- 대부분 title요소를 포함해야 하지만 HTML로 쓴 이메일의 제목 줄처럼 상위 레벨의 프로토콜에서 타이틀 정보를 얻을 수 있을 때는 생략할 수 있다.

- 그 밖에 script, style, meta 요소를 정의할 수 있다.

 

<title> ~ </title>

- HTML 문서의 제목 표시 부분을 기술한다. 이 부분에 기술된 내용은 브라우저의 제목 표시줄에 나타난다.

 

<meta> 

- 메타 정보 태그(Meta-Information)

- meta 요소는 title 요소나 base 요소, link 요소, style 요소, script 요소로 표현할 수 없는 다양한 메타데이터를 표시한다.

- 내장 스크립트와 CSS 정보, 스크립트와 CSS 파일 링크 정보뿐만 아니라 검색 엔진을 위한 해당 문서의 검색 키워드 정보도 담을 수 있다.

- 가장 일반적으로 사용되는 속성은 name, content 속성이다.

- name 속성, http-equiv 속성, charset 속성 중 하나를 반드시 써야 한다.

 

- charset : 문자 인코딩을 정의. HTML 5 추가 속성

- content : 지정된 메타 키에 대한 관련 정보를 지정

- http-equiv : HTTP 응답 메세지 헤더에 대한 정보를 제공하는 태그

- name : 요소에 대한 이름을 지정

- scheme : 관련 메타 요소의 content 속성의 값을 나타내기 위해 사용할 수 있는 스키마를 지정

 

ex01 예시 >> 

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"> <!-- 기본:ISO-8859_1, 한글은 깨짐 -->
<meta name="keywords" content="html, css, javascript, tag">
	<!-- 검색엔진에게 제공할 키워드 -->
<meta http-equiv="refresh" content="10; url=https://www.naver.com">
	<!-- http-equiv : HTTP 응답 메세지 헤더에 대한 정보를 제공 -->
<title>첫번째 예제</title>
</head>
<body bgcolor="yellow">

<h3>meta 태그</h3>

<p> 10초 후 이동합니다.</p>


</body>
</html>
실행결과

10초 후에 naver로 이동한다

 

HTML 이란?

- HTML은 월드 와이드 웹(World Wide Web) 문서를 작성하는 Hyper Text Markup Language 이다.

Hyper Text : 한 문서 안의 특정 단어나 그림에  다른 문서가 연결된 형태 

Hyper Link : 특정 단어나 그림에 또 다른 문서나 그림을 꼬리에 꼬리를 물고 연결하는 것

- 웹 브라우저를 통하여 사용자에게 보여지는 문서의 내부 형식을 규정하는 언어이다.

- 제목, 본문, 목록, 링크, 이미지 등 다양한 컨텐츠를 의미 있게 마크업 할 수 있다.

- 웹 브라우저는 HTML태그를 읽고 분석하여 표현 내용을 화면에 나타낸다. 이로 인해 서로 다른 웹 브라우저라도 사용자에게는 동일한 형태의 웹 페이지를 표시할 수 있다.

- HTML 문서는 *.html, *.htm 등의 확장자를 사용한다.

 

Markup Language 

- 마크업 언어는 태그(tag) 등을 이용하여 문서나 데이터의 구조를 명기하는 언어의 한 가지이다.

- 태그는 원래 텍스트와는 별도로 원고의 교정부호와 주석을 표현하기 위한 것이었으나 용도가 점차 확장되어 문서의 구조를 표현하는 역할을 하게 되었다. 이러한 태그 방법의 체계를 마크업 언어라 한다.

- Markup은 문장, 그림, 표 배치, 폰트의 모양 및 크기, 들여쓰기, 줄 간격, 여백 등에 대한 정보를 의미한다.

 

웹 브라우저(Web Browser)

- HTML 문서와 그림, 멀티미디어 파일 등 월드 와이드 웹을 기반으로 한 인터넷 컨텐츠를 검색 및 열람하기 위한 응용 프로그램이다.

 

웹 페이지는 HTML, Javascript, CSS 의 3요소로 구성된다.

- HTML

웹 페이지상에서 문단, 제목, 표, 이미지, 동영상 등을 정의하고 그 구조와 의미를 부여하는 마크업 언어이다.

표준화된 태그로 웹 페이지를 작성한다. <html>, <head>, <body>, <img>, <a>, <table>, <div> 태그 등

 

- Javascript

객체 기반의 스크립트 프로그래밍 언어로 웹 브라우저 내에서 주로 사용하며, 다른 응용 프로그램의 내장 객체에도 접근할 수 있는 기능을 가지고 있다.

Node.js와 같은 런타임 환경과 같이 서버 사이드 네트워크 프로그래밍에도 사용되고 있다.

동적으로 컨텐츠를 바꾸거나 멀티미디어를 다루고, 움직이는 이미지 등 웹 페이지를 꾸며주도록 하는 프로그래밍 언어이다.

 

- CSS(Cascading Style Sheets)

CSS는 HTML 문서 내에 서체의 종류, 크기, 색, 여백 등을 지정하여 사용자의 web brower 환경에 상관 없이 일정한 화면을 보여주는 기능이다.

 

HTML 문서의 기본 형식

- DTD(Document Type Definition) 선언 : 문서의 첫 줄에 DTD 선언하며, DTD는 정의하는 문서에서 사용되는 언어와 버전 등을 지정한다.

- <html>~</html> : HTML 문서의 최상위 요소로 모든 HTML 문서는 하나의 <html> 요소를 갖는다.

- <head>~</head> : HTML 문서의 메타데이터(metadata)를 정의하며, 메타데이터는 HTML 문서에 대한 정보를 의미한다. 메타데이터는 <title>, <style>, <meta>, <link>, <script>, <base>태그 등을 이용하여 표현한다.

- <body>~</body> : 웹 브라우저를 통해 보이는 내용(content) 부분을 나타낸다.

 

태그(tag)의 기본 구성

- 요소 (element) : 시작과 종료를 나타내는 태그로 이루어진 모든 명령

- 태그 '<'과 '>'으로 둘러 쌓인 요소의 일부로 시작 태그(<tag>)와 종료 태그(</tag>)로 이루어져 있지만 종료 태그가 없는 태그도 있다.

- 속성(attribute) : 요소의 시작 태그 내에서 사용하며 명령어를 구체화 시키는 역할을 한다.

- 속성 값 : 속성과 관련된 값

- 태그와 속성은 대소문자를 구분하지 않는다.

 

<!DOCTYPE> 태그 >> 

더보기

- 문서 정의 태그(Document Type Definition)

- 문서에서 사용되는 언어와 버전을 지정하는 데 사용한다. 즉, HTML이 어떤 버전으로 작성되었는지 미리 선언해 웹 브라우저가 내용을 올바로 표시할 수 있도록 해준다.

- <! DOCTYPE> 태그는 모든 HTML문서의 최 상단에 기술한다.

 

DTD(Document Type Definition)

문서 형식 정의(DTD)는 페이지를 불러오기 위한 기본이 되는 문서타입을 정하는 것으로 브라우저에 현재의 웹 페이지가 어떤 문서 형식을 가지는지 전달해준다.

- 호환모드(Transitional Mode) : Transitional//EN : 생략해도 실행하는데 지장이 없는 트랜지셔널 모드를 말한다.

- 엄격모드(Strict Mode) : Strict//EN : 생략을 허용하지 않는 xml같이 올바른 형식의 문서(Well formed Document)를 의미한다.

이번에는 Java를 Orcale에 연동한 JDBC를 이용해서 Semi Project를 진행했다.

0901~0910까지 진행했으며 10일에 발표를 했다.

 

ERD

 

회원가입, 회원주문

더보기
회원가입 예시
회원주문

현재 주문과 동시에 포인트를 넣어주고 있음...(소스에서)

 나중에 배송이 완료된 이후(지금은 이것까지는 안했긴 함...) 배송일을 입력 한 후에 포인트를 넣던가 방식을 바꿔야 될 것 같다.

회원주문리스트

 

후기작성

>> 후기작성의 경우 도착일이 생긴 후에 작성하게끔 하려면 어떻게 해야될까 ?

후기작성할 때 빵코드를 입력받지 않고 후기작성하려면 ? >> 주문번호를 받아서 먼저 주문번호에 해당하는 결과를 받은 후에 별점 내용을 거기에 넣어서 해줘야될 듯 ..

 

내 정보

아직 상품준비중인데 포인트가 쌓였음. 이부분도 나중에는 생각해봐야할 문제

재고입고

더보기

아까 민트초코마카롱을 5개를 주문했는데 10개가 사라져있었다. 소스를 뜯어보니, 

재고를 변경하는 곳에 문제가 있었다.

빵코드를 입력받아 재고는 빵코드로 합쳐서 보여지는데, 

재고 업데이트를 빵코드를 받아서 하다보니까 빵코드에 해당하는 재고는 입고번호에 따라 계속 넣어지는데, (즉 빵코드에 해당하는 자료가 입고받을 때마다 넣어지므로 여러개) 재고를 2번을 입고 받았었기 때문에 해당 빵코드의 qty에서 -5가 다 들어가기 때문에 2번의 입고 정보에 다 -5가 되어서 -10이 되었던 것이다.

 

납품업체 리스트

납품업체 리스트 확인.

납품업체 하나에 (부모테이블) 입고(자식테이블) 이 여러개가 존재할 수 있다. 참조키로 납품업체 코드를 해놨다. 그래서 납품업체 삭제는 거의 사용하지 않을 듯. 입고를 한번이라도 했으면 삭제해도 자식 레코드는 재고를 위해서 사용해야되서.

 

입고1
입고2

 

입고 후 재고확인

입고날짜를 넣어줄때는 매개변수가 없는 메소드를 통해 현재 날짜를 넣어주고,

데이터베이스에서 가져올 때는 매개변수가 있는 메소드를 통해 데이터베이스에서 가져온 날짜로 set할 수 있도록 overloading 을 통해 구현했다. 

입고번호도 overloading을 통해서 입고에서 넣어줄 때는 오늘날짜+랜덤번호 를 통해 넣었다.

데이터베이스에서 가져와서 데이터를 출력할 때는 가져온 값을 매개변수로 해서 넣어준다.

 

유통기한 조회, 폐기등록

더보기
폐기 전 재고
폐기
폐기 후 재고

폐기가 고구마케익만 되었다. 소스를 보고 해당 재고를 다 없애도록 고쳐야 할듯...

폐기 후 재고

하나씩 만 폐기되도록 되어있음. 한번 더 실행하니까 이번엔 뉴욕치즈케익이 사라졌음.

싹 다 사라지도록 변경해야될 것 같다.

배송일자 등록

더보기
배송등록 전 주문리스트

주문총금액부분은 없애야함.

배송등록

해당 주문번호에 배송일자를 추가한다.

배송등록 후 주문리스트
새로운 주문 확인

총 주문리스트 말고 새로운 주문만 확인하는 리스트도 있다.

배송등록 후 주문 확인 리스트

배송등록 후에는 주문 확인 리스트가 뜨지 않도록 설정했다.

비회원주문, 비회원주문확인

더보기
비회원 구매
비회원 구매
비회원구매목록확인

 

후기확인

 

판매현황

더보기
회원 판매현황

총팔린금액에 개당 금액이 들어가있다. 고쳐야함!

비회원 판매현황

여기도 총금액에 개당금액이 들어가있다.

 

 

수정이 필요한 부분은 짬짬히 따로 수정해가며 완성도를 높여보자!!

10일 남짓 시간동안 요구사항분석, 시나리오작성, 추상화, 코딩, 함께해준 팀원들에게 모두 감사합니다:)

 

CharForm >>

더보기
package netEx;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ChatForm extends JFrame implements ActionListener, Runnable {
	private static final long serialVersionUID = 1L;

	private JTextField tf = new JTextField();
	private JTextArea ta = new JTextArea();

	public ChatForm() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		ta.setEditable(false);
		JScrollPane sp = new JScrollPane(ta);
		add(sp, BorderLayout.CENTER);
		
		// JtextField에서 엔터를 누르면 ActionEvent가 발생되므로
		// 		ActionEvent를 등록하여 ActionEvent 처리
		tf.addActionListener(this);
		add(tf, BorderLayout.SOUTH);

		setTitle("채팅");
		setSize(500, 550);
		setVisible(true);

		tf.requestFocus();

	}

	public static void main(String[] args) {
		new ChatForm();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == tf) {
			String s = tf.getText().trim();
			if (s.length() == 0)
				return;

			try {

				ta.append("보냄] " + s + "\n");

				tf.setText("");
				tf.requestFocus(); // 포커스를 JTextField 에
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}

	}

	@Override
	public void run() {
		// TODO Auto-generated method stub

	}
}

 

ChatClient >>

더보기
package netEx;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ChatClient extends JFrame implements ActionListener, Runnable {
	private static final long serialVersionUID = 1L;

	private JTextField tf = new JTextField();
	private JTextArea ta = new JTextArea();

	private Socket sc = null;
	private String host = "127.0.0.1";
	private int port = 8000;
	private String nickName = "자바";

	public ChatClient() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		ta.setEditable(false);
		JScrollPane sp = new JScrollPane(ta);
		add(sp, BorderLayout.CENTER);

		// JtextField에서 엔터를 누르면 ActionEvent가 발생되므로
		// ActionEvent를 등록하여 ActionEvent 처리
		tf.addActionListener(this);
		add(tf, BorderLayout.SOUTH);

		setTitle("채팅-클라이언트");
		setSize(500, 550);
		setVisible(true);

		tf.requestFocus();

	}

	public void connect() {
		// 서버에 연결
		try {
			sc = new Socket(host, port);
			ta.setText("서버에 접속...\n");

			Thread t = new Thread(this);
			t.start();

		} catch (IOException e) {
			// 서버가 실행되지 않은 경우
			sc = null;
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new ChatClient().connect();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == tf) {
			String s = tf.getText().trim();
			if (s.length() == 0)
				return;

			try {
				if (sc == null) {
					return;
				}

				// 서버에 정보를 전송하기 위한 출력 스트림
				PrintStream out = new PrintStream(sc.getOutputStream());
				out.println(nickName + "] " + s); // 서버에게 문자열 전송

				ta.append("보냄] " + s + "\n");
				ta.setCaretPosition(ta.getDocument().getLength());;
				
				tf.setText("");
				tf.requestFocus(); // 포커스를 JTextField 에
			} catch (IOException e2) {
				ta.append("서버가 종료 됨 !!!\n");
				sc = null;
				// e2.printStackTrace();
			}
		}

	}

	@Override
	public void run() {
		String s;

		try {
			if (sc == null) {
				return;
			}

			// 서버가 보낸 정보를 받기 위한 입력 스트림
			BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));

			while((s = br.readLine())!=null) {
				ta.append(s+"\n");
				ta.setCaretPosition(ta.getDocument().getLength());;
			}
		} catch (IOException e) {
			s = "서버가 종료 되었습니다.\n";
			ta.append(s);
			sc = null;
			// e.printStackTrace();
		}

	}
}

 

ChatServer >>

더보기
package netEx;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

// 1:1 채팅
public class ChatServer extends JFrame implements ActionListener, Runnable {
	private static final long serialVersionUID = 1L;

	private JTextField tf = new JTextField();
	private JTextArea ta = new JTextArea();

	private ServerSocket ss = null;
	private int port = 8000;
	private Socket sc = null;

	public ChatServer() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		ta.setEditable(false);
		JScrollPane sp = new JScrollPane(ta);
		add(sp, BorderLayout.CENTER);

		tf.addActionListener(this);
		add(tf, BorderLayout.SOUTH);

		setTitle("채팅-서버");
		setSize(500, 550);
		setVisible(true);

		tf.requestFocus();
	}

	public void serverStart() {
		try {
			ss = new ServerSocket(port);
			ta.setText("서버 시작 !!!\n");
			sc = ss.accept(); // 클라이언트의 접속을 기다린다.
			// 클라이언트가 접속하면 클라이언트와 통신을 할 수 있는 Socket 객체를 반환 받는다.

			Thread t = new Thread(this);
			t.start();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new ChatServer().serverStart();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == tf) {
			String s = tf.getText().trim();
			if (s.length() == 0)
				return;

			try {
				if (sc == null) {
					return;
				}

				// 클라이언트에게 정보를 전송 한다.
				PrintStream out = new PrintStream(sc.getOutputStream());
				// OutputStream을 PrintStream으로 변환
				out.println("서버] " + s);

				ta.append("보냄] " + s + "\n");
				ta.setCaretPosition(ta.getDocument().getLength());;

				tf.setText("");
				tf.requestFocus(); // 포커스를 JTextField 에
			} catch (IOException e2) {
				// e2.printStackTrace();
				ta.append("클라이언트가 접속을 해제 했습니다.\n");
				sc = null;
			}
		}

	}

	@Override
	public void run() {
		String str;
		String ip = "";

		if (sc == null) {
			return;
		}

		try {
			// 접속한 클라이언트가 보낸 정보를 입력 스트림으로 받는다.
			BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
			
			// 접속한 클라이언트의 ip 주소
			ip = sc.getInetAddress().getHostAddress();
			ta.append("["+ip+"] 접속 ...\n");
			
			// 클라이언트가 보낸 정보를 받는다.
			while((str = br.readLine()) !=null ) {
				ta.append(str+"\n");
				ta.setCaretPosition(ta.getDocument().getLength());;
			}
			
		} catch (IOException e) {
			str = "["+ip+"] 접속 해제 !!!";
			ta.append(str+"\n");
			sc = null;
		}
	}
}

 

ChatServer2 >>

더보기
package netEx;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

// 1:다 채팅 프로그램
public class ChatServer2 {
	// 접속한 클라이언트를 저장하기 위한 벡터 객체
	private Vector<Socket> client = new Vector<>();
	private ServerSocket ss = null;
	private int port = 8000;

	// 내부 스레드 클래스
	class WorkerThread extends Thread {
		private Socket sc = null;

		public WorkerThread(Socket sc) {
			this.sc = sc;
		}

		@Override
		public void run() {
			String ip= null;
			String msg;
			
			try {
				// 클라이언트가 보낸 정보를 받기 위한 입력 스트림
				BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
				ip = sc.getInetAddress().getHostAddress();
				
				// 접속한 클라이언트 소켓을 벡터에 저장
				client.add(sc);
				
				// 다른 클라이언트에게 접속 사실을 알림
				msg = "["+ip+"] 에서 접속 !!!";
				sendMsg(msg);
				
				System.out.println(msg);
				
				// 클라이언트가 보낸 정보를 받아 다른 클라이언트에게 보냄
				while((msg = br.readLine()) != null) {
					sendMsg(msg);
				}
				
			} catch (IOException e) {
				// 클라이언트가 채팅방을 나간 경우
				msg = "["+ip+"] 퇴장...";
				sendMsg(msg);
				
				client.remove(sc);
				sc = null;
				System.out.println(msg);
			}
		}
		
		// 다른 모든 클라이언트에게 메세지 전송
		public void sendMsg(String msg) {
			for(Socket s : client) {
				try {
					if( s == sc) {
						continue; // 자기 자신
					}
					
					PrintStream out = new PrintStream(s.getOutputStream());
					out.println(msg);
				} catch (Exception e) {
				}
			}
		}
	}

	public void serverStart() {
		try {
			ss = new ServerSocket(port);
			System.out.println("서버 시작 !!!");

			while (true) {
				// 클라이언트 접속을 기다린다.
				Socket sc = ss.accept();

				// 클라이언트가 접속하면 클라이언트가 보낸 정보를 받을 스레드 객체를 생성하고 스레드를 실행한다.
				WorkerThread t = new WorkerThread(sc);
				t.start();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		ChatServer2 obj = new ChatServer2();
		obj.serverStart();
	}

}

 

 

+ Recent posts