/*
编写一个聊天程序
有收数据的部分和发数据的部分
这两个部分需要同时执行,那就需要用到多线程技术
一个线程控制接收,一个线程控制发送。
因为收和发动作不是一致的,所以要定义两个run()方法,而且要封装到不同的类中。
*/
package com.ifeng.test;
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.text.SimpleDateFormat;
import java.util.Date;
public class UdpChatByThread
{
public static void main(String[] args)throws Exception
{
DatagramSocket dsSender = new DatagramSocket();
DatagramSocket dsReceiver = new DatagramSocket(10011);
new Thread(new Sender(dsSender)).start();
new Thread(new Receiver(dsReceiver)).start();
}
}
class Sender implements Runnable
{
private DatagramSocket socket;
public Sender(DatagramSocket socket)
{
this.socket = socket;
}
public void run()
{
//由于读入键盘都是字符操作,所有使用BufferedReader,可以使用readLine()方法
BufferedReader bufr = null;
try
{
bufr =
new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bufr.readLine())!= null)
{
byte[] buf = line.getBytes();
DatagramPacket packet =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10011);
socket.send(packet);
//当发送886后,发送端退出
if("886".equals(line))
break;
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if(bufr!=null)
bufr.close();
}
catch(IOException ex){ex.printStackTrace();}
}
socket.close();
}
}
class Receiver implements Runnable
{
private DatagramSocket socket;
private Timer timer;
//在初始化Receiver时就要传入DatagramSocket
public Receiver(DatagramSocket socket)
{
this.socket = socket;
}
public void run()
{
try
{
byte[] buf = new byte[1024];
//要让接收端始终开启接收信息
while(true)
{
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String ip = packet.getAddress().getHostName();
String data = new String(packet.getData(), 0, packet.getLength());
timer.getTime();
System.out.println(ip+": "+data);
}
}
catch(Exception e)
{
e.printStackTrace();
}
socket.close();
}
}
class Timer
{
public static void getTime()
{
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sf.format(date));
}
}
UDP基础(三)
最新推荐文章于 2025-03-24 19:44:11 发布