最近学了Java 网络编程,花了2天写时间写了个这个小东东,第一次发,大家不要见笑笑,呵呵!
多播类:
/**
* 程序名称:Broadcast.java
* 程序作用:创建一个多播类,用于数据的发送与接收
* 程序作者:J.J.Y
*
*/
import java.io.*;
import java.net.*;
public class Broadcast
{
//定义播段地址,接收端口,发送端口
public static final String BroadcastGroup = "228.6.7.8";
public static final int BroadcastRecvPort = 4567;
public static final int BroadcastSendPort = 4566;
//接收字符串
private String Message;
//接收包和发送包
private DatagramPacket DataSendPacket;
private DatagramPacket DataRecvPacket;
//private DatagramSocket SendSocket;
//接收缓冲区和发送缓冲区
private byte[] SendBuf = new byte[1024];
private byte[] RecvBuf = new byte[1024];
//发送Socket
private DatagramSocket SendSocket;
//多播类
MulticastSocket BroadcastClass;
//构造函数
public Broadcast()
{
try
{
//发送Socket初始化
SendSocket = new DatagramSocket();
//多播段初始化
BroadcastClass = new MulticastSocket(BroadcastRecvPort);
//确定多报播地址
BroadcastClass.joinGroup(InetAddress.getByName(BroadcastGroup));
}
catch(IOException e)
{
e.printStackTrace();
}
}
//发送数据
public void SendData(String InMsg)
{
try
{
//发送数据包初始化
SendBuf = InMsg.getBytes();
int length = InMsg.getBytes().length;
DataSendPacket = new DatagramPacket(SendBuf,length,InetAddress.getByName(BroadcastGroup),BroadcastRecvPort);
//数据发送
SendSocket.send(DataSendPacket);
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
}
//接收数据并返回
public String GetData()
{
try
{
//接收数据并送与接收缓冲区
DataRecvPacket = new DatagramPacket(RecvBuf,1024);
BroadcastClass.receive(DataRecvPacket);
//取得数据并返回数据
Message = new String(DataRecvPacket.getData(),0,DataRecvPacket.getLength());
Message = Message + " from " + DataRecvPacket.getAddress().getHostName();
Message = Message + " 端口 " + DataRecvPacket.getPort();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
return Message;
}
}
/**一个接收线程,主要用于接收数据,随便也写了发送数据
* 程序名称:Receiver.java
* 程序作用:接收线程类
* 程序作者:J.J.Y
*/
import java.net.*;
import java.io.*;
import javax.swing.*;
public class Receiver extends Thread
{
//接收的信息
private String Message;
private JTextArea displayArea;
Broadcast Recv = new Broadcast();
//构造函数,
public Receiver(JTextArea RecvArea)
{
displayArea = RecvArea;
}
public void run()
{
while (true)
{
//监听接收数据包
Message = Recv.GetData();
//System.out.println(Message);
//displayArea.setText("11111");
displayArea.append(Message + "\r\n");
}
}
//发送数据
public void SendMessage(String InMsg)
{
Recv.SendData(InMsg);
}
}
/**
* 程序名称:ChatClient.java
* 程序作用:UDP聊天客户端
* 程序作者:J.J.Y
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ChatClient extends JFrame implements ActionListener
{
//接收线程
Receiver recv;
//发送文本框
JTextField Sendtxt;
public ChatClient()
{
//客户端界面简单初始化
Sendtxt = new JTextField();
Sendtxt.addActionListener(this);
JTextArea DisplayArea = new JTextArea();
JScrollPane js =new JScrollPane();
JViewport port = js.getViewport();
port.add(DisplayArea);
// System.out.println(js.getLayout());
//js.add(DisplayArea);
this.getContentPane().add(BorderLayout.CENTER,js);
this.getContentPane().add(BorderLayout.SOUTH,Sendtxt);
this.setSize(300,300);
this.show();
//Broadcast brd = new Broadcast();
//brd.SendData("客户端初始化");
//创建一个新的接收线程并运行
recv = new Receiver(DisplayArea);
recv.start();
}
//事件响应代码
public void actionPerformed(ActionEvent e)
{
//文本框有内容才发送数据
if (Sendtxt.getText().length() != 0)
{
recv.SendMessage(Sendtxt.getText());
}
}
public static void main(String args[])
{
new ChatClient();
}
}
在JDK1.4.2测试通过,直接编译ChatClient.java运行。
另外,本人是菜鸟,欢迎高手指点,我的邮箱:jjy_8888@163.com