본문 바로가기

자바 DB 연동/네트워크

UDP 채팅 프로그램 소스 ( 多 대 多 )


import java.awt.BorderLayout;

import java.awt.Frame;

import java.awt.TextArea;

import java.awt.TextField;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.net.DatagramPacket;

import java.net.InetAddress;

import java.net.MulticastSocket;


// UDP 다대다

/*

  DatagramSocket : UDP 소켓으로 데이터그램패킷을 송수신

  DatagramPacket : UDP에서 송수신 될 수 있는 데이터

  MulticastSocket : 한번에 다수의 클라이언트에 데이터 그램을

 

  그룹범위 지정 : D class(224.0.0.0~239.255.255.255)

 */


public class ChatCS extends Frame implements ActionListener, Runnable {

private static final long serialVersionUID = 1L;


private TextArea ta=new TextArea();

private TextField tf=new TextField();

private MulticastSocket ms=null;

private InetAddress xGroup=null;

private String host="230.0.0.1";

private int port =5555;

private String name="자기이름";

public ChatCS(){

add(ta, BorderLayout.CENTER);

add(tf, BorderLayout.SOUTH);

tf.addActionListener(this);

addWindowListener(new WindowAdapter() {


@Override

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

setTitle("UDP 채팅....");

setSize(400,500);

setVisible(true);

}

public void setup(){

try{

xGroup=InetAddress.getByName(host);

ms=new MulticastSocket(port);

//특정 그룹에 포함

ms.joinGroup(xGroup);

Thread th=new Thread(this);

th.start();

}catch(Exception e){

System.out.println(e.toString());

}

}

public void disConnection(){

try{

ms.leaveGroup(xGroup); // 그룹에서 빠져나옴

ms.close();

}catch(Exception e){

System.out.println(e.toString());

}

}

public static void main(String[] args) {

new ChatCS().setup();

}


@Override

public void run() {

try{

while(true){

byte[] b=new byte[256];

//전송 받을 패킷

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

//전송 받음

ms.receive(packet);

String s=new String(packet.getData()).trim();

ta.append(s+"\n");

}

}catch(Exception e){

System.out.println(e.toString());

disConnection();

}

}


@Override

public void actionPerformed(ActionEvent e) {

if(ms==null)

return;

String str=tf.getText().trim();

if(str.length()==0)

return;

byte[] b=(name+"]"+ str).getBytes();

try{

//전송할 패킷

DatagramPacket packet=new DatagramPacket(b, b.length,xGroup,port);

//전송

ms.send(packet);

}catch(Exception e2){

System.out.println(e2.toString());

}

tf.setText("");

tf.requestFocus();

}

}