정리노트

[자바/java] 간단 채팅 프로그램 / UDP 서버, 클라이언트 본문

프로그래밍/Java

[자바/java] 간단 채팅 프로그램 / UDP 서버, 클라이언트

Rolen 2023. 2. 7. 20:56

각 class 파일 실행

사용자 1

package chatUDP;
import java.io.IOException;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class UDPchat1 {
	protected JTextField textField;
	protected JTextArea textArea;
	
	DatagramSocket socket;	// UDP프로토콜 생성 클래스
	DatagramPacket packet;	// 주고 받을 데이터를 담는 클래스
	InetAddress address = null;
	final int myPort = 5000; 	// 수신용 포트번호
	final int otherPort = 6000;	// 송신용 포트번호
	
	public UDPchat1() throws IOException {
		MyFrame f = new MyFrame();
		address = InetAddress.getByName("127.0.0.1"); // IP주소를 얻는다.
        // 나의 포트번호로 DatagramSocket 객체 생성 (상대방은 나의 포트번호로 packet 사용)
		socket = new DatagramSocket(myPort);
        
	}
	
	public void process() {
		while (true) {
			try {
				byte buf[] = new byte[256];
				packet = new DatagramPacket(buf, buf.length);
				socket.receive(packet);		// Socket의 메소드로 패킷을 받고
				textArea.append("Receive: " + new String(buf) + "\n");	// 내용 표시
			} catch (IOException ioException) {
				ioException.printStackTrace();
			}
		}
	}

	class MyFrame extends JFrame implements ActionListener {
		public MyFrame() {
			super("Link");
			setDefaultCloseOperation(EXIT_ON_CLOSE);
			textField = new JTextField(30);
			textField.addActionListener(this);
			
			textArea = new JTextArea(10, 30);
			textArea.setEditable(false);
			
			add(textField, BorderLayout.PAGE_END);
			add(textArea, BorderLayout.CENTER);
			pack();
			setVisible(true);
		}
		public void actionPerformed(ActionEvent evt) {
			String s = textField.getText();
			byte[] buffer = s.getBytes();	// 내용입력 후 byte 변환
			DatagramPacket packet;
			// DataPacket생성자 (byte로 변환 한 내용, 길이, 나의IP, 상대 포트)
			packet = new DatagramPacket(buffer, buffer.length, address, otherPort);
			try {
				socket.send(packet);	// Socket 객체의 메소드로 packet 보내기.
			} catch (IOException e) {
				e.printStackTrace();
			}
			textArea.append("Send: " + s + "\n");
			textField.selectAll();
			textArea.setCaretPosition(textArea.getDocument().getLength());
		}
	}
	public static void main(String[] args) throws IOException {
		UDPchat1 c = new UDPchat1();
		c.process();
	}
}

사용자 2

package chatUDP;
import java.io.IOException;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class UDPchat2 {
	protected JTextField textField;
	protected JTextArea textArea;
	
	DatagramSocket socket;	// UDP프로토콜 생성 클래스
	DatagramPacket packet;	// 주고 받을 데이터를 담는 클래스
	InetAddress address = null;
	final int myPort = 6000; 	// 수신용 포트번호
	final int otherPort = 5000;	// 송신용 포트번호
	
	public UDPchat2() throws IOException {
		MyFrame f = new MyFrame();
		address = InetAddress.getByName("127.0.0.1");
		socket = new DatagramSocket(myPort);
	}
	
	public void process() {
		while (true) {
			try {
				byte buf[] = new byte[256];
				packet = new DatagramPacket(buf, buf.length);
				socket.receive(packet);		// 패킷을 받고
				textArea.append("Receive: " + new String(buf) + "\n");	// 내용 표시
			} catch (IOException ioException) {
				ioException.printStackTrace();
			}
		}
	}

	class MyFrame extends JFrame implements ActionListener {
		public MyFrame() {
			super("Zelda");
			setDefaultCloseOperation(EXIT_ON_CLOSE);
			textField = new JTextField(30);
			textField.addActionListener(this);
			
			textArea = new JTextArea(10, 30);
			textArea.setEditable(false);
			
			add(textField, BorderLayout.PAGE_END);
			add(textArea, BorderLayout.CENTER);
			pack();
			setVisible(true);
		}
		public void actionPerformed(ActionEvent evt) {
			String s = textField.getText();
			byte[] buffer = s.getBytes();
			DatagramPacket packet;
			packet = new DatagramPacket(buffer, buffer.length, address, otherPort);
			try {
				socket.send(packet);
			} catch (IOException e) {
				e.printStackTrace();
			}
			textArea.append("Send: " + s + "\n");
			textField.selectAll();
			textArea.setCaretPosition(textArea.getDocument().getLength());
		}
	}
	public static void main(String[] args) throws IOException {
		UDPchat2 c = new UDPchat2();
		c.process();
	}
}

 

728x90