/*
编写一个程序,用来聊天
要求:有收数据的部分,有发数据的部分
这两部分需要同时执行
所以用到多线程的部分
一个程序控制收,一个程序控制发
因为收和发誓不一致的,所以要定义两个run方法。
而且这两个方法要封装到不同的类中
*/
package en.itcast.java.tools;
import java.awt.Dialog;
import java.io.*;
import java.net.*;
import javax.management.RuntimeErrorException;
class Send implements Runnable
{
private DatagramSocket ds;
//发送和接受数据包的套接字
public Send(DatagramSocket ds)
{
this.ds=ds;
}
//构造函数除了没有返回值,还没有什么?构造函数是有new关键字的
//this.ds=ds 到底是个什么结构呢,他可以在其他函数中使用么。
//这不是初始化么,初始化是构造器的本能呀
public void run()
{
try
{
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line =null;
while ((line=bufr.readLine())!=null) {
byte[] buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10002);
ds.send(dp);
if("886".equals(line))
{
break;
}
}
}
catch (Exception e)
{
throw new RuntimeException("发送端失败!");
}
}
}
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);
String ip=dp.getAddress().getHostAddress();
String data =new String(dp.getData(),0,dp.getLength());
if("886".equals(data))
{
System.out.println(ip+"离开聊天室");
break;
}
System.out.println(ip+"---"+data);
}
}
catch(Exception e)
{
throw new RuntimeException("接收端失败");
}
}
}
public class ChatDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
DatagramSocket sendSocket=new DatagramSocket();
DatagramSocket receSocket=new DatagramSocket(10002);
new Thread(new Send(sendSocket)).start();
new Thread(new Rece(receSocket)).start();
}
}
|