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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王雷1 中级黑马   /  2013-11-24 15:40  /  1602 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//我这么写是因为都是在127.0.0.1这一台机器上所以出现了冲突所以无法运行的还是为什么?
//还是根本就不能这么写?我是想实现一下dos的聊天,用一台电脑能实现么?如果ok应该是什么样的?用UDP的
import java.net.*;
import java.io.*;
class er
{
public static void main(String[] args)throws Exception
{
  jieshou();
  fasong();
}
public static void jieshou()throws Exception
{
  DatagramSocket ds=new DatagramSocket(10001);
  while(true)
  {
   byte[] buf=new byte[1024];
   DatagramPacket dp=new DatagramPacket(buf,buf.length);
   
   ds.receive(dp);
   String ip=dp.getAddress().getHostAddress();
   String data=new String(dp.getData(),0,dp.getLength());
   int port=dp.getPort();
   System.out.println(ip+"::::"+data+":::::"+port);
   
  }
}
public static void fasong()throws Exception
{
  
  DatagramSocket ds=new DatagramSocket();
  
  BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
  String line=null;
  while((line=bufr.readLine())!=null)
  {
   if("886".equals(line))
    break;
   byte[] buf=line.getBytes();
   DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10002);
   ds.send(dp);
  }
}
}
class yi
{
public static void main(String[] args)throws Exception
{
  jieshou();
  fasong();
}
public static void jieshou()throws Exception
{
  
  DatagramSocket ds=new DatagramSocket(10002);
  while(true)
  {
   byte[] buf=new byte[1024];
   DatagramPacket dp=new DatagramPacket(buf,buf.length);
   ds.receive(dp);
   String ip=dp.getAddress().getHostAddress();
   String data=new String(dp.getData(),0,dp.getLength());
   int port=dp.getPort();
   System.out.println(ip+"::::"+data+":::::"+port);
   
  }
}
public static void fasong()throws Exception
{
  
  DatagramSocket ds=new DatagramSocket();
  
  BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
  String line=null;
  while((line=bufr.readLine())!=null)
  {
   if("886".equals(line))
    break;
   byte[] buf=line.getBytes();
   DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10001);
   ds.send(dp);
  }
}
}

评分

参与人数 1黑马币 +6 收起 理由
FFF + 6 亲~您今日已经达到加分上限了!.

查看全部评分

6 个回复

倒序浏览
可以实现一台电脑在DOS控制台进行聊天的,你没看毕老师的视频吗?你要把客户端和服务端分成成两个独立的主函数写,不能放在一个主函数内。然后开启2个DOS控制台,一个运行客户端,一个运行服务端。

评分

参与人数 1黑马币 +3 收起 理由
FFF + 3 亲~您今日已经达到加分上限了!.

查看全部评分

回复 使用道具 举报
  你在一台电脑上实现一个同时拥有发送和接收功能的UDP聊天应该会发生java.net.BindException 异常吧,你那Address冲突了。而且如果要像你这样写,也就是同时实现发送和接收功能的UDP聊天DOS版程序应该把接收功能和发送功能分别封装成一个实现Runnable接口的类,然后在主函数里面开启两个线程分别负责发送和接收功能,但是这也是和别的电脑实现类似QQ那样的聊天,一台电脑的话还是会出现冲突。非要在一台电脑上运行的话,那就写两个程序,一个实现发送,另一个实现接收,然后开启两个DOS窗口,然后你懂得,不过这太挫了....
  要么你就用TCP,像楼上说的,开启两个DOS窗口,一个运行服务端,一个运行客户端。
  
  好吧,这是我的理解
回复 使用道具 举报
学习。。。
回复 使用道具 举报
好好看看 学习学习。。。。~
回复 使用道具 举报
上段源码吧,两个类,一个发送,一个接收
class Send implements Runnable
{

        private  DatagramSocket ds;
       
