java udp (使用类调用双通信)1
项目需要就使用了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的更多相关文章
- Java 动态分页类
动态分页类: Cls_page.java package pagination; public class Cls_page { private int nums;// 总条目数 private i ...
- Java中是否可以调用一个类中的main方法?
前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...
- paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型
paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...
- 关于Java中基类构造器的调用问题
在<Java编程思想>第7章复用类中有这样一段话,值得深思.当子类继承了父类时,就涉及到了基类和导出类(子类)这两个类.从外部来看,导出类就像是一个与基类具有相同接口的新类,或许还会有一些 ...
- java多线程并发去调用一个类的静态方法安全性探讨
java多线程并发去调用一个类的静态方法安全性探讨 转自:http://blog.csdn.net/weibin_6388/article/details/50750035 这篇文章主要讲多线程对 ...
- Junit测试类中如何调用Http通信
在使用Junit做测试的时候,有时候需要调用Http通信,无论是request还是response或者是session会话,那么在测试类里该如何调用呢,其实很简单,spring给我们提供了三个类 or ...
- java中各个类相互调用资源的原理
当我们要进行跨类的调用/使用的时候,比如当前类调用另一个类中的变量或方法时, 这时需要一定的条件,如果那些将要被调用的变量或方法是static(静态)变量,也叫类变 量,那么可以通过类名调用,相 ...
- java中Inetaddress类
InetAddress类 InetAddress类用来封装我们前面讨论的数字式的IP地址和该地址的域名. 你通过一个IP主机名与这个类发生作用,IP主机名比它的IP地址用起来更简便更容易理解. Ine ...
- Java的Properties类和读取.properties文件
一..properties文件的作用 Properties属性文件在JAVA应用程序中是经常可以看得见的,也是特别重要的一类文件.它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数据,没有必 ...
随机推荐
- UVA 11149 Power of Matrix
矩阵快速幂. 读入A矩阵之后,马上对A矩阵每一个元素%10,否则会WA..... #include<cstdio> #include<cstring> #include< ...
- YII 框架在 MAC OS下 连接数据库失败 提示 DB connection: SQLSTATE[HY000] [2002]
作者:zccst CDbConnection failed to open the DB connection: SQLSTATE[HY000] [2002] No such file or dire ...
- IFrame跨域访问自定义高度
由于JS禁止跨域访问,如何实现不同域的子页面将高度返回给父页面本身,是解决自定义高度的难点. JS跨域访问问题描述:应用A访问应用B的资源,由于A,B应用分别部署在不同应用服务器(tomcat)上,属 ...
- LPC2478内存布局以及启动方式
LPC2478 是NXP公司推出的一款基于APR7TDMI-S的工控型MCU,内置RAM与flash,同时提供外部扩展flash和ram接口,拥有LCD控制器,其内存布局如下所示 其中Flash高达5 ...
- Node.js timer的优化故事
前几天nodejs发布了新版本4.0,其中涉及到一个更新比较多的模块,那就是下面要介绍的timer模块. timers: Improved timer performance from porting ...
- Git和Github的配合使用
Git教程 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 Git 本地仓库详解 ...
- Bzoj3756
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3756 题解:乱搞 代码: #include<iostream> #include ...
- VS2010中出现无法嵌入互操作类型(转)
针对word或excel操作时,出现VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法问了度娘,解决方法如出一辙:选中项目中引入的dll,鼠标右键,选择属性,把“嵌入互操作类型”设 ...
- Angular - -ngKeydown/ngKeypress/ngKeyup 键盘事件和鼠标事件
ngKeydown/ngKeypress/ngKeyup 该指令在按键按下/按键按下/按键松开时执行指定表达式. ngKeydown和ngKeypress略有不同,目前的测试是ngKeypress针对 ...
- Mysql中日期时间型解析