黑马程序员技术交流社区

标题: 关于GUI上应用网络编程的一个问题 [打印本页]

作者: 耶稣说wō乖    时间: 2013-8-15 16:09
标题: 关于GUI上应用网络编程的一个问题
看了毕老师的关于网络编程的视频后,
毕老师用UDP实现了用控制台进行聊天的小程序,
然后我就想把这个程序用GUI来实现而不是控制台,

写完后发现数据UDP打包了,但是不能显示在TextArea2的框框中,而且一点BUTTON程序就死了,
这是为啥。。。
上代码:可以直接运行,你们运行下看下是什么问题。

  1. <P>import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.*;
  4. import java.net.*;
  5. class UDPgui
  6. {
  7. private Frame f;
  8. private Button but;
  9. private TextArea ta1;
  10. private TextArea ta2;
  11. private Dialog d;
  12. private Button okBut;
  13. private Label la;

  14. public UDPgui()
  15. {
  16.   init();
  17. }</P>
  18. <P> public void init()
  19. {
  20.   f = new Frame("myFrame");
  21.   f.setBounds(300,200,400,300);
  22.   f.setLayout(new FlowLayout());</P>
  23. <P>  but = new Button("提交");
  24.   ta1 = new TextArea(6,50);
  25.   ta2 = new TextArea(3,50);
  26.   f.add(ta1);
  27.   f.add(ta2);
  28.   f.add(but);
  29.   f.setVisible(true);</P>
  30. <P>  d = new Dialog(f,"提示",true);
  31.   d.setBounds(300,200,150,100);
  32.   d.setLayout(new FlowLayout());
  33.   okBut = new Button("确定");
  34.   la = new Label();
  35.   d.add(okBut);
  36.   d.add(la);</P>
  37. <P>  event();
  38. }</P>
  39. <P> private void event()
  40. {
  41.   //匿名函数
  42.   f.addWindowListener(
  43.    new WindowAdapter()
  44.    {
  45.     public void windowClosing(WindowEvent e)
  46.     {
  47.      System.exit(0);
  48.     }
  49.    }
  50.   );
  51.   //匿名函数
  52.   but.addActionListener(
  53.    new ActionListener()
  54.    {
  55.     public void actionPerformed(ActionEvent e)
  56.     {
  57. //     System.out.println("按钮弹了一下");
  58.      click();
  59.      server();   
  60.     }
  61.    }
  62.   );</P>
  63. <P>  //匿名函数
  64.   okBut.addActionListener(
  65.    new ActionListener()
  66.    {
  67.     public void actionPerformed(ActionEvent e)
  68.     {
  69.      d.setVisible(false);
  70.     }
  71.    }
  72.   );</P>
  73. <P>  //匿名函数
  74.   d.addWindowListener(
  75.    new WindowAdapter()
  76.    {
  77.     public void windowClosing(WindowEvent e)
  78.     {
  79.      d.setVisible(false);
  80.     }
  81.    }
  82.   );
  83. }</P>
  84. <P> private void click()
  85. {
  86.   DatagramSocket ds = null;
  87.   try
  88.   {
  89.    ds = new DatagramSocket();
  90.    String s = ta2.getText();
  91.    byte[] b = s.getBytes();
  92.    DatagramPacket dp =
  93.    new DatagramPacket(b,b.length,InetAddress.getByName("192.168.1.255"),10001);</P>
  94. <P>   ds.send(dp);
  95.    System.out.print(s);
  96.   }
  97.   catch (Exception e)
  98.   {
  99.    throw new RuntimeException("发送失败");
  100.   }
  101.   finally
  102.   {
  103.    ds.close();
  104.   }
  105. }</P>
  106. <P> private void server()
  107. {
  108.   DatagramSocket ds = null;
  109.   try
  110.   {
  111.    ds = new DatagramSocket(10001);
  112.    byte[] by = new byte[1024*4];
  113.    DatagramPacket dp = new DatagramPacket(by,by.length);
  114.    ds.receive(dp);</P>
  115. <P>   String ip = dp.getAddress().getHostAddress();
  116.    String data = new String(dp.getData(),0,dp.getLength());</P>
  117. <P>   ta1.append(ip+":"+data);   
  118.   }
  119.   catch (Exception e)
  120.   {
  121.    throw new RuntimeException("接受失败");
  122.   }
  123.   finally
  124.   {
  125.    ds.close();
  126.   }
  127. }</P>
  128. <P> public static void main(String[] args)
  129. {
  130.   new UDPgui();
  131. }
  132. }</P>
  133. <P>
  134. </P>
复制代码

作者: 李政    时间: 2013-8-16 00:23
本帖最后由 李政 于 2013-8-16 00:28 编辑

