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();
}
}
'자바 DB 연동 > 네트워크' 카테고리의 다른 글
네트워크를 이용한 파일전송 (0) | 2013.06.19 |
---|---|
TCP 채팅 프로그램 - 서버 / 클라이언트(1:1 and 1:多) (1) | 2013.06.19 |
객체 직렬화 Serializable (0) | 2013.06.19 |
웹사이트의 소스보는 소스 (0) | 2013.06.19 |