A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 sunhaodi 于 2012-6-22 18:36 编辑

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class UdpSend {
        
  public static void main(String[] args) throws IOException {
/*        1.创建udp服务,通过DatagramSocket对象
          DatagramSocket ds = new DatagramSocket(9999);
         2.确定数据,并封装成数据包,datagramPacket(byte[] buf,int length,InetAddress address,int port)
         */
           
         
          DatagramSocket ds1 =  new DatagramSocket();
          DatagramSocket ds2 =  new DatagramSocket(10002);
         
          Send  d  =new Send(ds1);
          Rece   r = new Rece(ds2);
         
          Thread t1 = new Thread(d);
          Thread t2 = new Thread(r);
         
          t1.start();
          t2.start();
         
}
}
  
class Send implements Runnable{

        
        private  DatagramSocket dr ;
        public Send(DatagramSocket dr){
         this.dr = dr;
        }
        
        @Override
        public void run() {
                        try {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
               
                String len = null;
               
        
                        while((len = br.readLine())!=null){
                                
                            if("88".equals(len))               
                                   break;
                           
                                byte [] b=len.getBytes();
                                DatagramPacket dp = new
                                                           DatagramPacket(b,b.length,InetAddress.getByName("192.168.1.104"),10000);
                                          
                                         //3.通过socket服务,将已有的数据包发送出去,通过send方法。
                                           dr.send(dp);
                                          
                                
                                
                        }
                } catch (UnknownHostException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                         if(dr!=null)
                          //4,关闭资源。
                           dr.close();
               
                }
        }
}
class Rece implements Runnable{
        
        private DatagramSocket ds ;
        public Rece(DatagramSocket ds){
               
                 this.ds  = ds;
        }

        @Override
        public void run() {
        
                while(true){
                         try {
                         byte [] bu = new byte[1024];
                         DatagramPacket dp = new DatagramPacket(bu, bu.length);

                     ds.receive(dp);
                                
                                 String ip= dp.getAddress().getHostAddress();
                                 
                                 String s = new String(dp.getData(),0,dp.getLength());
                                 
                                 
                                 System.out.println(ip+"........"+s);
                                
                                
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                        
                }
               
               
        }
        
        
}
这是第一个程序

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class UdpRce {
        
  public static void main(String[] args) throws IOException {
/*        1.创建udp服务,通过DatagramSocket对象
          DatagramSocket ds = new DatagramSocket(9999);
         2.确定数据,并封装成数据包,datagramPacket(byte[] buf,int length,InetAddress address,int port)
         */
           
         
          DatagramSocket ds1 =  new DatagramSocket();
          DatagramSocket ds2 =  new DatagramSocket(10000);
         
          Send  d  =new Send(ds1);
          Rece   r = new Rece(ds2);
         
          Thread t1 = new Thread(d);
          Thread t2 = new Thread(r);
         
          t1.start();
          t2.start();
         
}
}
  
class Send implements Runnable{

        
        private  DatagramSocket dr ;
        public Send(DatagramSocket dr){
         this.dr = dr;
        }
        
        @Override
        public void run() {
                try {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
               
                String len = null;
               
               
                        while((len = br.readLine())!=null){
                                
                            if("88".equals(len))               
                                   break;
                           
                           
                                byte [] b=len.getBytes();
                                DatagramPacket dp = new
                                                           DatagramPacket(b,b.length,InetAddress.getByName("192.168.1.104"),10002);
                                          
                                         //3.通过socket服务,将已有的数据包发送出去,通过send方法。
                                           dr.send(dp);
                                          
                                
                                
                        }
                } catch (UnknownHostException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                         if(dr!=null)
                          //4,关闭资源。
                           dr.close();
               
                }
        }
}
class Rece implements Runnable{
        
        private DatagramSocket ds ;
        public Rece(DatagramSocket ds){
               
                 this.ds  = ds;
        }

