特别简单的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);
}
}
});
}

}

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

4个回答

[quote]双方发送的内容所显示的动态时间[/quote]
就像我说的一样,
[quote]lst.append("对方(来自"+dp.getAddress().getHostAddress()+",接口:"+dp.getPort()+") "+"当前时间:"+new Date()+"\n"+new String(buf,0,dp.getLength())+"\n"); [/quote]和
[quote]lst.append("自己:"+"\n"+new Date()+new String(buf)+"\n");//new String(dp.getData()); [/quote]
分别这样加。

假如你需要时间格式化
你可以这样
[code="java"]SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date=sdf.format(new Date());[/code]
然后吧date放在刚才 放new Date()的地方。
输出来的就是 1986-03-21 15:35:44这样的格式。

希望对你有用 欢迎采纳我的意见!

不错,用的报文发送的。动态时间,你自己new Date赋上去不就可以了么。发送按钮不能显示中文? 这个你先把工具调整一下。

可以详细描述么。

[quote]双方发送的内容所显示的动态时间[/quote]
在你的[code="java"]lst.append("对方(来自"+dp.getAddress().getHostAddress()+",接口:"+dp.getPort()+") "+"当前时间:"+"\n"+new String(buf,0,dp.getLength())+"\n");
[/code]中的“当前时间”后加上 [code="java"]System.currentTimeMillis();[/code],看看是不是你想要的结果

[quote]发送框在程序刚开始运行的时候,光标没在发送框[/quote]
只需要进行 [code="java"]lst.requestFocus();[/code]

[quote]发送按钮不能显示中文,不知道怎么解决这个中文乱码
[/quote]这个问题,我也研究了很久,可是还是没有解决,按照网上的众多方法进行处理后,问题仍然存在,但若使用 JButton 则没有任何问题。

Button 的乱码问题,我足足搞了一个多小时啊,还是以失败告终,郁闷啊。
不过,其他两个问题应该算是OK了,希望你能采纳,谢谢。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问