黑马程序员技术交流社区

标题: udp键盘录入,聊天功能求问,Myeclipse [打印本页]

作者: 一顿一只牛    时间: 2014-8-16 17:21
标题: udp键盘录入,聊天功能求问,Myeclipse
本帖最后由 一顿一只牛 于 2014-8-17 21:05 编辑

/*
* 编写一个聊天程序,接收数据2部分
*  这两部分需要同时执行,so多线程
*          因为收和发动作是不一致的,所以要定义2个run方法
*          而且这两个方法要封装到不同的类中        
*
*
* */
package netText;

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.SocketException;
import java.net.UnknownHostException;

public class UdpTxet {
        public static void main(String[] args) throws SocketException{
                DatagramSocket sendSocket = new DatagramSocket();
                DatagramSocket receSocket = new DatagramSocket(10009);
               
                new Thread(new UdpSend(sendSocket)).start();
                new Thread(new UdpRece(receSocket)).start();
        }
}
//发送键盘录入的类
class UdpSend implements Runnable {
        private DatagramSocket ds;
        public UdpSend(DatagramSocket ds){
                this.ds = ds;
        }
        public void run(){
                try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                        //键盘录入数据,并封装成数据包
                        String line = null;
                        while((line=br.readLine())!=null){
                                if("886".equals(line))
                                        break;
                                byte[] data = line.getBytes();
                                DatagramPacket dp = new DatagramPacket(data,data.length,
                                                        InetAddress.getByName("111.201.122.45"),10009);
                //通过Socket服务,将已有的数据包发送出去
                                ds.send(dp);
                        }
                                ds.close();
                } catch (UnknownHostException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
}
//接收数据的类
class UdpRece implements Runnable {
        private DatagramSocket ds;
        public UdpRece(DatagramSocket ds){
                this.ds = ds;
        }
        public void run(){
                try{
                        while(true){
                                //定义数据包,用于存储数据
                                byte[] buf = new byte[1024];
                                DatagramPacket dp = new DatagramPacket(buf,buf.length);
                                //通过receive方法将收到的数据存入数据包中
                                ds.receive(dp);
                                //通过数据包的方法获取其中的数据
                                String ip = dp.getAddress().getHostAddress();
                                String data = new String(dp.getData(),0,dp.getLength());
                                System.out.println("Ip = "+ip+" "+data);
                        }
                }
                catch(Exception e){
                        throw new RuntimeException("接收数据失败");
                }               
        }
}
我用MyEclipse写的  为什么运行结果一直是在控制台录入数据啊,输入886也一样。
输出ip+data都没有
作者: 玥夜    时间: 2014-8-17 17:34
886只是关闭了你的键盘录入  没有关闭下面的接收端  所以程序会一直运行 处于接受状态  我的能输出结果 不知道你的为什么
作者: 一顿一只牛    时间: 2014-8-17 17:45
玥夜 发表于 2014-8-17 17:34
886只是关闭了你的键盘录入  没有关闭下面的接收端  所以程序会一直运行 处于接受状态  我的能输出结果 不 ...

我用的是MyEclipse, 程序运行了就只有下面一个控制台啊,只能进行键盘录入,其他什么都看不到啊。求大神指导
作者: 玥夜    时间: 2014-8-17 18:04
  1. package com.itheima;

  2. /*
  3. * 编写一个聊天程序,接收数据2部分
  4. *  这两部分需要同时执行,so多线程
  5. *          因为收和发动作是不一致的,所以要定义2个run方法
  6. *          而且这两个方法要封装到不同的类中        
  7. *
  8. *
  9. * */

  10. import java.io.BufferedReader;
  11. import java.io.IOException;
  12. import java.io.InputStreamReader;
  13. import java.net.DatagramPacket;
  14. import java.net.DatagramSocket;
  15. import java.net.InetAddress;
  16. import java.net.SocketException;
  17. import java.net.UnknownHostException;

  18. public class UdpTxet {
  19.          public static void main(String[] args) throws SocketException{
  20.                  DatagramSocket sendSocket = new DatagramSocket();
  21.                  DatagramSocket receSocket = new DatagramSocket(10009);
  22.                  
  23.                  new Thread(new UdpSend(sendSocket)).start();
  24.                  new Thread(new UdpRece(receSocket)).start();
  25.          }
  26. }

  27. class UdpSend implements Runnable {
  28.          private DatagramSocket ds;
  29.          public UdpSend(DatagramSocket ds){
  30.                  this.ds = ds;
  31.          }
  32.          public void run(){
  33.                  try {
  34.                          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

  35.                         String line = null;
  36.                          while((line=br.readLine())!=null){
  37.                                  if("886".equals(line))//将判断语句也发过去,当接收端接受到就跳出while循环,
  38.                                  {
  39.                                          byte[] data = line.getBytes();
  40.                                          DatagramPacket dp = new DatagramPacket(data,data.length,
  41.                                                          InetAddress.getByName("127.0.0.1"),10009);
  42.                                          ds.send(dp);
  43.                                           break;
  44.                                  }
  45.                                
  46.                                          
  47.                                          byte[] data = line.getBytes();
  48.                                          DatagramPacket dp = new DatagramPacket(data,data.length,
  49.                                                          InetAddress.getByName("127.0.0.1"),10009);
  50.                                 ds.send(dp);
  51.                                        
  52.                                  
  53.                          }
  54.                          ds.close();
  55.                  } catch (UnknownHostException e) {
  56.                          e.printStackTrace();
  57.                  } catch (IOException e) {
  58.                          e.printStackTrace();
  59.                  }
  60.          }
  61. }
  62. class UdpRece implements Runnable {
  63.          private DatagramSocket ds;
  64.          public UdpRece(DatagramSocket ds){
  65.                  this.ds = ds;
  66.          }
  67.          public void run(){
  68.                  try{
  69.                          while(true){
  70.                                 byte[] buf = new byte[1024];
  71.                                  DatagramPacket dp = new DatagramPacket(buf,buf.length);
  72.                                 ds.receive(dp);
  73.                                 String ip = dp.getAddress().getHostAddress();
  74.                                  String data = new String(dp.getData(),0,dp.getLength());
  75.                                  System.out.println("Ip = "+ip+" "+data);
  76.                                  if("886".equals(data))//加入判断语句,跳出循环
  77.                                          break ;//
  78.                          }
  79.                  }
  80.                  catch(Exception e){
  81.                          throw new RuntimeException("接收数据失败");
  82.                  }   
  83.                  ds.close();
  84.          }
  85. }
复制代码

作者: masai158    时间: 2014-8-17 18:09
群里面已经给你发了解决方法
作者: 王景琛    时间: 2014-8-17 18:44
“886”结束的是发送端的线程,接收端还在挂起,没有显示输出是没收到数据,看看IP地址是否正确!!!




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