Java—初学—网络编程-UDP


===============================

三要素之一  IP地址




A类中:

         (1)   10.X.X.X是私有地址(私有地址就是在互联网上不使用)

         (2)   127.X.X.X 是保留地址

            A类 中国只有三个 政府 电信 军事部门,大多都在美国

B类中:

         (1)  172.16.0.0 --- 172.31.255.255是私有地址

         (2)  169.254.X.X 是保留地址

            B类 一般为大学的校园网

C类中:

           192.168.X.X 是私有地址

            我们一般用C类


======================

两个相关的DOS命令:

            ipconfig  查看本机ip地址

            ping 后面跟ip地址,测试本机与指定ip地址间的通信是否有问题

 特殊的IP地址:

            127.0.0.1 回环地址(表示本机)  

             X.X.X.255 广播地址

             X.X.X.0 网络地址 




三要素之二  端口号



三要素之三  协议

通信的规则

三次握手协议TCP

         A: 发送请求  B: 回复同意  A:发送



===================================================



========================================

UDP协议发送协议

A:创建发送方的Socket对象

B:创建数据,并把数据打包

C:调用Socket对象发送方法发送数据

D:释放资源

package cn.itcast_02;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendDemo {
   public static void main(String[] args) throws IOException {
	   //Socket sk = new Socket();
	   DatagramSocket ds = new DatagramSocket();
	   //创建数据包
	   
	   //发送数据包
	   //public void send(DatagramPacket p);
	   byte[] bys = "hello,udp,我来啦。".getBytes();
	   int length = bys.length;
	   InetAddress address = InetAddress.getByName("DESKTOP-0257CLH");
	   int port = 10086;
	   
	   //DatagramSocket(byte[] buf,int length, InetAddress address,int port)
	   DatagramPacket dp = new DatagramPacket(bys,length,address,port);
	   ds.send(dp);
	   
	   //释放资源
	   ds.close();
	   
   }

}

UDP协议接收协议

A:创建发送方的Socket对象

B:创建一个数据包(接受容器)

C:调用Socket对象接收方法接收数据

D:解析数据包,并显示在控制台

E:释放资源


package cn.itcast_02;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class receiveDemo {
   public static void main(String[] args) throws IOException {
	   
	   //创建Socket对象
	   //带参构造 DatagramSocket(int port)
	   DatagramSocket ds = new DatagramSocket(10086);
	   
	   //创建一个数据包来接收对象
	   //DatagramPacket(byte[] buf, int length)   
	   byte[] bys = new byte[1024];
	   int length = bys.length;
	   DatagramPacket dp = new DatagramPacket(bys,length);
	   
	   //调用Socket对象的接收方法来接收数据
	   // public void receive(DatagramPacket p)
	   ds.receive(dp);
	   
	   //解析数据包,显示在控制台
	   //获取对方的ip
	   InetAddress address = dp.getAddress();
	   String ip = address.getHostAddress();
	     
	   //public byte[] getData():获取数据缓冲区
	   byte[] bys2 = dp.getData();
	   //public int getLength():获取数据的实际长度
	   int len = dp.getLength();
	   String s = new String(bys2,0,len);
	   System.out.println(ip+"传递的数据是:"+s);
	   
 
	   //释放资源
	   ds.close();
   }
}

====================

图解


=====================


主程序:

package cn.itcast_03;

import java.io.IOException;
import java.net.DatagramSocket;
import java.net.SocketException;

/*
 * 通过多线程改进改才的方法,这样就可以实现在在一个窗口发送和接收数据了
 * 
 * 
 */
public class ChatRoom {
    public static void main(String[] args) throws IOException {
		DatagramSocket dsSend = new DatagramSocket();
		DatagramSocket dsReceive = new DatagramSocket(12306);
		
		SendThread  st = new SendThread(dsSend);
		ReceiveThread  rt = new ReceiveThread(dsReceive);
		
		Thread t1 = new Thread(st);
		Thread t2 = new Thread(rt);
		
		t1.start();
		t2.start();
	}
}

发送方:

package cn.itcast_03;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendThread implements Runnable {

	private DatagramSocket ds;

	public SendThread(DatagramSocket ds) {
		this.ds = ds;
	}

	@Override
	public void run() {
		try {
		// 封装键盘录入数据
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = null;
		while ((line = br.readLine()) != null) {

			byte[] bys = line.getBytes();
			// 创建数据包
			// 发送数据包
			// public void send(DatagramPacket p);
			// byte[] bys = "hello,udp,我来啦。".getBytes();
			// int length = bys.length;
			// InetAddress address = InetAddress.getByName("DESKTOP-0257CLH");
			// int port = 10086;

			// DatagramPacket(byte[] buf,int length, InetAddress address,int port)
			// DatagramPacket dp = new DatagramPacket(bys,length,address,port);

			DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("DESKTOP-0257CLH"), 12306);

			ds.send(dp);

		}
		// 释放资源
		ds.close();
		}catch(IOException e) {
			e.printStackTrace();
		}

	}

}

接收方

package cn.itcast_03;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveThread implements Runnable {

	private DatagramSocket ds;

	public ReceiveThread(DatagramSocket ds) {
		this.ds = ds;
	}

	@Override
	public void run() {
		try {
		while (true) {

			// 创建一个数据包来接收对象
			// DatagramPacket(byte[] buf, int length)
			byte[] bys = new byte[1024];
			// int length = bys.length;
			DatagramPacket dp = new DatagramPacket(bys, bys.length);

			// 调用Socket对象的接收方法来接收数据
			// public void receive(DatagramPacket p)
			ds.receive(dp);

			// 解析数据包,显示在控制台
			// 获取对方的ip
			// InetAddress address = dp.getAddress();
			// String ip = address.getHostAddress();
			String ip = dp.getAddress().getHostAddress();

			// public byte[] getData():获取数据缓冲区
			// byte[] bys2 = dp.getData();
			// public int getLength():获取数据的实际长度
			// int len = dp.getLength();
			String s = new String(dp.getData(), 0, dp.getLength());
			System.out.println(ip + "传递的数据是:" + s);

		}
		}catch(IOException e) {
			e.printStackTrace();}
	}

}











猜你喜欢

转载自blog.csdn.net/u013116760/article/details/80194097