        @Override
        public void run() {
        
                while(true){
                         try {
                         byte [] bu = new byte[1024];
                         DatagramPacket dp = new DatagramPacket(bu, bu.length);

                     ds.receive(dp);
                                
                                 String ip= dp.getAddress().getHostAddress();
                                 
                                 String s = new String(dp.getData(),0,dp.getLength());
                                 
                                 
                                 System.out.println(ip+"........"+s);
                                
                                
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                        
                }
               
               
        }
        
        
}
第二个程序。

聊天好使, 但是 if("88".equals{len})
                                 break;
为什么不管用了。。      打完了 88   也不停止程序,   这个break不是应该能停止程序的嘛?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

7 个回复

正序浏览
if("88".equals())
{
      break;     //之后直接跳出while循环  后面的   dr.send(dp); 根本不会执行
}
你改成这样写看看
public void run() {
                try {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
               
                String len = null;
               
               
                        while((len = br.readLine())!=null)
                        {
                                byte [] b=len.getBytes();
                                DatagramPacket dp = new
                                                           DatagramPacket(b,b.length,InetAddress.getByName("192.168.1.104"),10002);
                                          
                                         //3.通过socket服务,将已有的数据包发送出去,通过send方法。
                                           dr.send(dp);
                                if("88".equals(len))               
                                   break;
                        }
                } catch (UnknownHostException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                         if(dr!=null)
                          //4,关闭资源。
                           dr.close();
               
                }
        }
其实结束一个线程比较地道的写法是 定义一个boolean 的变量
Such as : boolean isStop = false;
public void run()
{
        while(!isStop)
        {
                //正常要执行的代码
                if("退出条件")
                {
                        isStop = true;
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
定义了一个布尔类型变量,赋值为真,boolean类型只有两个值,不是true就是false,就像硬币只有正反两面一样,不是字符串true

Boolean 数据类型 Boolean 变量存储为 16 位(2 个字节)的数值形式,但只能是 True 或是 False。Boolean 变量的值显示为 True 或 False(在使用 Print 的时候),或者 #TRUE# 或 #FALSE#(在使用 Write # 的时候)。使用关键字 True 与 False 可将 Boolean 变量赋值为这两个状态中的一个。当转换其他的数值类型为 Boolean 值时,0 会转成 False,而其他的值则变成 True。当转换 Boolean 值为其他的数据类型时,False 成为 0,而 True 成为 -1
回复 使用道具 举报
oracleserver 发表于 2012-6-20 23:01
你还有个while啊。。。。
  try {
                BufferedReader br = new BufferedReader(new InputStre ...

什么用过标志位啊

有while 怎么了啊, 还是不懂, 详细说下,嘿嘿
回复 使用道具 举报
本帖最后由 陈少文 于 2012-6-21 19:21 编辑

        //建议楼主可以这样写

        public void run()
        {
                String msg;
                Boolean  isTrue = true;
                while(isTrue)
                {
                        try
                        {
                                msg = br.readLine();
                                if(msg.equals("88"))
                                {
                                        //终止线程
                                        isTrue = false;
                                }
                        }
                        catch (IOException e)
                        {
                                e.printStackTrace();

                        }
                }
        }

呵呵
回复 使用道具 举报
你还有个while啊。。。。
  try {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
               
                String len = null;
               
               
                        while((len = br.readLine())!=null){
                                
                            if("88".equals(len))               
                                   break;
你这段代码可以用过标志位,   
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                boolean b=false;
                String len = null;
               
               
                        while((len = br.readLine())!=null){
                                
                            if("88".equals(len))               
                             b=true;

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
oracleserver 发表于 2012-6-20 19:17
首先我象说的是你的代码看起来很不爽啊。你应该认真的看看你的代码是什么问题。你的if("88".e ...

为什么在try代码块里面就不管用啊?:L
回复 使用道具 举报
首先我象说的是你的代码看起来很不爽啊。{:soso_e131:}你应该认真的看看你的代码是什么问题。你的if("88".equals{len})
是在try代码块的你觉得你的break有用吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马