看一个聊天小程序使用了那些java技术

来源:互联网 发布:win32编程 视频 编辑:程序博客网 时间:2024/04/28 10:35

----------- 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学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima

原创粉丝点击