Sponsored By
















양재 하나로마트 - 고담 / 함박스테이크


'ETC > 먹방' 카테고리의 다른 글

2019. 08. 18. 일. 저녁.  (0) 2019.08.18
2019. 08. 14. 수. 저녁.  (0) 2019.08.16
2019. 08. 12. 월. 점심.  (0) 2019.08.12
2019. 08. 10. 토. 점심.  (0) 2019.08.10
2019. 08. 08. 목. 저녁.  (0) 2019.08.08
여의도 창고43 - 육회비빔밥




'ETC > 먹방' 카테고리의 다른 글

2019. 08. 14. 수. 저녁.  (0) 2019.08.16
2019. 08. 13. 월. 점심.  (0) 2019.08.13
2019. 08. 10. 토. 점심.  (0) 2019.08.10
2019. 08. 08. 목. 저녁.  (0) 2019.08.08
2019. 08. 07. 수. 저녁.  (0) 2019.08.07

 

채팅창만들기2, 통신(네트워킹) 하는 방법 을 채팅창 만들기로 표현

 

 

 

먼저, 네트워크에 대해 조금 보겠다.

 

ㅁ. Internet ?? internet??

; Internet= web browser  // internet = inter networking

 

 

ㅁ. 네트워크는 쌍방작동되야함. 만약 그렇지않으면 싱크 싱크아크 아크를 확인해야한다.

 

 

ㅁ. 한 PC에서 개발해서 디버깅 할때에는 포트번호를 다르게주고, 

    실질적으로 사용할때는 같은 번호로 할당하고 아이피주소를 상대방주소로 바꾼다.

 

 

 

ㅁ. IP 기초

 

형태 : 0000.0000.0000.0000

 

1. 0~127 까지가 앞이 0번임 -> 0xxx.255.255.255 -> A클래스 (우리나라에 없다)

// 127.0.0.0 => loopback IP  랜카드까지 나가지 않고 내부적으로 작동. 따라서 잠시 확인할때 사용가능

// C:\Windows\System32\drivers\etc

 

2. 127~191 1로시작 -> 1xxx.xxxx.255.255 -> B클래스 

( 돈주고 사오는것임. 우리나라에 몇군대없다. 전자통신연구원, 서울대,연세대, 카이스트, 충남대 등 )

// 예, 172.16.X.X B클래스 사설IP

 

3. 192~223 세번째 자리까지 할당해줌. 예, 200.100. 1~10 .255-> C클래스

// 공유기를 써서 확장시킴. 10.x.x.x 는 사설아이피. 라우터밖으로 나오면 죽기때문에 내부적으로 사용

// ex, 192.168.x.x 는 사설IP

 

 

 

 

 

 

 

 

00. 자세한 내용은 주석 참조.







01. 내 포트번호를 10001 로 놓고 님 포트번호를 10002 로 놓은 상태에서 실행







02. 내 포트번호를 10002 로 놓고 님 포트번호를 10001 로 놓고 다시실행. 

    그러면 두 채팅창의 포트번호가 엊갈리게 되므로 통신가능하게 된다.







03. a채팅창에다 1111을 입력하니 b에 잘 전송된것을 확인할 수 있다.







04. 마찬가지로 b채팅창에도 222222를 입력해보자.







05. 통신이 원활하게 이루어지고 있는것을 확인할 수 있다.








※. 실제로 옆 컴퓨터와 통신해본 결과임. 정상적으로 작동됨을 확인할 수 있다.

 

 

 

 

 

 

 

※. 코드

 

import java.awt.BorderLayout;

import java.awt.FlowLayout;

import java.awt.Font;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

 

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

 

