Socket网络编程(二)UDP协议实现聊天工具


实现功能如下:
在同一个窗口中实现聊天,可以选择发送的IP地址


这个程序实现分三个步骤:
1)实现图形用户界面
在eclipse中创建一个工程chat,创建一个chat类继承Frame类(实现聊天窗口)
2)编写网络消息发送功能
输入窗口中添加回车事件,然后把要发送的IP和信息发送出去
3)编写网络消息接收功能
使用线程,持续接收信息


实现代码+解释:
package UDP_chat;

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.List;
import java.awt.Panel;
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.DatagramSocket;
import java.net.InetAddress;

 class Chat extends Frame {
    List lst = new List(6);
	TextField tfIP = new TextField(15);
	TextField tfData = new TextField(20);
	DatagramSocket ds = null;
	public List setLst(String item,int index){
		lst.add(item, index);
		return lst;
	}
	//构造函数里面实现窗口初始化、接收信息(线程)、发送信息
	public Chat(){
		try{
			ds = new DatagramSocket(3000);
		}catch(Exception e){
			e.printStackTrace();
		}
		this.add(lst,"Center");
		Panel p = new Panel();
		this.add(p,"South");
		
		p.setLayout(new BorderLayout());
		p.add(tfIP,"West");
		p.add(tfData,"East");
		//接收信息:创建一个线程,一直在接收信息
		new Thread(new Runnable(){
			public void run(){
				byte[] buf = new byte[1024];
				DatagramPacket dp = new DatagramPacket(buf,1024);
				//循环接收信息
				while(true){
					try{
						ds.receive(dp);
						String haha = "消息:"+new String(dp.getData(),0,dp.getLength())
										+" from "+dp.getAddress().getHostAddress()
										+":"+dp.getPort();
						//将接收的信息打印到信息栏
						lst.add(haha,0);
					}catch(Exception e){
						//ds没有关闭才执行抛出异常
						if(!ds.isClosed()){
							e.printStackTrace();
						}
					}
				}
			}
		}).start();
		
		//发送消息:消息信息点回车,触发事件
		tfData.addActionListener(new ActionListener(){
			//需要实现此方法
			public void actionPerformed(ActionEvent e){
				byte [] buf;
				//获取消息信息
				buf = tfData.getText().getBytes();
				
				try{
					//组装消息内容
					DatagramPacket dp= new DatagramPacket(buf,buf.length,
							InetAddress.getByName(tfIP.getText()),3000);
					//发送消息
					ds.send(dp);
				}catch(Exception ex){
					ex.printStackTrace();
				}
				tfData.setText("");
			}
		});
		//关闭窗口的触发事件,关闭ds
		addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				ds.close();
				dispose();
				System.exit(0);
			}
		});
	}
	
	public static void main(String[] args){
		//初始化窗口
		Chat chat = new Chat();
		chat.setSize(300,400);
		chat.setTitle("即时通讯");
		chat.setVisible(true);
		chat.setResizable(false);
	}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值