        public Send(DatagramSocket ds)
        {
                this.ds=ds;
        }
       
       
        @Override
        public void run() {
                // TODO Auto-generated method stub
                BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
               
       
        String line;
       
        try {
                while((line=br.readLine())!=null)
                {
                        if(line.equals("886"))
                        {
                                break;
                        }
                       
                        else
                        {
                               
                               
                                byte[] buf=line.getBytes();
                                DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10009);
                                ds.send(dp);
                               
                               
                               
                        }
                       
                       
                }
               
                ds.close();
        } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
               
               
               
               
       
        }
       
}

class Rec implements Runnable
{

        private  DatagramSocket ds;
       
        public Rec(DatagramSocket ds)
        {
                this.ds=ds;
        }
       
       
        @Override
        public void run() {
                // TODO Auto-generated method stub
                {
                       
                       
                        while(true)
                        {
                               
                               
                                byte[] buf=new byte[1024];
                               
                                DatagramPacket dp=new DatagramPacket(buf,buf.length);
                               
                                try {
                                        ds.receive(dp);
                                       
                                       
                                        String ip=dp.getAddress().getHostName();
                                        String data=new String(dp.getData(),0,dp.getLength());
                                       
                                        System.out.println(ip+":"+data);
                                       
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                               
                               
                               
                               
                               
                               
                               
                        }
                       
                       
               
                       
                }
               
               
       
        }
       
}
感觉这么写比较好,希望对楼主有用

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
发送和接收需要定义两个类并实现Runnable接口,然后通过主函数运行两个线程开启接收和发送方,然后这个java文件复制一下,更改一下发送地址、端口和接收方的监听地址就OK了。我举个例子吧:
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.net.DatagramPacket;
  5. import java.net.DatagramSocket;
  6. import java.net.InetAddress;
  7. import java.net.SocketException;
  8. public class UdpOne {
  9. public static void main(String[] args) {
  10. // TODO Auto-generated method stub
  11. try
  12. {
  13. //DatagramSocket send = new DatagramSocket();
  14. DatagramSocket receive = new DatagramSocket(10002);
  15. new Thread(new Send(receive)).start();
  16. new Thread(new Receive(receive)).start();
  17. }
  18. catch (SocketException se)
  19. {
  20. throw new RuntimeException("建立数据包套接字失败");
  21. }
  22. }
  23. }
  24. //TODO Send
  25. class Send implements Runnable
  26. {
  27. private DatagramSocket ds;
  28. Send(DatagramSocket ds)
  29. {
  30. this.ds = ds;
  31. }
  32. public void run()
  33. {
  34. try
  35. {
  36. BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
  37. String line = null;
  38. while ((line=bfr.readLine())!=null)
  39. {
  40. if(line.equals("over"))
  41. break;
  42. byte[] buf = line.getBytes();
  43. DatagramPacket dp = new DatagramPacket(buf,buf.length,
  44. InetAddress.getByName("192.168.2.105"),10001);
  45. ds.send(dp);
  46. //System.out.println(line.toUpperCase());
  47. }
  48. bfr.close();
  49. ds.close();
  50. }
  51. catch (IOException e)
  52. {
  53. throw new RuntimeException("发送失败");
  54. }
  55. }
  56. }
  57. //TODO RECEIVE
  58. class Receive implements Runnable
  59. {
  60. private DatagramSocket ds;
  61. Receive(DatagramSocket ds)
  62. {
  63. this.ds = ds;
  64. }
  65. public void run()
  66. {
  67. try
  68. {
  69. while(true)
  70. {
  71. //System.out.println("jieshou");
  72. byte[] buf = new byte[1024*64];
  73. DatagramPacket dp = new DatagramPacket(buf,buf.length);
  74. ds.receive(dp);
  75. String ip = dp.getAddress().getHostAddress();
  76. int port = dp.getPort();
  77. String data = new String(dp.getData(),0,dp.getLength());
  78. System.out.println(ip+"-"+port+"土豆:"+data);
  79. }
  80. }
  81. catch(IOException e)
  82. {
  83. throw new RuntimeException("接收失败");
  84. }
  85. }
  86. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马