Sponsored By
















 

채팅창만들기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

 

 

 

 



Sponsored By















+ Recent posts