项目需要就使用了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. “canvas画布仿window系统自带画图软件"项目的思考

    "canvas画布仿window系统自带画图软件"项目的思考 首先贴上DEMO图,并没有美化效果.对UI有要求的,请自带补脑技术. 思考一 在做项目的过程中,我发现"工具 ...

  2. 23、手把手教你Extjs5(二十三)模块Form的自定义的设计[2]

    在本节中将要加入各种类型的字段,在加入字段的时候由于可以一行加入多个字段,因此层次结构又多了一层fieldcontainer.form里面的主要层次结构如下: form -- fieldSet -- ...

  3. 2、手把手教你Extjs5(二)项目中文件的加载过程

    上一节中用sencha工具自动创建了一个项目,并且可以在浏览器中查看.现在我们来看看js类加载过程.如下图所示: 1、首先:浏览器中输入 localhost:1841 ,调用 index.html; ...

  4. javascript基础教程学习总结(1)

    摘自javascript基础教程 开始: 1.将脚本放在哪里: 1.1 放在html和<html>之间 范例: <!DOCTYPE html PUBLIC "-//W3C/ ...

  5. CSharp笔记>>>多语言,注册

    C#多语言 方案1:http://blog.csdn.net/suncherrydream/article/details/43234059 http://blog.itpub.net/1263917 ...

  6. Android控件系列之RadioButton&RadioGroup

    学习目的: 1.掌握在Android中如何建立RadioGroup和RadioButton 2.掌握RadioGroup的常用属性 3.理解RadioButton和CheckBox的区别 4.掌握Ra ...

  7. S3C2440看门狗解析

    个PCLK周期的复位信号 也就是说,在某些环境下,看门狗可以当做定时器使用,当他中断的时候并不发生复位,只发生中断,我看看图 看门狗的中断和复位信号是可以依靠wtcon来切断的(看门狗的时钟是无法切断 ...

  8. 10天学会phpWeChat——第十天:phpWeChat的会员注册、登录以及微信网页开发

    通过前面的系列教程,我们系统的讲解了phpWeChat从视图端.控制器端到模型端的操作流程:熟悉了phpWeChat的目录结构:掌握了视图端模板如何创建一个丰富的表单和模型端如何操作数据库.这一切都是 ...

  9. [转]20个令人惊叹的桌面Docker容器

    大家好,今天我们会列出一些运行在Docker容器中的很棒的桌面软件,我们可以在自己的桌面系统中运行它们.Docker 是一个开源项目,提供了一个可以打包.装载和运行任何应用的轻量级容器的开放平台.它没 ...

  10. C语言-while循环

    循环是结构化程序设计的基本结构之一,它和顺序控制.选择结构共同作为各种复杂程序的基本构造单元(摘自谭浩强的<C程序设计>. 一.while循环: 1.使用while循环控制输出0到9十个数 ...