黑马程序员技术交流社区
标题:
自己写的一个直接通过UDP协议实现聊天的软件,能否优化
[打印本页]
作者:
jiajun
时间:
2016-8-5 09:07
标题:
自己写的一个直接通过UDP协议实现聊天的软件,能否优化
package easyChat;
import java.io.*;//导入GUI相关包,输入输出流相关
import java.awt.*;//导入GUI相关包,Frame相关
import java.awt.event.*;//导入GUI相关包,监听器相关
import java.net.*;//导入网络相关包,socket服务相关
public class SimpleQQ
{
public static void main(String[] args)
{
new MyFrame();
}
}
class MyFrame//定义主窗体类
{
private Frame frame;//定义聊天窗口
private TextArea chatinfo;//定义聊天显示区域
private MenuBar mainmenu;//定义主菜单栏
private MenuItem pic;//定义图片发送菜单
private MenuItem sound;//定义语音发送菜单
private MenuItem video;////定义视频发送菜单
private Menu biaoqing;//定于表情包发送菜单
private TextField chatarea;//定义聊天文本框
private Button send;//定义发送按钮
private Thread t_send;
private Thread t_recv;
private UDPSend udpsend;
MyFrame()//窗口构造函数
{
initial();
}
public void initial()//定义窗口初始化信息
{
frame=new Frame("易Q");
frame.setBounds(300,200,500,400);//定义主窗体,宽和高
frame.setLayout(new FlowLayout());//定义流式布局,后期需改动
chatinfo=new TextArea(20,60);//定义聊天显示区,宽48,高35行
mainmenu=new MenuBar();
chatarea=new TextField(53);//定义聊天输入区域大小,宽度45
send=new Button("发送");//定义发送按钮
frame.add(chatinfo);//窗体添加聊天显示区域
frame.setMenuBar(mainmenu);//窗体添加菜单栏
frame.add(chatarea);//窗体添加聊天输入区域
frame.add(send);//窗体添加发送按钮
myEvent();//
frame.setVisible(true);//设置窗口显示
udpsend=new UDPSend(chatarea);
t_recv=new Thread(new UDPRecv(chatinfo));
//t_send=new Thread(new UDPSend(chatarea));
t_recv.start();
}
public void myEvent()//定义事件监听器及反馈
{
frame.addWindowListener(new WindowAdapter()//主窗体监听器
{
public void windowClosing(WindowEvent e)//定义关闭按钮功能-->退出程序
{
System.exit(0);
}
});
send.addActionListener(new ActionListener()//定义发送按钮活动监听器
{
public void actionPerformed(ActionEvent e)//定义功能,将文本输入区内容输出到UDP封包,并打印在聊天显示区
{
t_send.start();
String text=chatarea.getText();//获取文本框内容
chatinfo.append(text+"\r\n");//输出到聊天记录窗口
chatarea.setText("");//文本框清空
}
});
chatarea.addKeyListener(new KeyAdapter()//定义文本框键盘回车键监听
{
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode()==e.VK_ENTER)
{
//System.out.println("t-qian");
t_send=new Thread(udpsend);
t_send.start();//调用多线程端口发送
//System.out.println("t-hou");
String text=chatarea.getText();//获取文本框内容
chatinfo.append(text+"\r\n");//输出到聊天记录窗口
chatarea.setText("");//文本框清空
}
}
});
}
}
class UDPSend implements Runnable//定义UDP发送端
{
private TextField tf;//接收窗口文本框对象
private DatagramSocket ds_send;
private DatagramPacket dp1;
UDPSend(TextField tf)//定义发送端函数,接收文本框数据
{
this.tf=tf;
try
{
byte[] temp=new byte[1024];
ds_send=new DatagramSocket();//创建接口端
dp1=new DatagramPacket(temp,temp.length,InetAddress.getByName("127.0.0.1"),9000); //封包,目的IP127.0.0.1,端口10000
}
catch (Exception ex)//IP及端口异常捕捉
{
}
}
public void run()
{
try
{
byte[] byte_text=tf.getText().getBytes();//转换为byte数组
//dp1=new DatagramPacket(byte_text,byte_text.length,InetAddress.getByName("127.0.0.1"),10000); //封包,目的IP127.0.0.1,端口10000
dp1.setData(byte_text);
dp1.setLength(byte_text.length);
//dp1.setAddress(InetAddress.getByName("127.0.0.1"));
//dp1.setPort(10000);
ds_send.send(dp1);//数据包发送
}
catch (IOException ex)//数据发送异常捕捉
{
}
}
}
class UDPRecv implements Runnable//定义UDP接受端
{
private TextArea ta;
private DatagramPacket dp2;
private DatagramSocket ds_recv;
UDPRecv(TextArea ta)//定义接收端函数,接收数据
{
this.ta=ta;
try
{
byte[] temp=new byte[1024];
ds_recv=new DatagramSocket(10000);
dp2=new DatagramPacket(temp,temp.length);
}
catch (Exception ex)//IP及端口异常捕捉
{
}
}
public void run()
{
while (true)
{
try
{
//DatagramPacket dp2=new DatagramPacket(temp,temp.length);
ds_recv.receive(dp2);;//数据包接收
String ip=dp2.getAddress().getHostAddress();//获取IP地址
byte[] data=dp2.getData();//获取数据的byte数组
ta.append(ip+"--"+"发送\r\n");//聊天记录区打印IP地址
ta.append(new String(data,0,dp2.getLength())+"\r\n");//聊天记录区打印发送内容
}
catch (IOException ex)
{
}
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2