UDP实现简单双人聊天

    相较于TCP,UDP的效率更高,今天我们来简单实现UDP双人聊天。

   大概的逻辑思路是这样的。

UDP实现简单双人聊天_第1张图片

 

UDP实现简单双人聊天_第2张图片

 

最后两块的代码时核心代码,前两个可不看!! 

/**
*
*实现界面
*/

package cmo.demo;

import java.awt.Button;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class MainFrame {
	
	static JTextArea area_show=new JTextArea();
	static JTextArea area_send=new JTextArea();
	static String date;
	static SimpleDateFormat df;
	public void init() {
		JFrame frame=new JFrame();
		frame.setSize(800,800);
		frame.setLocationRelativeTo(null);
		frame.setLayout(null);
		//添加发送按钮
		Button btn=new Button("发送");
		btn.setBounds(650, 700, 100, 50);
		frame.add(btn);
		//添加显示文本框
		area_show.setBounds(0,0,800,350);
		frame.add(area_show);
		//添加发送文本框
		area_send.setBounds(0,400,800,240);
		frame.add(area_send);
		
		Listener l=new Listener();
		frame.setVisible(true);
		btn.addActionListener(l);
	}
	
	public static void main(String args[]) {
		MainFrame main=new MainFrame();
		main.init();
		ReciveApp receive=new ReciveApp();
		receive.receive();
	}

        /**
        *
        *处理从自己发送出的数据,把发送框清空,显示框追加文字
        */

	public void DealSendText(String msg) {
		df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
		date=df.format(new Date());
		area_send.setText("");
		area_show.append(date+"\n"+msg+"\n");
		
	}
        
        /**
        *
        *处理接收的数据,显示框追加文字
        */

	public void DealReceiveText(String msg) {
		df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
		date=df.format(new Date());
		area_show.append(date+"\n"+msg+"\n");
		
	}

}
/**
*
*监听发送按钮,发送数据
*/

package cmo.demo;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Listener implements ActionListener{

	SendApp sa=new SendApp();
	public void actionPerformed(ActionEvent e) {
		String msg=MainFrame.area_send.getText();
		sa.send(msg);
		
	}
}

核心代码来了

/**
*
*发送数据
*/

package cmo.demo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;

public class SendApp {
	
	MainFrame frame=new MainFrame();
	
	public void send(String msg) {//msg是从窗口传入的要发送的数据
                //自己的发送地址,ip是自己的ip,端口号可以任意
		SocketAddress sendaddress=new InetSocketAddress("192.168.31.222",888);
                //对方的地址,ip是对方的ip,端口号是对方接收的端口号
		SocketAddress destaddress=new InetSocketAddress("192.168.31.93",666);

		DatagramSocket socket;
		try {
			socket = new DatagramSocket();
                        //packet的构造方法有很多种,这里写了一个
			DatagramPacket packet=new  DatagramPacket(msg.getBytes(),msg.getBytes().length, InetAddress.getByName("192.168.31.93"),666);
			socket.send(packet);
			System.out.println("send successfully");
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		//处理数据显示在窗体上
		frame.DealSendText(msg);

	}



}
/**
*
*接收数据
*/

package cmo.demo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;

public class ReciveApp {
	
	MainFrame frame=new MainFrame();
	
	public void receive() {
		SocketAddress localaddress=new InetSocketAddress("192.168.31.222",667);
		
                //定义缓冲区,用来存储接收的数据
		byte[] buffer=new byte[2048];
		try {
			DatagramSocket socket=new DatagramSocket(localaddress);
			DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
			
			while(true) {
				System.out.println("waiting……");
				socket.receive(packet);
				String msg=new String(packet.getData(),"utf-8").trim();
				frame.DealReceiveText(msg);
			}
				
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		
	}
}

 

将来会不断完善功能,文件,图片,气泡,群聊等等。

你可能感兴趣的:(Java)