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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 来男. 中级黑马   /  2014-5-4 17:51  /  1579 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 来男. 于 2014-5-4 19:13 编辑

import java.io.*;
import java.net.*;

//客户端
class Send implements Runnable
{
        //创建UDP流对象
        private DatagramSocket ds;

        public Send(DatagramSocket ds)
        {
                this.ds=ds;
        }

        //复写run方法
        public void run()
        {
                try
                {
                        //标准键盘读取语句
                        BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));

                        String line=null;

                        while((line=bufr.readLine())!=null)
                        {
                                //over时客户端退出
                                if("over".equals(line))
                                        break;
                                
                                //将读取的信息以字节数组形式保存
                                byte[] buf=line.getBytes();

                                //定义数据包   
                                DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("196.168.0.2"),10007);
                        
                                //将包传出
                                ds.send(dp);
                        }
                }
                catch (Exception e)
                {
                        throw new RuntimeException("发送端失败!");
                }

                //关流
                ds.close();
        }
}

//服务端
class Rece implements Runnable
{
        private DatagramSocket ds;

        public Rece(DatagramSocket ds)
        {
                this.ds=ds;
        }

        public void run()
        {
                try
                {
                        while (true)
                        {
                                //定义存储容器
                                byte[] buf=new byte[1024];

                                //定义数据包
                                DatagramPacket dp=new DatagramPacket(buf,buf.length);

                                //接包
                                ds.receive(dp);
                                
                                //得到客户端id
                                String id=dp.getAddress().getHostAddress();

                                //得到包中信息
                                String data=new String(dp.getData(),0,dp.getLength());

                                System.out.println(id+":"+data);
                        }
                }
                catch (Exception e)
                {
                        throw new RuntimeException("接受端失败!");
                }
        }
}

class  ChatDemo
{
        public static void main(String[] args) throws Exception
        {
                DatagramSocket sendSocket=new DatagramSocket();
                DatagramSocket receSocket=new DatagramSocket(10007);

                //开启线程
                new Thread(new Send(sendSocket)).start();
                new Thread(new Rece(receSocket)).start();
        }
}

我敲完运行没报错(之前有几个母拼错..改了),也没出现阻塞情况,能发不能接且无法结束,over也不行,请问这是怎么回事??

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

7 个回复

倒序浏览
我看着程序没什么毛病,应该是你的主机ip配错了吧。。查看本机ip地址  ipconfig   。你再配一次试试?
ip地址现在一般都是dhcp机制的,所以你每一次上网ip地址都不尽相同,你想运行你的程序,每一次都可能需要重新配置ip。。
回复 使用道具 举报
海世山盟 发表于 2014-5-4 18:26
我看着程序没什么毛病,应该是你的主机ip配错了吧。。查看本机ip地址  ipconfig   。你再配一次试试?
ip地 ...

同学,我一直这个。嗯。偶,想问你是不是做UDP和TCP时要把360关了??

一直这个.jpg (19.9 KB, 下载次数: 33)

一直这个.jpg
回复 使用道具 举报
不用关啊。。我用你的代码然后改了我自己的ip就是可以的啊。

QQ截图20140504184302.jpg (66.69 KB, 下载次数: 35)

QQ截图20140504184302.jpg
回复 使用道具 举报
怎么我运行一点错误都没有啊,你到底哪里有问题啊?
回复 使用道具 举报
将本机地址改为127.0.0.1试试,应该是没有什么问题。。
回复 使用道具 举报
本帖最后由 NewDemo 于 2014-5-4 18:54 编辑

{:2_31:}楼主这个问题之前我遇到过,对于ip地址的话我一直配的是“127.0.0.1",因为这个就是本机ip,网络随便换,这个ip拿到的肯定是本机。你说over停不下来是肯定的,是因为多线程的原因,收到了over,也确实把while循环停下来了,但是其他线程并没有因此停下来,直接把break换成System.exit(0)保证就能停下来了。另外我不清楚楼主你是怎么实现这个通讯的,我因为只有一台电脑,所以就eclipse里边运行一个,然后在cmd里边运行一个才得以实现的。比如甲在eclipse中运行,乙个在dos命令行运行,保证甲的发送端发送到端口10000,乙的接收端监听端口10000,对应的乙的发送端发送到端口10001,甲的接收端则监听端口10001.

只要保证了端口不同就可以实现聊天的,这张图是楼主的程序实现的效果(doc命令行发送的是sd,eclipse发送的是12),所以程序没有问题,把break修改掉就可以停下来了。

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
NewDemo 发表于 2014-5-4 18:52
楼主这个问题之前我遇到过,对于ip地址的话我一直配的是“127.0.0.1",因为这个就是本机ip,网络随 ...

谢谢!受教了!我去试试。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马