class Chatting {

 

/* 화면구성을 위한 변수들 */

private JPanel displayPanel; 

private JPanel inputPanel;

 

private JTextArea display;

private JTextField input;

 

/* 통신을 위한 변수들 */

private DatagramSocket socket;  // User Datagram Protocol 

private DatagramPacket packet;  // 수신할 데이터 패킷을 위함

private InetAddress address;  // 상대방주소

 

private int myPort = 10001;

private int yourPort = 10002;

 

 

public Chatting() {

 

new MyFrame();  

 

/* socket 설정 */

try {

 

address = InetAddress.getByName("127.0.0.1");  

// ; loopback address ; Testing in local  // 상대방의 IP

socket = new DatagramSocket(myPort);  // 수신할 포트설정

 

} catch (Exception e) {

display.append("ERROR : " + e.getMessage() + "\n");

}

 

}// Chatting Constructor

 

public void receive()

{

while(true)  // 무한정 돌면서 수신대기

{

try {  // 수신하다보면 에러가 생길 수 있기 때문에 예외처리로 

byte[] rcvBuffer = new byte[1024];  // 2승수로 바이트단위 잡아줘야함.

packet = new DatagramPacket(rcvBuffer, rcvBuffer.length);

socket.receive(packet);  // 소켓에서 수신하면

 

display.append("<< " + new String(rcvBuffer)  + "\n");  

// ; 수신데이터는 byte[] 이므로 String으로 변환

 

} catch (Exception e) {

display.append("ERROR (receive) : " + e.getMessage());

}

}

 

 

}// receive Method

 

 

class MyFrame extends JFrame implements ActionListener{

 

public MyFrame()

{

this.setTitle("My GUI");

this.setSize(500, 400);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

/*

 * panel 생성하고, 필요한 컴포넌트를 만들기

 */

 

displayPanel = new JPanel();

displayPanel.setLayout(new FlowLayout());

display = new JTextArea(11, 30);

Font displayFont = new Font("Serif", Font.BOLD, 20);

display.setFont(displayFont);

display.setEditable(false);

 

// textarea를 스크롤이 되도록 변경

JScrollPane scroll = new JScrollPane(display);

displayPanel.add(scroll);

 

inputPanel = new JPanel();

inputPanel.setLayout(new FlowLayout());

input = new JTextField(30);

Font inputFont = new Font("Serif", Font.BOLD, 20);

input.setFont(inputFont);

input.addActionListener(this);

 

inputPanel.add(input);

 

/*

 * Frame에 두개의 panel을 붙이기

 */

this.setLayout(new BorderLayout());

this.add(displayPanel, BorderLayout.CENTER);

this.add(inputPanel, BorderLayout.SOUTH);

 

 

this.setVisible(true);

}

 

@Override

public void actionPerformed(ActionEvent e) {

 

if(e.getSource() == input)

{

display.append(" >>  "+ input.getText() + "\n");  // 나가는 데이터를 나타내기 위해 >>

 

/* network로 데이터 전송 */  

// 데이터 전송시 바이트 단위로 전송

//

byte [] sendBuffer = input.getText().getBytes();  // input에서 getText를 바이트 단위로 변환해서 배열

 

// 전송할 데이터 패킷을 만듬

DatagramPacket sendPacket = new DatagramPacket(sendBuffer,sendBuffer.length, address, yourPort);  

// ; sendBuffer를 보낼거고, sendBuffer길이만큼 보내줄거고, 상대방주소에, 상대방포트 로 보내줄거임.  

 

try {

socket.send(sendPacket);  // send 시 에러가 생길수 있기 때문에 예외처리해줘야 함.

} catch (Exception e2) {

display.append("ERROR (send) : " + e2.getMessage() + "\n" );

}// tryCatch

 

//input.selectAll();

input.setText("");

 

}// if

 

}// actionPerformed

 

}// MyFrame Class

 

}// Chatting Class

 

 

public class Test {

 

public static void main(String[] args) {

 

Chatting chat = new Chatting();  // MyFrame Class 가 Chatting 클래스 안으로 들어갔기 때문에 

chat.receive();

 

}// main

 

}// Main Class

 

 

 

 

GUI 창에 HTML 을 파싱 하는 방법임.

 

 

 

 

 

간단하게 만들 GUI창을 설명하면

 

'UTF-8' 과 'EUC-KR' 을 선택할 콤보박스를 만들고 그옆에 주소창 입력칸을 만들어서 입력하면 

