项目需要就使用了UDP通信,做了java的双方通信,其实代码还是来自之前的udp学习代码,自己加了注释,并且优化的使用类来封装关于通信类库的使用代码

目的是为了在安卓项目中使用时,可以通过实例化,调用方法即可,极大简单了代码的混杂程度

当然,该程序的缺陷是:未能实现服务器循环接收,只能通信一次,下一版本改正。

服务器代码:

定义一个udpS.java ,udpS类的代码:

package com.swust.udp;

import java.io.*;
import java.net.*;
/**
* 服务端
* 1、创建服务+端口
* 2、准备接受容器 byte数组
* 3、把接收容器封装成包 DatagramPacket
* 4、接受数据
* 5、分析数据
*/ public class udpS { private String content="hello world,我是服务器,给你回复了,哼哼哼"; private int port=5050; public void setContent(String content)
{
this.content=content;
}
public void setPort(int port)
{
this.port=port;
} public void udpServerInit( )throws IOException{
//服务器端首先创建一个DatagramSocket对象,并且指点监听的端口
DatagramSocket server = new DatagramSocket(port); //使用了端口,未调用setPort时,使用默认值
//创建一个空的DatagramPacket数据包对象并指定大小,用于接收数据
byte[] recvBuf = new byte[1024];
DatagramPacket recvPacket
= new DatagramPacket(recvBuf , recvBuf.length);
//使用DatagramSocket的receive方法接收客户端发送的数据,在没有数据进行接收的处于堵塞状态
server.receive(recvPacket); String recvStr = new String(recvPacket.getData() , 0 , recvPacket.getLength());
System.out.println("接收:\t" + recvStr);
/*
* 回发数据部分
*/
int port_Client = recvPacket.getPort();
InetAddress addr = recvPacket.getAddress();
String sendStr =content; //使用了content属性,未调用setContent,使用默认值
byte[] sendBuf;
sendBuf = sendStr.getBytes();
DatagramPacket sendPacket
= new DatagramPacket(sendBuf , sendBuf.length , addr , port_Client ); server.send(sendPacket); server.close();
} }

此时,主函数的代码,使用上面的类:

package com.swust.udp;

import java.io.*;

public class udpServer {  

    public static void main(String[] args) throws IOException  {
udpS udpser=new udpS();
udpser.setPort(8888);
udpser.setContent("猜猜我给你回复啥");
udpser.udpServerInit();
}
}


相应的,客户机端:

客户机代码:

定义一个udpC.java ,udpC类的代码:

package com.swust.udp;

import java.io.*;
import java.net.*; /**
* 1、创建客户端+端口
* 2、准备数据 字节数组
* 3、给数据打包 并指定发送的目的地和端口
* 4、发送
* 5、释放
*
* 思考 : 发送有类型的数据 怎么处理 如对象 数字 等等
*/
public class udpC { private String content="我是客户机1,给你发送消息了"; private int port=5050; private String ip = "127.0.0.1";
//设置文本内容
public void setContent(String content)
{
this.content=content;
}
//设置端口
public void setPort(int port)
{
this.port=port;
}
//设置IP地址
public void setIp(String ip)
{
this.ip=ip;
}
public void udpClientInit( )throws IOException{
//客户端也创建个DatagramSocket对象,并且指点监听的端口
DatagramSocket client = new DatagramSocket();
//定义要发送的一个字符串
String sendStr =content; //使用了content属性,未调用时用默认内容
byte[] sendBuf;
sendBuf = sendStr.getBytes();
//创建一个InetAddress对象,这个对象是一个网络地址
InetAddress addr = InetAddress.getByName(ip); //使用了ip地址属性,未调用时用默认本机地址127.0.0.1
//创建一个DatagramPacke数据包t对象,并指定要将这个数据报包发送到网络的哪个地址以及端口号
DatagramPacket sendPacket
= new DatagramPacket(sendBuf ,sendBuf.length , addr , port);//使用了端口属性,未调用时用默认值5050
//使用DatagramSocket的对象的send()方法发送数据包
client.send(sendPacket);
/*
* 接受服务器回发的消息
*/
byte[] recvBuf = new byte[1024];
DatagramPacket recvPacket
= new DatagramPacket(recvBuf , recvBuf.length);
client.receive(recvPacket);
String recvStr = new String(recvPacket.getData() , 0 ,recvPacket.getLength());
System.out.println("收到: \t" + recvStr); client.close();
} }

此时,主函数的代码,使用上面的类:

package com.swust.udp;

import java.io.*;

