这是一段经典的聊天室实现代码,通过DatagramSocket和DatagramPacket来发送和接受数据,使用的是UDP网络协议,程序出错的原因是声明的字符型数组 byte []buf ;在后面不可以使用,提示找不到字符,我输入buf.也并没有参数提示。奇怪,不得其解!
程序清单 Chat.java
import
java.awt.
*
;
import java.awt.event. * ;
import java.net. * ;
/** */ /**
* 一个小型聊天室的实现
*/
public class Chat
... {
Frame f = new Frame("我的聊天室");
TextField tfIP = new TextField(15); //15为行列
List ls = new List(6);
DatagramSocket ds;
/**//*由于DatagramSocket的构造函数可能抛出异常,我们程序需要用try...catch扑获异常
*所以不能直接在这里调用DatagramSocket的构函对ds进行初始化,我们需要将ds的初始化放在Chat
*类里面去初始化
*/
public Chat()
...{
try
...{
ds = new DatagramSocket(3000);
}
catch(Exception e)...{};
new Thread(new Runnable()
...{
public void run()
...{
byte [] buf = new byte[1024];
DatagramPacket dp1 = new DatagramPacket(buf,1024);
while(true)
...{
try
...{
ds.receive(dp1);
String strRecv = new String(buf,dp1.getLength())+" from "+
dp1.getAddress().getHostAddress();
ls.add(strRecv,0);
}
catch(Exception e)
...{
e.printStackTrace();
}
}
}
}
).start();
}
public static void main(String[] args)
...{
Chat chat = new Chat();
chat.init();
}
public void init()
...{
f.setSize(400,400);
f.add(ls);
Panel panel = new Panel();
panel.setLayout(new BorderLayout());
panel.add("East",tfIP); //添加组件
TextField tfData = new TextField(20);
f.add("South",tfData);
f.setVisible(true);
f.setResizable(false); //限制用户改变窗口大小
//增加关闭窗口的事件处理代码
f.addWindowListener(new WindowAdapter()
...{
public void windowClosing(WindowEvent e)
...{
ds.close(); //关闭socket
f.setVisible(false);
f.dispose();
System.exit(0); //退出系统
}
});
//增加在文本框输入值按下回车键的响应代码
tfData.addActionListener(new ActionListener()
...{
public void actionPerformed(ActionEvent e)
...{
//取出文本中的字符,并将其转换成字符数组
byte buf[];
buf = e.getActionCommand().getBytes();
//程序错误处,编译提示无法找到符号 buf
DatagramPacket dp = new DatagramPacket(buf,buf.length,
InetAddress.getAllByName(tfIP.getText()),3000);
try
...{
ds.send(dp);
}
catch(Exception ex) //这里用ex代替e,因为e已经被使用了
...{
ex.printStackTrace();
}
//清空发送数据后的文本框
((TextField)e.getSource()).setText("");
}
});
}
}
import java.awt.event. * ;
import java.net. * ;
/** */ /**
* 一个小型聊天室的实现
*/
public class Chat
... {
Frame f = new Frame("我的聊天室");
TextField tfIP = new TextField(15); //15为行列
List ls = new List(6);
DatagramSocket ds;
/**//*由于DatagramSocket的构造函数可能抛出异常,我们程序需要用try...catch扑获异常
*所以不能直接在这里调用DatagramSocket的构函对ds进行初始化,我们需要将ds的初始化放在Chat
*类里面去初始化
*/
public Chat()
...{
try
...{
ds = new DatagramSocket(3000);
}
catch(Exception e)...{};
new Thread(new Runnable()
...{
public void run()
...{
byte [] buf = new byte[1024];
DatagramPacket dp1 = new DatagramPacket(buf,1024);
while(true)
...{
try
...{
ds.receive(dp1);
String strRecv = new String(buf,dp1.getLength())+" from "+
dp1.getAddress().getHostAddress();
ls.add(strRecv,0);
}
catch(Exception e)
...{
e.printStackTrace();
}
}
}
}
).start();
}
public static void main(String[] args)
...{
Chat chat = new Chat();
chat.init();
}
public void init()
...{
f.setSize(400,400);
f.add(ls);
Panel panel = new Panel();
panel.setLayout(new BorderLayout());
panel.add("East",tfIP); //添加组件
TextField tfData = new TextField(20);
f.add("South",tfData);
f.setVisible(true);
f.setResizable(false); //限制用户改变窗口大小
//增加关闭窗口的事件处理代码
f.addWindowListener(new WindowAdapter()
...{
public void windowClosing(WindowEvent e)
...{
ds.close(); //关闭socket
f.setVisible(false);
f.dispose();
System.exit(0); //退出系统
}
});
//增加在文本框输入值按下回车键的响应代码
tfData.addActionListener(new ActionListener()
...{
public void actionPerformed(ActionEvent e)
...{
//取出文本中的字符,并将其转换成字符数组
byte buf[];
buf = e.getActionCommand().getBytes();
//程序错误处,编译提示无法找到符号 buf
DatagramPacket dp = new DatagramPacket(buf,buf.length,
InetAddress.getAllByName(tfIP.getText()),3000);
try
...{
ds.send(dp);
}
catch(Exception ex) //这里用ex代替e,因为e已经被使用了
...{
ex.printStackTrace();
}
//清空发送数据后的文本框
((TextField)e.getSource()).setText("");
}
});
}
}