----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
自学java也有一段时间了,今天写了个小程序来检验一下自己,原来在实际开发中用到的知识还挺多,一些之前不懂得知识都被带出来了,其实掌握知识还是要在不停地写代码中完成。
在网络编程知识里老师为我们讲了一个简单的聊天程序,但都是在命令行里完成的,出与好奇,也想自己做一个这样的小程序,在原有代码的基础上增加一些功能,仔细分析了一下,发现实现完整的聊天程序需要的知识真是太多了,首先聊天窗口的实现也不是简单的事(其实是会的太少了),学过的awt根本不够用,索性做个简单的窗口,后面在慢慢优化,swing还没接触过,但通过这个程序还真像赶紧学一学,知识是永远不够用的,我的实现很简单,就是有一个聊天窗口,两个文本域,与QQ相似,一个按钮发送信息,在其中一个文本域写出数据后,单击按钮发送,另一个文本域接收到数据并显示;这里就要用到多线程技术,因为要一直监听端口,Socket里有一个阻塞方法一直等待数据,所以不能与按钮的监听在同一个线程里实现,所以接受数据单独作为一个线程,经过比较发现,按钮的监听机制好像也是阻塞方法,监听方法内部传入一个对象,对象实现一个方法,与IO流的阻塞方法很像,而且程序不会因为监听的存在而停止,与多线程又有相似之处,下面写出部分代码:
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.net.*;
public class TalkWin {
private Frame f;
private TextArea ta1,ta2;
private Button bt;
TalkWin() throws SocketException{
init();
}
public void init(){
f = new Frame("TalkWin");
f.setBounds(300,400,500,400);
f.setLayout(new FlowLayout(FlowLayout.LEADING));
ta1 = new TextArea(14,45);
ta2 = new TextArea(5,45);
bt = new Button("发送");
f.add(ta1);
f.add(ta2);
f.add(bt);
myEvent();
f.setVisible(true);
}
private String data;
private void myEvent(){
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
bt.addActionListener(new ActionListener(){//按钮监听到动作就发送数据
public void actionPerformed(ActionEvent e) {
data= ta2.getText();
byte[] buf = data.getBytes();
try {
DatagramSocket ds = new DatagramSocket();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.151"),10000);
ds.send(dp);
ta2.setText("");
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
}
/*将操作文本框的代码封装成一个函数
public void addText(){
ta1.append("@我对他说::\r\n");
ta1.append(" "+data+"\r\n");
}
public static void main(String[] args) throws SocketException{//主函数
TalkWin tw = new TalkWin();
new Thread(new Receive(tw)).start();
}
}
/*实现接口Runnable 实现接受数据的多线程模块*/
class Receive implements Runnable{
private TalkWin tw;//接受数据后需要将数据写如文本框,所以传入窗体对象,方便访问文本框
Receive(TalkWin tw){
this.tw = tw;
}
public void run(){
DatagramSocket ds = null;
try {
ds = new DatagramSocket(10000);
} catch (SocketException e) {
e.printStackTrace();
}
while(true){
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
try {
ds.receive(dp);
} catch (IOException e) {
e.printStackTrace();
}
String data = new String(dp.getData());
tw.addText();//将接收的数据写入文本框
}
}
}
通过这个小程序很容易就知道自己知识的欠缺,通过不断修改代码,增加程序功能,一定会有所收获;梦想有一天写代码能像写文章一样顺畅。
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------