本帖最后由 张超 于 2012-11-22 13:58 编辑
/*
* 思路:分析可知编写一个聊天程序的步骤应该如下。
* 1 编写一个图形化界面。
* 2 通过Socket服务实现数据的传递;
*
* */
package GUITCP;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
public class TalkIng {
private Frame frame;
private List list;//定义一个显示接收到和发送的数据。
private TextField tf_2;//定义输入IP地址的文本框;
private TextField tf_3;//定义数据输入的文本框;
private Panel p;
private DatagramSocket ds;
private Menu fileMenu;
private MenuItem shangChuan;
private MenuBar menuBar;
public static void main(String[] args){
TalkIng td1=new TalkIng();
td1.init();
}
public void init(){
frame=new Frame("我的聊天软件");
frame.setSize(300,300);
tf_2=new TextField(15);
tf_3=new TextField(20);
list=new List(6);
//fileMenu=new Menu("文件");
//menuBar=new MenuBar();
//shangChuan=new MenuItem("上传");
try{
ds=new DatagramSocket(4000);
}
catch(Exception e){
e.printStackTrace();
}
new Thread(new Runnable(){
public void run(){
System.out.println("Demo2接收运行起来了");
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,1024);
while(true){
try{
ds.receive(dp);
list.add(new String(buf,0,dp.getLength())+"PORT"+dp.getPort());
}
catch(Exception e){System.out.println(e.toString());}// 这个地方报控制针异常,并且还进入了死循环,疑问:那个receive()是阻塞方法,怎么会发生死循环的,还有就是对于空指针异常能不能获取这个异常所对应对象的名字,也就是那个对象产生的。
}
}
}).start();
p=new Panel();
p.setLayout(new BorderLayout());
//fileMenu.add(shangChuan);
//menuBar.add(fileMenu);
//frame.setMenuBar(menuBar);
frame.add(list);
p.add("West",tf_2);
p.add("East",tf_3);
frame.add("South",p);
System.out.println("00");
frame.setVisible(true);
//增加窗体关闭的事件处理代码。
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
ds.close();
System.out.println("00");
System.exit(0);
}
});
//创建一个新的线程,用于数据的接手。
//增加文本框按下Enter键发送的事件处理代码。
tf_3.addKeyListener(new KeyAdapter(){
[url=]//@Override[/url]
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int num=e.getKeyCode();
System.out.println();
if(num==KeyEvent.VK_ENTER)
{
byte[] buf;//
buf=tf_3.getText().getBytes();
if(buf.length!=0)
{
try {
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName(tf_2.getText()),4000);
ds.send(dp);
}
catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("发送了吗");
tf_3.setText("");
}
else
System.out.println("亲!不允许空字符");
}
}
});
}
}
|