第二十一章 网络通信
本章节主要讲解的是TCP和UDP两种通信方式它们都有着自己的优点和缺点 这两种通讯方式不通的地方就是TCP是一对一通信 UDP是一对多的
UDP通信 主要的方向是一对多通信方式 UDP通信就是一下子可以通信多个对象,这就是UDP对比TCP的优势,UDP它的原理呢 就是开启服务端 然后客户端依次连接客户端 于TCP不同的是他不会一个一个跟客户端说而是跟微信群聊一样它在给这些客户端发送消息 它的缺点呢 服务端呢会发送消息给到客户端 但是有些客户端并不会接收到消息 或者没有看到消息 这样就是UDP的缺点 并不会保证全部人都能收到消息,就像老师在教室上课 老师在讲台上上课 总会有些同学低头玩手机 或者发呆 就会有人没有听到老师讲的知识,UDP对比于TCP的缺点,就是不能保证每一个人都能够接收到消息 ,但是优点就是可以一下子跟好多个对象进行通信,但是不能保证可靠度,以下由代码讲解:
服务端类代码:
package udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
//广播 先运行
public class Notification extends Thread{
String weather = "节目预报:八点有大型晚会,请收听";//发送消息
int port = 9898;//端口号
InetAddress iaddress = null;
MulticastSocket socket = null;//多点广播套接字
Notification(){
try {
iaddress = InetAddress.getByName("224.255.10.0");//地址
socket = new MulticastSocket(port);//实例化多点广播套接字
socket.setTimeToLive(1);//指定发送范围是本地网络
socket.joinGroup(iaddress);//加入广播组
}catch(IOException e){
e.printStackTrace();//输出异常信息
}
}
public void run(){//run方法
while(true) {
DatagramPacket packet = null;//数据包
byte data[]=weather.getBytes();//字符串消息的字节数组
packet = new DatagramPacket(data,data.length,iaddress,port);//将数据打包
System.out.println(weather);//控制台打印消息
try {
socket.send(packet);//发送数据
sleep(3000);//让线程休眠3000毫秒
}catch(IOException e){
e.printStackTrace();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[]args) {
Notification w =new Notification();
w.start();//启动线程
}
}
客户端类代码:
-
package udp; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.WindowConstants; //接收 后运行 public class Receive extends JFrame implements Runnable, ActionListener { int port ;//端口 InetAddress group =null;//广播组地址 MulticastSocket socket = null;//多点广播套接字对象 JButton inceBtn = new JButton("开始接收"); JButton stopBtn = new JButton("停止接收"); JTextArea inceAr = new JTextArea(10,10);//显示接收广播的文本域 JTextArea inced = new JTextArea(10,10); Thread thread ; boolean stop = false;//定制接受信息状态 public Receive () { setTitle("广播数据包"); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); thread = new Thread(this); inceBtn.addActionListener(this);//绑定按钮ince的单击事件 stopBtn.addActionListener(this);//绑定按钮stop的单击事件 inceAr.setForeground(Color.blue);//指定文本域中文字的颜色 JPanel north = new JPanel(); north.add(inceBtn);//将按钮添加到面板north上 north.add(stopBtn); add(north,BorderLayout.NORTH);//将north放置在窗体的上部 JPanel center = new JPanel();//创建面板对象center center.setLayout(new GridLayout(1,2));//设置面板布局 center.add(inceAr);//将文本域添加到面板上 center.add(inced); add(center,BorderLayout.CENTER);//设置面板的布局 validate();//刷新 port =9898;//设置端口号 try { group = InetAddress.getByName("224.255.10.0");//指定接收地址 socket = new MulticastSocket(port);//绑定多点广播套接字 socket.joinGroup(group);//加入广播组 }catch(IOException e){ e.printStackTrace();//输出异常信息 } setBounds(100,50,360,380);//设置布局 setVisible(true);//将窗体设置为显示状态 } public void run() {//run方法 while (!stop) { byte data[] = new byte[1024];//创建缓存字节数组 DatagramPacket packet = null; packet = new DatagramPacket(data,data.length,group,port);//待接收的数据包 try { socket.receive(packet);//接收数据包 //获取数据包中的内容 String message = new String(packet.getData(),0,packet.getLength()); inceAr.setText("正在接收的内容:\n"+message);//将接受内容显示在文本域中 inced.append(message+"\n");//每条信息为一行 }catch(IOException e ) { e.printStackTrace();//输出异常信息 } } } public void actionPerformed(ActionEvent e) {//单机按钮ince出发时间 if(e.getSource()==inceBtn) { inceBtn.setBackground(Color.red);//设置按钮颜色 stopBtn.setBackground(Color.yellow); if(!(thread.isAlive())) {//如线程不处于“新建状态” thread = new Thread(this);//实例化Thread对象 } thread.start();//启动线程 stop = false;//开始接受信息 } if(e.getSource()== stopBtn) {//单机按钮stop出发时间 inceBtn.setBackground(Color.yellow);//设置按钮亚瑟 stopBtn.setBackground(Color.red); stop = true;//停止接收信息 } } public static void main(String[]args) { Receive rec = new Receive(); rec.setSize(460,200); } }
客户端和服务端代码图如下所示: