网络编程(UDP)

网络编程

    网络模型
      1.OSI参考模型
      2.TCP/IP参考模型
    网络通讯要素
      1.IP地址
        ●网络中设备标识
●不易记忆,可用主机名
●本地回环地址:127.0.0.1 主机名:localhost
      2.端口号
        用于标示进程的逻辑地址,不同进程的标示
有效端口0~65535,其中0~1024系统使用或保留端口,
      3.传输协议
        通讯规则
常见协议:TCP,UDP


UDP
   将数据及源和目的封装成数据报,不需要建立连接。
   每个数据报的大小限制在64k内
   因无连接,是不可靠协议
   不需要建立连接,速度快
TCP
   建立连接,形成传输数据的通道
   在连接中进行大数据量传输
   通过三次握手完成连接,是可靠协议
   必须建立连接,效率会稍低


Socket
  Socket就是为网络服务提供的一种机制
  通信的两端都有Socket
  网络通信其实就是Socket间的通信
  数据在两个Socket间通过IO传输


UDP用的对象是 DatagramSocket


Ps:xxx.xxx.x.255 是广播地址。


练习:
    通过udp传输方式,将一段文字数据发送出去。
思路:
1.建立udpsocket服务;
2.提供数据,并将数据封装到数据包中
3.通过Socket服务的发送功能,将数据包发出去
4.关闭资源。
    定义一个应用程序,用于接受UDP协议传输的协议并处理。
思路:
1.定义udpsocket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义数字标示,方便于明确哪些数据过来该应用程序可以处理。
2.定义一个数据包,存储接受到的字节数据,因为数据包对象中有更多功能,可以提取字节数据中的不同数据信息。
3.通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
4.通过数据包特有功能,将这些不同的数据取出,处理。

5。关闭资源。

package it.practise.com.socket;

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

class UdpSend {

	public static void main(String[] args) throws Exception {
		
		// 1.建立udpsocket服务;
		DatagramSocket ds = new DatagramSocket();
		
		// 2.提供数据,并将数据封装到数据包中
		byte[] data = "First Socket Program !!".getBytes();
		DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.1.100"), 10000);
		
		// 3.通过Socket服务的发送功能,将数据包发出去
		ds.send(dp);
		
		// 4.关闭资源。
		ds.close();
		
	}

}

class UdpRecive {
	public static void main(String[] args) throws Exception {
		
		// 1.定义udpsocket服务
		DatagramSocket ds = new DatagramSocket(10000);
		
		// 2.定义一个数据包,存储接受到的字节数据,因为数据包对象中有更多功能,可以提取字节数据中的不同数据信息。
		byte[] b = new byte[1024];
		DatagramPacket dp = new DatagramPacket(b, b.length);
		
		// 3.通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
		ds.receive(dp);
		
		//4.通过数据包特有功能,将这些不同的数据取出,处理
		String ip = dp.getAddress().getHostAddress();
		String data = new String(dp.getData(), 0, dp.getLength());
		int port = dp.getPort();
		System.out.println(ip + "::" + data + "::" + port);
		
		// 5。关闭资源
		ds.close();
	}
}

public class UdpDemo {
	public static void main(String[] args) {
		
	}
}


编写一个聊天程序,有收数据的部分和发数据的部分。
这两部分需要同时执行,那就需要多线程技术,一个线程控制发,一个线程控制收。
因为收和发,动作是不一致的,所以要定义两个run方法。

而且这两个方法要封装到不同的类中。

package it.practise.com.socket;

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

/*
 * 编写一个聊天程序,有收数据的部分和发数据的部分。
 * 这两部分需要同时执行,那就需要多线程技术,一个线程控制发,一个线程控制收。
 * 
 * 因为收和发,动作是不一致的,所以要定义两个run方法。
 * 而且这两个方法要封装到不同的类中。
 */
public class ChatDemo {

	public static void main(String[] args) throws Exception {
		DatagramSocket sendSocket = new DatagramSocket();
		DatagramSocket receSocket = new DatagramSocket(10002);
		
		Send send = new Send(sendSocket);
		Rece rece = new Rece(receSocket);
		
		Thread tSend = new Thread(send);
		Thread tRece = new Thread(rece);
		
		tSend.start();
		tRece.start();
	}

}

class Send implements Runnable {
	private DatagramSocket ds;
	Send(DatagramSocket ds) {
		this.ds = ds;
	}
	public void run() {
		try{
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			
			String line = null;
			
			while((line = br.readLine()) != null) {
				if("886".equals(line))
					break;
				
				byte[] buff = line.getBytes();
				
				DatagramPacket dp = new DatagramPacket(buff, buff.length, InetAddress.getByName("192.168.1.255"), 10002);
				
				ds.send(dp);
			}
		} catch(Exception e) {
			throw new RuntimeException("发送端失败。");
		}
	}
}

class Rece implements Runnable {
	private DatagramSocket ds;
	Rece(DatagramSocket ds) {
		this.ds = ds;
	}
	public void run() {
		try{
			while(true) {
				byte[] buff = new byte[1024];
				DatagramPacket dp = new DatagramPacket(buff, buff.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("接收端失败。");
		}
	}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值