日期:2014-05-20  浏览次数:20923 次

简单的java聊天程序
小弟刚学完java基础,练练手就做了一个特别简单的聊天程序,源代码如下:
import java.net.*;
import java.awt.*;
import java.awt.event.*;
public class Receive {
Frame f=new Frame("聊天室");
TextField tfIP=new TextField(15);
TextArea lst=new TextArea();
Label lb=new Label("IP");
DatagramSocket ds;
TextField tfData=new TextField(20);
Button bt=new Button("send");
Button bt2=new Button("Content can't for empty");//定义模态显示
Dialog dlg=new Dialog(f,"消息提示",true);



public static void main(String args[]){

new Receive();//调用构造函数初始化
}



public Receive(){
try{
ds=new DatagramSocket(8087);
}catch(Exception ex){
ex.printStackTrace();
}

//设置线程监听对方发送的内容
new Thread(new Runnable(){
public void run(){

byte buf[]=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,1024);
while(true){
try{
ds.receive(dp);
lst.append("对方(来自"+dp.getAddress().getHostAddress()+",接口:"+dp.getPort()+") "+"当前时间:"+"\n"+new String(buf,0,dp.getLength())+"\n");
}catch(Exception e){
e.printStackTrace();
}
}
}
}).start();
init1();
}


public void init1(){
f.setSize(400,400);//设置容器的大小
f.add(lst);
//添加组件,布置布局
Panel p1=new Panel();
Panel p2=new Panel();
Panel p3=new Panel();
p1.setLayout(new BorderLayout());
p2.setLayout(new BorderLayout());
p3.setLayout(new BorderLayout());
p1.add("West",lb);
p1.add("East",tfIP);
p2.add("West",bt);
p2.add("East",tfData);
p3.add("West",p1);
p3.add("East",p2);
f.add("South",p3);

dlg.setLayout(new FlowLayout());
dlg.add(bt2);
dlg.setBounds(0, 0, 200, 150);//设置提示框的大小

f.setVisible(true);//让容器可显示
f.setResizable(false);//不可改变容器大小

//关闭窗口事件
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
ds.close();
f.setVisible(false);
f.dispose();
System.exit(0);
}
});
//触发按钮事件
bt.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ex){
byte[]buf;
buf=tfData.getText().getBytes();
if(buf.length!=0){
try{
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName(tfIP.getText()),8088);
ds.send(dp);
tfData.setText("");
lst.append("自己:"+"\n"+new String(buf)+"\n");//new String(dp.getData());
}catch(Exception e){
e.printStackTrace();
}
}else{//设置成为模态显示并其可现
dlg.setModal(true);
dlg.setVisible(true);
}
}
});
//模态显示按钮的触发事件
bt2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
dlg.dispose();
}
});
//输入文本框的触发事件
tfData.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
  
byte[]buf;
buf=e.getActionCommand().getBytes();
if(buf.length!=0){
try{
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName(tfIP.getText()),8088);
ds.send(dp);
((TextField)e.getSource()).setText("");
lst.append("自己:"+"\n"+new String(buf)+"\n");//new String(dp.getData());
}catch(Exception ex){
ex.printStackTrace();
}
}else{
dlg.setModal(true);
dlg.setVisible(true);
}
}
});

}

把上面的代码在复制一个,改变一下端口,就可以实现简单的聊天了,但还有一些功能没有实现,还请各位大虾指点一二。
未能实现的功能:双方发送的内容所显示的动态时间;发送框在程序刚开始运行的时候,光标没在发送框;发送按钮不能显示中文,不知道怎么解决这个中文乱码
还请大家帮忙啊!
------解决方案--------------------
稍微修改了一下 


import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
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.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Date;
import java.util.regex.Pattern;

import javax.swing.JOptionPane;

public class PointToPointUDPChat {
    Frame f = new Frame("聊天室");

    Label lbRemoteIP = new Label("目标IP");// 对方IP
    Label lbRemotePort = new Label("目标端口");
    Label lbLocalSendPort = new Label("本地发送端口");
    Label lbLocalReceivePort = new Label("本地接收端口");

    TextField tfRemoteIP = new TextField(15);// 要发送数据的目标IP
    TextField tfRemotePort = new TextField(15);// 要发送数据的目标端口
    TextField tfLocalSendPort = new TextField(15);// 使用此端口发送数据
    TextField tfLocalReceivePort = new TextField(15);// 使用此端口发送数据