메인칸에 나타나게하도록 만들겠다.

 

 

 

 

00. 코드를 입력하고 실행하자.







01. 콤보박스에 'UTS-8'과 'EUC-KR' 선택할 수 있게 나온다.







02. 아무 주소를 입력해서 HTML파싱이 잘되는지 확인해보자.





 

 

03. 'UTF-8' 로 했을때 한글이 잘 나오는것을 확인할 수 있다.

 

 

 

 

 

 

04. 'EUC-KR' 로 했을때 한글이 깨져서 오는것을 확인할 수 있다.

 

 

 

 

 

※. 코드

 

import java.awt.BorderLayout;

import java.awt.FlowLayout;

import java.awt.Font;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.URL;

 

import javax.swing.JComboBox;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

 

class MyFrame extends JFrame implements ActionListener{

private JPanel displayPanel; 

private JPanel inputPanel;

 

private JTextArea display;

private JTextField input;

 

private String[] charset = {"UTF-8", "EUC-KR"};

private JComboBox charsetList;

 

 

public MyFrame()

{

this.setTitle("No Title");

}

 

 

public MyFrame(String title)

{

this.setTitle(title);

this.setSize(500, 400);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

this.setLayout( new BorderLayout() );

 

 

 

 

 

/*

 * panel 생성하고, 필요한 컴포넌트를 만들기

 */

 

displayPanel = new JPanel();

displayPanel.setLayout(new FlowLayout());

display = new JTextArea(11, 30);

Font displayFont = new Font("Serif", Font.BOLD, 20);

display.setFont(displayFont);

display.setEditable(false);

 

// textarea를 스크롤이 되도록 변경

JScrollPane scroll = new JScrollPane(display);

displayPanel.add(scroll);

 

/* input */

inputPanel = new JPanel();

inputPanel.setLayout(new FlowLayout());

input = new JTextField(20);

Font inputFont = new Font("Serif", Font.BOLD, 20);

input.setFont(inputFont);

input.addActionListener(this);

 

 

charsetList = new JComboBox(charset);  //콤보박스 추가

charsetList.setSize(100,40);

inputPanel.add(charsetList);  // 패널에 콤보박스 붙임

 

inputPanel.add(input);

 

/*

 * Frame에 두개의 panel을 붙이기

 */

this.setLayout(new BorderLayout());

this.add(displayPanel, BorderLayout.CENTER);

this.add(inputPanel, BorderLayout.SOUTH);

 

 

this.setVisible(true);

}

 

 

 

 

@Override

public void actionPerformed(ActionEvent e) {

 

if(e.getSource() == input)

{

display.append( input.getText() + "\n");

 

 

try {

 

URL url = new URL(input.getText());  // input에 주소창을 넣으면 그 값을 읽어옴.

 

display.setText("");  // 이벤트가 발생하면 display 를 비워주고 새로 getText해옴

 

String cs = (String)charsetList.getSelectedItem();  // 콤보박스에 있는 아이템을 cs 로 받음

 

BufferedReader in = new BufferedReader( new InputStreamReader( url.openStream(), cs ) );  // buffer는 한번에 주기적으로 받아오는것  

 

String line;

int count = 0;

String lineCount = "";

 

while( (line = in.readLine()) != null)

{

lineCount = lineCount.format("%4d : ", ++count);  // 4d 를 해서 제일 처음에 4줄을 잡아먹게 만든다.

display.append(lineCount + line + "\n");

 

}// while

 

} catch (Exception e2) {

display.append("ERROR : " + e2.getMessage() + '\n');

}

 

input.selectAll();

//input.setText("");

 

}// if

 

}// actionPerformed

 

}// MyFrame Class

 

 

public class Test {

 

public static void main(String[] args) {

 

MyFrame frame = new MyFrame("HTML");

 

}// main

 

}// Main Class

 

 

 

 

 

 

 

URL 을 불러와서 분석 하는 방법이다.

 

 

 

 

 

 

00. 예외처리안에 넣어줘야한다.

 

 

 

 

 

 

 



Sponsored By















+ Recent posts