主要就是没有给服务器单独开线程,造成程序一直等待,反映在图形化界面上就是程序死那了

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.*;
  4. import java.net.*;
  5. class UDPgui
  6. {
  7. private Frame f;
  8. private Button but;
  9. private static TextArea ta1;
  10. private TextArea ta2;
  11. private Dialog d;
  12. private Button okBut;
  13. private Label la;

  14. public UDPgui()
  15. {
  16. init();
  17. }
  18. public void init()
  19. {
  20. f = new Frame("myFrame");
  21. f.setBounds(300,200,400,300);
  22. f.setLayout(new FlowLayout());
  23. but = new Button("提交");
  24. ta1 = new TextArea(6,50);
  25. ta2 = new TextArea(3,50);
  26. f.add(ta1);
  27. f.add(ta2);
  28. f.add(but);
  29. f.setVisible(true);
  30. d = new Dialog(f,"提示",true);
  31. d.setBounds(300,200,150,100);
  32. d.setLayout(new FlowLayout());
  33. okBut = new Button("确定");
  34. la = new Label();
  35. d.add(okBut);
  36. d.add(la);
  37. event();
  38. }
  39. private void event()
  40. {
  41. //匿名函数
  42. f.addWindowListener(
  43. new WindowAdapter()
  44. {
  45. public void windowClosing(WindowEvent e)
  46. {
  47. System.exit(0);
  48. }
  49. }
  50. );
  51. //匿名函数
  52. but.addActionListener(
  53. new ActionListener()
  54. {
  55. public void actionPerformed(ActionEvent e)
  56. {
  57. // System.out.println("按钮弹了一下");

  58. click();
  59. // server();//线程等待在这里不动了,服务器一直在等待接收数据,可以通过给服务器单独开个线程来解决
  60. }
  61. }
  62. );
  63. //匿名函数
  64. okBut.addActionListener(
  65. new ActionListener()
  66. {
  67. public void actionPerformed(ActionEvent e)
  68. {
  69. d.setVisible(false);//
  70. }
  71. }
  72. );
  73. //匿名函数
  74. d.addWindowListener(
  75. new WindowAdapter()
  76. {
  77. public void windowClosing(WindowEvent e)
  78. {
  79. d.setVisible(false);
  80. }
  81. }
  82. );
  83. }
  84. private void click()
  85. {
  86. DatagramSocket ds = null;
  87. try
  88. {
  89. ds = new DatagramSocket();
  90. String s = ta2.getText();
  91. byte[] b = s.getBytes();
  92. DatagramPacket dp =
  93. new DatagramPacket(b,b.length,InetAddress.getByName("127.0.0.1"),10001);
  94. ds.send(dp);
  95. System.out.print(s);
  96. }
  97. catch (Exception e)
  98. {
  99. throw new RuntimeException("发送失败");
  100. }
  101. finally
  102. {
  103. ds.close();
  104. }
  105. }
  106. private static void server()
  107. {
  108. DatagramSocket ds = null;
  109. try
  110. {
  111. ds = new DatagramSocket(10001);
  112. byte[] by = new byte[1024*4];
  113. DatagramPacket dp = new DatagramPacket(by,by.length);
  114. ds.receive(dp);
  115. String ip = dp.getAddress().getHostAddress();
  116. String data = new String(dp.getData(),0,dp.getLength());
  117. ta1.append(ip+":"+data);
  118. }
  119. catch (Exception e)
  120. {
  121. throw new RuntimeException("接受失败");
  122. }
  123. finally
  124. {
  125. ds.close();
  126. }
  127. }

  128. public static void main(String[] args)
  129. {
  130. //单独开个线程就好
  131. new Thread(new Runnable(){
  132. public void run(){
  133. server();
  134. }
  135. }).start();

  136. new UDPgui();


  137. }
  138. }


复制代码

作者: 李政    时间: 2013-8-16 11:10
public static void main(String[] args)
{
//单独开个线程就好
new Thread(new Runnable(){
public void run(){
        while(true)
        {
                server();
        }

}
}).start();

new UDPgui();


}
没问题的 加while循环行了
作者: 耶稣说wō乖    时间: 2013-8-16 11:24
李政 发表于 2013-8-16 11:10
public static void main(String[] args)
{
//单独开个线程就好

嗯,谢谢了
我把while循环加在了server里面也行,这样感觉好点
private static void server()
{
  DatagramSocket ds = null;
  try
  {
   
   ds = new DatagramSocket(10001);
   
   byte[] by = new byte[1024*64];
   DatagramPacket dp = new DatagramPacket(by,by.length);  
   while(true)
   {
    ds.receive(dp);
    String ip = dp.getAddress().getHostAddress();
    String data = new String(dp.getData(),0,dp.getLength());
    ta1.append(ip+":\r\n"+data+"\r\n");  
   }
  }

能不用静态吗?静态似乎好资源哦





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2