黑马程序员技术交流社区

标题: UDP发包接包,接收端终止问题?Why? [打印本页]

作者: 陈淑飞    时间: 2012-8-1 11:30
标题: UDP发包接包,接收端终止问题?Why?
本帖最后由 陈淑飞 于 2012-8-1 15:52 编辑

急,想了好久,问题依旧没解决,只好把问题从13期移动12期了。
问题描述如下:
小测试代码,目的是发送端从键盘中,输入字符。接收端接到字符后转成大写。当发送端发"over"时,接受端接到打开并结束,关闭流掉。
但测试代码存在问题,while循环停不了。下面是代码:
代码一: while循环用 类静态变量FLAG控制:
  1. import java.net.*;
  2. import java.io.*;
  3. import java.util.Date;
  4. public class UdpSocketTest{
  5. public static boolean FLAG = true ;
  6. public static void main(String[] args){

  7. }
  8. }

  9. class SerSocket{
  10. public static void main(String[] args) throws Exception{
  11. DatagramSocket ds = new DatagramSocket(40009);
  12. while(UdpSocketTest.FLAG)
  13. {
  14. byte[] buf = new byte[1024];
  15. DatagramPacket dp = new DatagramPacket(buf,buf.length);
  16. ds.receive(dp);
  17. InetAddress ia = dp.getAddress();
  18. String ip = ia.getHostAddress();
  19. System.out.println(ip+"..... connected");
  20. String content = new String(dp.getData(),0,dp.getLength());
  21. content = content.toUpperCase();
  22. System.out.println("content=="+content);
  23. Thread.sleep(5000); //先暂停5秒,等if over先执行,置FLAG为false
  24. Date d = new Date();
  25. System.out.println(d.toString()+"Ser执行UdpSocketTest.FLAG==::"+UdpSocketTest.FLAG);
  26. }
  27. ds.close();
  28. }

  29. }

  30. class CliSocket{

  31. public static void main(String[] args) throws Exception{

  32. DatagramSocket ds = new DatagramSocket();
  33. InetAddress ia = InetAddress.getByName("127.0.0.1");
  34. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  35. String line = null;
  36. while((line=br.readLine())!=null){
  37. byte[] buf = line.getBytes();
  38. DatagramPacket dp = new DatagramPacket(buf,buf.length,ia,40009);
  39. ds.send(dp);
  40. if("over".equals(line))
  41. {
  42. UdpSocketTest.FLAG = false;
  43. Date d = new Date();
  44. System.out.println(d.toString()+"Cli执行UdpSocketTest.FLAG==::"+UdpSocketTest.FLAG);
  45. break ;
  46. }
  47. }
  48. ds.close();
  49. br.close();

  50. }
  51. }
复制代码
代码二: while循环用 单例 Flag成员变量  控制:
  1. import java.net.*;
  2. import java.io.*;
  3. import java.util.Date;
  4. public class UdpSocketTest2{
  5. //public static boolean FLAG = true ;
  6. private static final UdpSocketTest2 ut = new UdpSocketTest2(); //郁闷,换成单例类,还是一样存在问题。
  7. private boolean flag = true ;
  8. private UdpSocketTest2(){
  9. }
  10. public static UdpSocketTest2 getInstance(){
  11. return ut ;
  12. }
  13. public void setFlag(boolean flag){
  14. this.flag = flag;
  15. }
  16. public boolean getFlag(){
  17. return flag ;
  18. }

  19. public static void main(String[] args){

  20. }
  21. }

  22. class SerSocket{
  23. public static void main(String[] args) throws Exception{
  24. DatagramSocket ds = new DatagramSocket(40009);
  25. UdpSocketTest2 ut = UdpSocketTest2.getInstance();
  26. while(ut.getFlag())
  27. {
  28. byte[] buf = new byte[1024];
  29. DatagramPacket dp = new DatagramPacket(buf,buf.length);
  30. ds.receive(dp);
  31. InetAddress ia = dp.getAddress();
  32. String ip = ia.getHostAddress();
  33. System.out.println(ip+"..... connected");
  34. String content = new String(dp.getData(),0,dp.getLength());
  35. content = content.toUpperCase();
  36. System.out.println("content=="+content);
  37. Thread.sleep(5000); //先暂停5秒,等if over先执行,置FLAG为false
  38. Date d = new Date();
  39. System.out.println(d.toString()+"Ser 执行ut.getFlag()==::"+ut.getFlag());
  40. }
  41. ds.close();
  42. }

  43. }

  44. class CliSocket{

  45. public static void main(String[] args) throws Exception{
  46. UdpSocketTest2 ut = UdpSocketTest2.getInstance();
  47. DatagramSocket ds = new DatagramSocket();
  48. InetAddress ia = InetAddress.getByName("127.0.0.1");
  49. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  50. String line = null;
  51. while((line=br.readLine())!=null){
  52. byte[] buf = line.getBytes();
  53. DatagramPacket dp = new DatagramPacket(buf,buf.length,ia,40009);
  54. ds.send(dp);
  55. if("over".equals(line))
  56. {
  57. ut.setFlag(false);
  58. Date d = new Date();
  59. System.out.println(d.toString()+"Cli 执行ut.getFlag()==::"+ut.getFlag());
  60. break ;
  61. }
  62. }
  63. ds.close();
  64. br.close();

  65. }
  66. }
复制代码
Why?为什么循环停不了,测试结果如图:

图上,显示证明了,FLAG已经被置为flase了,为什么5秒后打印却是true呢?
用单例模式也是一样的,求解?
----
ps: 不要说在接收端也弄个over的判断,再break循环。 我就想知道,为什么以上两种方式的while循环结束不了,为什么5秒前FLAG为false,5秒后为true了。



作者: 陈淑飞    时间: 2012-8-1 15:51
已解决,多谢。
原因:
   多个jvm之间,数据不共享。
犯了个,想当然的错。




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