public class udpClient {
public static void main(String[] args) throws IOException { udpC udpclient=new udpC();
udpclient.setPort(8888);
//udpclient.setIp("100.67.176.34");//测试网络ip是否可用,未调用时使用本机ip
udpclient.setContent("我是客户机,你信吗");
udpclient.udpClientInit();
} }

总结:这样写比较灵活吧,以后控件的内容,端口,IP可以通过形参来改变,否则安卓代码和java代码混在一起,问题很大。

ps:好久不写类的方法封装了,不得不去翻基础知识,汗。今天好好加油吧,纪念大三的暑假!

java udp (使用类调用双通信)1的更多相关文章

  1. Java 动态分页类

     动态分页类: Cls_page.java package pagination; public class Cls_page { private int nums;// 总条目数 private i ...

  2. Java中是否可以调用一个类中的main方法?

    前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...

  3. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型

    paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...

  4. 关于Java中基类构造器的调用问题

    在<Java编程思想>第7章复用类中有这样一段话,值得深思.当子类继承了父类时,就涉及到了基类和导出类(子类)这两个类.从外部来看,导出类就像是一个与基类具有相同接口的新类,或许还会有一些 ...

  5. java多线程并发去调用一个类的静态方法安全性探讨

    java多线程并发去调用一个类的静态方法安全性探讨 转自:http://blog.csdn.net/weibin_6388/article/details/50750035   这篇文章主要讲多线程对 ...

  6. Junit测试类中如何调用Http通信

    在使用Junit做测试的时候,有时候需要调用Http通信,无论是request还是response或者是session会话,那么在测试类里该如何调用呢,其实很简单,spring给我们提供了三个类 or ...

  7. java中各个类相互调用资源的原理

       当我们要进行跨类的调用/使用的时候,比如当前类调用另一个类中的变量或方法时, 这时需要一定的条件,如果那些将要被调用的变量或方法是static(静态)变量,也叫类变 量,那么可以通过类名调用,相 ...

  8. java中Inetaddress类

    InetAddress类 InetAddress类用来封装我们前面讨论的数字式的IP地址和该地址的域名. 你通过一个IP主机名与这个类发生作用,IP主机名比它的IP地址用起来更简便更容易理解. Ine ...

  9. Java的Properties类和读取.properties文件

    一..properties文件的作用 Properties属性文件在JAVA应用程序中是经常可以看得见的,也是特别重要的一类文件.它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数据,没有必 ...

随机推荐

  1. 在阿里云ECS(CentOS6.5)上安装mysql

    首先查看服务器上是否已经安装过mysql 命令: rpm -qa | grep mysql 结果: 可以看到ECS上已经有mysql-libs这个包了.这并不影响安装. 查看yum服务器上提供的mys ...

  2. Android L(5.0)源码之图形与图像处理之动画——Frame、Tween、属性动画、SurfaceView

    工作中暂时还没涉及到,暂时先不总结

  3. STM32的时钟树深入详解以及RCC配置

    在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法 如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT ...

  4. 【转】人工智能(AI)资料大全

    这里收集的是关于人工智能(AI)的教程.书籍.视频演讲和论文. 欢迎提供更多的信息. 在线教程 麻省理工学院人工智能视频教程 – 麻省理工人工智能课程 人工智能入门 – 人工智能基础学习.Peter ...

  5. Android 屏幕适配方案(转载)

    3.百分比的引入 1.引入 其实我们的解决方案,就是在项目中针对你所需要适配的手机屏幕的分辨率各自简历一个文件夹. 如下图: 然后我们根据一个基准,为基准的意思就是: 比如480*320的分辨率为基准 ...

  6. Android与JNI(三) ---- c++调用java(转载)

    源码下载:JniDemo JNI就是Java Native Interface, 即可以实现Java调用本地库, 也可以实现C/C++调用Java代码, 从而实现了两种语言的互通, 可以让我们更加灵活 ...

  7. ios-贝塞尔曲线

    git下载地址:git@github.com:lu459700780/UIBezierPath.git 演示: #import "ViewController.h" @interf ...

  8. 更改pandas dataframe 列的顺序

    摘自 stackoverflow 这是我的df: Net Upper Lower Mid Zsore Answer option More than once a day 0% 0.22% -0.12 ...

  9. php AES 加密类

    <?php class CryptAES { protected $cipher = MCRYPT_RIJNDAEL_128; protected $mode = MCRYPT_MODE_ECB ...

  10. java 二维码

    在http://www.ostools.net/qr看到了一个生成二维码的工具,于是就产生了一个想法: 为什么自己不做一个二维码的生成和解析工具呢?花了一个多钟的时间,嘿嘿,就做出来啦... 先来看看 ...