网络编程-UDP


 * 网络端口不是物理端口,是逻辑端口;MySQL:3306  网络:80   

 * IP公网现在不是一个人一个IP了,一片区域一个公网IP。  本地回环地址:127.0.0.1对应本地主机名localhost
 * 传输层:udp(即时聊天,网络会议) tcp(下载,打电话)
 * 网络层:ip  (InetAddress)

 * 应用层:HTTP  FTP  

UDP例子程序:

package javaBase.net;
import java.net.*;
/*
 * 发送端
 */
public class UdpSend {
	public static void main(String[] args) throws Exception{
		//1,创建udp服务,DatagramSocket();
		DatagramSocket ds = new DatagramSocket(8888);//自定义数字标识8888
		//2,确定数据,并封装成数据包
		byte[] buf = "udp said  i am coming".getBytes();
		DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.1.4"),10000);
		//3,用send()方法,发送数据包
		ds.send(dp);
		//4,关闭资源
		ds.close();
	}
}

package javaBase.net;
import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
 * 接收端
 */
public class UdpReceive {
	public static void main(String[] args) throws Exception{
		//1,创建udp socket,建立端点
		DatagramSocket ds = new DatagramSocket(10000);//指定端口数字标识
		//2,定义接收包,存放接收到的数据
		byte[] buf = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf, buf.length);
		//3,通过receive()方法,接收数据并写入包中
		ds.receive(dp);
		//4,从包中提取数据
		String ip = dp.getAddress().getHostAddress();//获取本机IP?
		int port = dp.getPort();//获取发送端端口  
		String data = new String(dp.getData(),0,dp.getLength());//获取数据
		System.out.println(ip+" : "+port+"["+data+"]");
		//5,关闭资源
		ds.close();
		
		
	}
}

键盘输入,循环接收:

发送端:

package javaBase.net;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
/*
 * 发送端
 */
public class UdpSend {
	public static void main(String[] args) throws Exception{
		send2();
	}
	/*
	 * 键盘输入
	 */
	public static void send2() throws Exception{
		DatagramSocket ds = new DatagramSocket(8888);
		BufferedReader in =
				new BufferedReader(new InputStreamReader(System.in));
		String line = null;
		while((line = in.readLine())!=null){
			if("over".equals(line))
				break;
			byte[] buf = line.getBytes();
			DatagramPacket dp = 
					new DatagramPacket(buf, buf.length,InetAddress.getByName("localhost"),10000);
			ds.send(dp);
		}
		ds.close();
	}
	/*
	 * 详细步骤,一次性
	 */
	public static void send1()throws Exception{
		//1,创建udp服务,DatagramSocket();
		DatagramSocket ds = new DatagramSocket(8888);//自定义数字标识8888
		//2,确定数据,并封装成数据包
		byte[] buf = "udp said  i am coming".getBytes();
		DatagramPacket dp = 
				new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.1.4"),10000);
		//3,用send()方法,发送数据包
		ds.send(dp);
		//4,关闭资源
		ds.close();
	}
}

接收端:

package javaBase.net;
import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
 * 接收端
 */
public class UdpReceive {
	public static void main(String[] args) throws Exception{
		receive2();
		
	}
	/*
	 * 循环等待接收
	 */
	public static void receive2() throws Exception{
		DatagramSocket ds = new DatagramSocket(10000);
		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());
			System.out.println(ip+": "+data );
		}
		
	}
	/*
	 * 详细步骤
	 */
	public static void receive1()	throws Exception{
		//1,创建udp socket,建立端点
		DatagramSocket ds = new DatagramSocket(10000);//指定端口数字标识
		//2,定义接收包,存放接收到的数据
		byte[] buf = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf, buf.length);
		//3,通过receive()方法,接收数据并写入包中
		ds.receive(dp);
		//4,从包中提取数据
		String ip = dp.getAddress().getHostAddress();//获取发送端IP?
		int port = dp.getPort();//获取发送端端口  
		String data = new String(dp.getData(),0,dp.getLength());//获取数据
		System.out.println(ip+" : "+port+"["+data+"]");
		//5,关闭资源
		ds.close();
	}
}

即时聊天程序

package javaBase.net;
import java.net.*;
import java.io.*;

/*
 * 发送线程
 */
class Send implements Runnable{
	//成员socket
	private DatagramSocket ds ;
	//构造方法接收传入socket
	public Send(DatagramSocket ds) {
		this.ds = ds;
	}
	@Override
	public void run() {
		try {
			BufferedReader in =
					new BufferedReader(new InputStreamReader(System.in));
			String line = null;
			while((line = in.readLine())!=null){
				if("over".equals(line))
					break;
				byte[] buf = line.getBytes();
				DatagramPacket dp = 
						new DatagramPacket(buf, buf.length,InetAddress.getByName("localhost"),10002);
				ds.send(dp);
			}
		} catch (Exception e) {
			throw new RuntimeException("发送端错误");
		}
		
	}

}
/*
 * 接收线程
 */
class Receive implements Runnable{
	//成员socket
	private DatagramSocket ds ;
	//构造方法初始化socket
	public Receive(DatagramSocket ds) {
		this.ds = ds;
	}
	@Override
	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());//看看发的什么东西
				System.out.println(ip+": "+data);
			}
			
		} catch (Exception e) {
			throw new RuntimeException("接收端错误");
		}
		
	}
}
public class Chat {
	public static void main(String[] args) throws Exception{
		DatagramSocket sendSocket = new DatagramSocket();//发送端可以随机端口号
		DatagramSocket receiveSocket = new DatagramSocket(10002);//接收端指定端口
		new Thread(new Send(sendSocket)).start();
		new Thread(new Receive(receiveSocket)).start();
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值