您的位置:首页 > 理论基础 > 计算机网络

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

2013-11-11 22:03 375 查看
实现功能如下:
在同一个窗口中实现聊天,可以选择发送的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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息