加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表

发布时间:2020-12-15 08:24:11 所属栏目:Java 来源:网络整理
导读:java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式) * TCP * 特点:面向连接,点对点的通信,效率较低,但安全可靠 * UDP:用户数据报协议,类似于发报机 * 特点:非面向连接,可以广播发送,效率较高,但传输不可靠 * java.net.DatagramSocke

java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式)

* TCP
* 特点:面向连接,点对点的通信,效率较低,但安全可靠
* UDP:用户数据报协议,类似于发报机
* 特点:非面向连接,可以广播发送,效率较高,但传输不可靠
* java.net.DatagramSocket: 此类表示用来发送和接收数据报包的套接字。?
* 构造方法:
* DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。
* DatagramSocket(int port,InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。
* 常用的方法:
* send(DatagramPacket p) 从此套接字发送数据报包。
* receive(DatagramPacket p)从此套接字接收数据报包。
* close() 关闭此数据报套接字。
*?
* java.net.DatagramPacket:此类表示数据报包。?
* 构造方法:
* DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port)?
构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。?
DatagramPacket(byte[] buf,int port)?
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。?
DatagramPacket(byte[] buf,int length)?
构造 DatagramPacket,用来接收长度为 length 的数据包。

public class UDPClient {
? ? public static void main(String[] args) {
? ? ? ? try {
? ? ? ? ? ? //1.创建数据报套接字
? ? ? ? ? ? DatagramSocket datagramSocket =? new DatagramSocket(6666);
? ? ? ? ? ? //2.创建数据报包用于封装数据和目标地址
? ? ? ? ? ? String str="hello world!";
? ? ? ? ? ? byte[] content = str.getBytes();//将字符串转换为字节的数组
? ? ? ? ? ? DatagramPacket datagramPacket = new DatagramPacket(content,content.length,InetAddress.getLocalHost(),9999);
? ? ? ? ? ? //3.调用send方法进行发送数据
? ? ? ? ? ? datagramSocket.send(datagramPacket);
? ? ? ? ? ? //4.释放资源
? ? ? ? ? ? datagramSocket.close();
? ? ? ? } catch (SocketException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (UnknownHostException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ??
? ? }
}

?

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
?* DatagramSocket(int port)
?* DatagramPacket(byte[] buf,int length)? 构造 DatagramPacket,用来接收长度为 length 的数据包。
?* DataPacket类中方法:
?*? ? ?getData() 返回数据缓冲区。
?*? getLength()返回将要发送或接收到的数据的长度。
?*? getPort() 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的
?*? getAddress()返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
?*?
?*/
public class UDPServer {
? ? public static void main(String[] args) {
? ? ? ? try {
? ? ? ? ? ? //1.创建数据报套接字
? ? ? ? ? ? DatagramSocket socket = new DatagramSocket(9999);
? ? ? ? ? ? //2.创建一个数据报包
? ? ? ? ? ? byte[] content = new byte[1024];
? ? ? ? ? ? DatagramPacket datagramPacket = new DatagramPacket(content,content.length);
? ? ? ? ? ? //3.调用receive方法接收数据包
? ? ? ? ? ? socket.receive(datagramPacket);
? ? ? ? ? ? //4.从数据报包中获取数据
? ? ? ? ? ? byte[] data=? datagramPacket.getData();//获取数据报包中的数据
? ? ? ? ? ? int length = datagramPacket.getLength();//
? ? ? ? ? ? InetAddress ip = datagramPacket.getAddress();
? ? ? ? ? ? int port = datagramPacket.getPort();
? ? ? ? ? ? System.out.println("内容:"+new String(data,length));
? ? ? ? ? ? System.out.println("数据长度:"+length);
? ? ? ? ? ? System.out.println("发送方的IP地址:"+ip);
? ? ? ? ? ? System.out.println("发送方的端口号:"+port);
? ? ? ? ? ? //5.释放资源
? ? ? ? ? ? socket.close();
? ? ? ? } catch (SocketException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ??
? ? }
}

?

利用UDP实现聊天功能:

?

import java.io.IOException;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
?* 利用UDP实现聊天功能
?* @author Administrator
?*
?*/
public class UdpChatClient {
? ? public static void main(String[] args) {
? ? ? ? System.out.println("---------顾客---------");
? ? ? ? try {
? ? ? ? ? ? //1.创建数据报套接字
? ? ? ? ? ? DatagramSocket socket = new DatagramSocket(6666);
? ? ? ? ? ? Scanner input = new Scanner(System.in);
? ? ? ? ? ? while(true){
? ? ? ? ? ? ? ? //2.获取用户输入
? ? ? ? ? ? ? ? String message = input.next();
? ? ? ? ? ? ? ? byte[] bs = message.getBytes();
? ? ? ? ? ? ? ? //3.创建数据报包
? ? ? ? ? ? ? ? DatagramPacket packet = new DatagramPacket(bs,bs.length,InetAddress.getByName("127.0.0.1"),8888);
? ? ? ? ? ? ? ? //4.发送数据
? ? ? ? ? ? ? ? socket.send(packet);
? ? ? ? ? ? ? ? //接收数据
? ? ? ? ? ? ? ? byte[] bs2 = new byte[1024];
? ? ? ? ? ? ? ? DatagramPacket packet2 = new DatagramPacket(bs2,bs2.length);
? ? ? ? ? ? ? ? socket.receive(packet2);//接收数据
? ? ? ? ? ? ? ? byte[] serverMesage = packet2.getData();
? ? ? ? ? ? ? ? String str=new String(serverMesage,serverMesage.length);
? ? ? ? ? ? ? ? System.out.println("客服说:"+str);
? ? ? ? ? ? ? ? if(message.equals("bye")){
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? //释放资源
? ? ? ? ? ? socket.close();
? ? ? ? } catch (SocketException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (UnknownHostException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ??
? ? }
}

??正则表达式:


* 匹配次数的符号: *:0次或多次--->{0,}?
* +:1次或多次 --->{1,}
* ?: 0次或1次 --->{0,1}
* {n}:恰好出现n次
* {n,m}:最少出现n次,最大出现m次
* {n,}:最少出现n次
* 常用的符号:
* . 任何字符(与行结束符可能匹配也可能不匹配)?
* d 数字:[0-9]?
* D 非数字: [^0-9]?
* s 空白字符:[ tnx0Bfr]?
* S 非空白字符:[^s]?
* w 单词字符:[a-zA-Z_0-9] --->字母,数组和下划线
* W 非单词字符:[^w]?
* 字符类:
* [abc] a、b 或 c(简单类)?
* [^abc] 任何字符,除了 a、b 或 c(否定)?
* [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)

public class TestVertify {
? ? /**
? ? ?* 利用传统字符串中方法进行校验。
? ? ?* 用户名长度不能小于8位,并只能有字母或数字组成
? ? ?* @param name
? ? ?* @return
? ? ?*/
? ? public static boolean checkUserName(String name){
? ? ? ? boolean isCorrect=true;
? ? ? ? if(name.length()<8){
? ? ? ? ? ? isCorrect=false;
? ? ? ? ? ? System.out.println("用户名长度不能小于8位!");
? ? ? ? }else{
? ? ? ? ? ? //将用户名转换为小写
? ? ? ? ? ? String uname = name.toLowerCase();
? ? ? ? ? ? for(int i=0;i<uname.length();i++){
? ? ? ? ? ? ? ? char c = uname.charAt(i);
? ? ? ? ? ? ? ? if(!((c>=‘a‘&&c<=‘z‘)||(c>=‘0‘&&c<=‘9‘))){
? ? ? ? ? ? ? ? ? ? isCorrect=false;
? ? ? ? ? ? ? ? ? ? System.out.println("用户名必须有字母或数字组成!");
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return isCorrect;
? ? }
? ??
? ??
? ? public static boolean checkName(String name){
? ? ? ? String reg="[a-zA-Z0-9]{8,20}";//字母和数字组成,长度应该在8位到20位之间。
? ? ? ? boolean is=name.matches(reg);
? ? ? ? return is;
? ? }
? ? /**
? ? ?* 校验手机号码:11位
? ? ?* 13开头,15开头,17开头,18开头,后跟9的数字
? ? ?* @param mobile
? ? ?* @return
? ? ?*/
? ? public static boolean checkMobile(String mobile){
? ? ? ? String reg = "1[3|5|7|8]d{9}";
? ? ? ? return mobile.matches(reg);
? ? }
? ? public static void main(String[] args) {
//? ? ? ? boolean is =checkUserName("abcedfg123");
//? ? ? ? boolean is = checkName("abcdefg12!");
//? ? ? ? System.out.println("是否通过校验:"+is);
? ? ? ? boolean is=? checkMobile("17112345678");
? ? ? ? if(is){
? ? ? ? ? ? System.out.println("手机号码正确!");
? ? ? ? }else{
? ? ? ? ? ? System.out.println("手机号码有误!");
? ? ? ? }
? ? }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读