项目需要就使用了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. shell基本理论知识

    (1)查看系统上安装了哪些shell # cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/dash /bin/bash / ...

  2. X-004 FriendlyARM tiny4412 uboot移植之点亮指路灯

    <<<<<<<<<<<<<<<<<<<<<<<<< ...

  3. Android自定义控件(状态提示图表) (转)

    源:Android自定义控件(状态提示图表) 源:Android应用开发 [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1  背景 前面分析 ...

  4. mongodb学习(一)

    重点是踏出第一步: 1. 各种资料集合,mongodb的介绍,安装,破解...内容大同小异... http://www.cnblogs.com/kuochin/p/3599630.html;http: ...

  5. 如何用 Git 合并两个库,并保留提交历史

    转载自 https://segmentfault.com/a/1190000000678808 背景 一个中型规模项目,开始规划时就打算采用 C/S 架构,后端是单纯的 API 服务,前端在 Web ...

  6. Mybatis oracle多表联合查询分页数据重复的问题

    Mybatis oracle多表联合查询分页数据重复的问题 多表联合查询分页获取数据时出现一个诡异的现象:数据总条数正确,但有些记录多了,有些记录却又少了甚至没了.针对这个问题找了好久,最后发现是由于 ...

  7. hibernate-Maven

    1.创建Maven 2.创建Maven工程 3.然后一直下一步 4.创建成功后Maven 5.下载jra包 //hibernate <dependencies> <dependenc ...

  8. python 自动化之路 day 13

    本节内容参考博客: http://www.cnblogs.com/wupeiqi/articles/5132791.html http://www.cnblogs.com/wupeiqi/articl ...

  9. spark中数据的读取与保存

    1.文本文件 (1)读取文本文件 JavaRDD<String> input =sc.textFile(dir) (2)保存文本文件 result.saveAsTextFile(dir)) ...

  10. netstat 查看连接数

    1.查看Web服务器(Nginx Apache)的并发请求数及其TCP连接状态: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print ...