黑马程序员技术交流社区
标题:
困惑求解,必须赠送高分:一下是一个简单的聊天程序
[打印本页]
作者:
潜伏
时间:
2013-12-5 17:02
标题:
困惑求解,必须赠送高分:一下是一个简单的聊天程序
import java.net.*;
import java.io.*;
class Sender implements Runnable
{
public void run()
{
try
{
DatagramSocket ds=new DatagramSocket(1234);//通过DategramSocket的对象建立UDP服务器既是用户数据协议:user datagram protocol
byte[] b;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
while((b=br.readLine().getBytes())!=null)
{
DatagramPacket dp=new DatagramPacket(b,0,b.length,InetAddress.getByName("192.168.43.204"),2345);//确定数据并且将数据封包
ds.send(dp);//通过UDP服务器发送数据
}
}
catch (Exception e)
{
throw new RuntimeException();
}
}
}
class Recer implements Runnable
{
public void run()
{
try
{
DatagramSocket ds=new DatagramSocket(2345);//通过DategramSocket的对象建立UDP服务器既是用户数据协议:user datagram protocol
byte[] b=new byte[1024];
while (true)
{
DatagramPacket dp=new DatagramPacket(b,b.length);//确定数据并且将数据封包
ds.receive(dp);//通过UDP服务器接受数据b
System.out.println(dp.getAddress().getHostAddress()+":"+dp.getPort()+new String(dp.getData(),0,dp.getLength()));
}
}
catch (Exception e)
{
throw new RuntimeException();
}
}
}
class Liaotian
{
public static void main(String[] args) throws Exception
{
new Thread(new Sender()).start();
new Thread(new Recer()).start();
}
}
困惑有下:
1,多线程在这儿为什么不加锁
2,这个小程序上面的在对数据进行封包的时候为何不能搞个广播地址,192.168.1.255;一弄成这样就接收不到
作者:
几番意难相付
时间:
2013-12-5 18:58
本帖最后由 几番意难相付 于 2013-12-5 19:00 编辑
1 多线程在这儿为什么不加锁
要理解这个问题 首先要明白在什么时候才需要使用同步
也就是当多个线程同时操作同一个资源的时候使用同步 比如毕姥爷的视频中 那个售票的例子 票的总数是 固定的 当多个线程 同时对总票数操作的时候 如果不加锁 就会出现同一张票被卖了2次或2次以上的情况
加了锁以后 当一个线程在卖一张票的时候 其他线程要等这张票被卖完才能卖下一张
而聊天程序 虽然使用了两个线程 但这两个线程一个负责接收 一个负责发送 并没有操作同一个数据 开两个线程只是为了将收发数据的功能整合在一起 你完全可以开两个窗口 一个负责接收 一个负责发送
2,这个小程序上面的在对数据进行封包的时候为何不能搞个广播地址,192.168.1.255;一弄成这样就接收不到
代码已测试 完全没问题 看你在封包的时候 用的IP是192.168.43.204 提问中却问的是192.168.1.255 两个网段不一样 当然接收不到 你改成192.168.43.255再试试看呢?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2