安卓UDP通信2
服务器实现一发一收
服务器代码:
import java.net.*;
import java.io.*; public class udpRecv2
{
/*
* 创建UDP传输的接收端
* 1.建立udp socket服务,因为是要接收数据,必须指明端口号
* 2,创建数据包,用于存储接收到的数据。方便用数据包对象的方法处理数据
* 3,使用socket服务的receive方法将接收的数据存储到数据包中
* 4,通过数据包的方法解析数据包中的数据
* 5,关闭资源 *抛一个大异常:IOException
*/
public static void main(String[] args) throws IOException{
//1,创建udp socket服务
DatagramSocket ds = new DatagramSocket(10000); //2,创建数据包
byte[] buf =new byte[1024];
DatagramPacket dp =new DatagramPacket(buf,buf.length); //3,使用接收的方法将数据包存储到数据包中
ds.receive(dp);//阻塞式 //4.通过数据包对象的方法,解析其中的数据
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String content = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"::" +port+":"+content);
/*回发给手机数据*/
//首先获取端口和地址
InetAddress addr = dp.getAddress();
String sendStr = "Hello ! 我是服务器";
byte[] sendBuf;
sendBuf = sendStr.getBytes("utf-8");//必须转换utf8,否则安卓显示乱码
DatagramPacket sendPacket
= new DatagramPacket(sendBuf , sendBuf.length , addr , port ); ds.send(sendPacket);
//5关闭资源
ds.close(); }
}
udpRecv2.java
安卓客户端代码:
后台:
package com.simpleclientudp; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException; import android.app.Activity;
import android.os.Bundle; import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; public class MainActivity extends Activity { private EditText mEditText = null;
private TextView mTextView = null;
private Button mButton = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button)findViewById(R.id.mButton);
mEditText = (EditText)findViewById(R.id.mEditText);
mTextView = (TextView)findViewById(R.id.mTextView);
mButton.setOnClickListener(new StartSocketListener());
}
//启动按钮监听
class StartSocketListener implements OnClickListener{
@Override
public void onClick(View v) {
new ServerThread().start();
}
} class ServerThread extends Thread{
// UDP协议
@Override
public void run()
{ DatagramSocket ds=null;
try
{
//1.udpsocket服务对象,使用DatagramSocket创建,可以指明本地IP和端口
//当然也可以不指明,已测试成功
//现在仅仅指明手机端口为8888
ds = new DatagramSocket(8888); //2.获取文本框数据,将要发送的数据封装到数据包中
// 把用户输入的内容发送给server
String str= mEditText.getText().toString();
byte[] buf =str.getBytes("gbk");
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.108"),10000); //3.udp发送,使用socket服务将数据包发送出去
ds.send(dp);
/*接收数据*/
byte[] recvBuf = new byte[1024];
DatagramPacket recvPacket
= new DatagramPacket(recvBuf , recvBuf.length);
ds.receive(recvPacket);
String recvStr = new String(recvPacket.getData() , 0 ,recvPacket.getLength());
mTextView.setText("收到udp服务器: \t" + recvStr);
//4.关闭连接
//ds.close();
}
catch(UnknownHostException e) {
Log.e("UDP errror", "192.168.1.108 is unkown server!");
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
ds.close();
} catch(Exception e) {
e.printStackTrace();
}
} } } }
MainActivity.java
前台:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- 获取输入框信息并发送出去 -->
<EditText
android:id="@+id/mEditText"
android:layout_width="fill_parent"
android:layout_height="40dp"
android:cursorVisible="false"
android:editable="true" android:ems="10" >
</EditText>
<TextView
android:id="@+id/mTextView"
android:layout_width="fill_parent"
android:layout_height="50dp" android:ems="10" > </TextView>
<Button
android:id="@+id/mButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="UDP客户端---发送" /> </LinearLayout>
activity_main.xml
权限代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.simpleclientudp"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET"/> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>
permission.INTERNET
和TCP的功能类似,也是获取文本框的内容发送,并回显
所不同的是,改正了PC端显示乱码问题:
究其原因:安卓这边默认是udf-8编码的
PC端是gbk编码的,所以需要:给客户端发送前编码改为utf8,给PC端发送给编码改为gbk
安卓UDP通信2的更多相关文章
- 安卓UDP通信
功能: 实现了单次一发一收: import java.net.*; import java.io.*; public class udpRecv { /* * 创建UDP传输的接收端 * 1.建立ud ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.2
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.4.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- HP-SOCKET TCP/UDP通信框架库解析
项目概述: HP-SOCKET是一套通用TCP/UDP通信框架,包括服务器.客户端.Agent组件:其目标是提供高性能.通用性.简易性.可扩展.可定制: 鉴于此,其仅实现基本的通用框架通信.数据收发功 ...
- .Net开发笔记(十四) 基于“泵”的UDP通信(接上篇)
上一篇中说到了“泵”在编程中的作用以及一些具体用处,但没有实际demo,可能不好理解,这篇文章我分享一个UDP通信的demo,大概实现了类似“飞鸽传书”在局域网中文本消息和文件传输的功能.功能不全也不 ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
随机推荐
- ZOJ 3927 Programming Ability Test
水题,判断一下加起来是否大于等于80 #include<cstdio> #include<cstring> #include<cmath> #include< ...
- 11、手把手教你Extjs5(十一)模块界面的总体设计
上一节中设计了一些模块自定义中用到的要素,为了直观起见,这一节先建立一个模块的主界面.看过我 模块管理常规功能自定义系统的设计与实现 博客的人应该会有所了解了.一个模块的主界面是一个Grid,在其上方 ...
- onchange、oninput、onpropertyChange事件的异同
onchange事件适用于input\textarea\select元素上,支持各大浏览器,该事件只有在键盘或者鼠标操作改变对象属性,且失去焦点时触发,脚本触发无效: oninput事件适用于inpu ...
- Xcode6之后创建Pch预编译文件
在Xcode6之前,创建一个新工程xcode会在Supporting files文件夹下面自动创建一个“工程名-Prefix.pch”文件,也是一个头文件,pch头文件的内容能被项目中的其他所有源文件 ...
- mysql server的安装和配置
YSQL-5.7.9.1解压版 例如我的在D:\Program Files\MySQL\MySQL Server 5.7(解压时名字mysql-installer-community-5.7.9.1可 ...
- NPM 简单实用说明
https://nodejs.org/en/download/ 下载并按照,直接下一步就可以,最后会在C:\Program Files 新建一个nodejs文件夹,里面有一个node.exe.双击就启 ...
- console 高级用法
console.log()用法,相信大家都很熟悉了,这里就不再啰嗦. 下面来玩几个新鲜点的,我用的是chrome28,不保证兼容其他浏览器:console.log的第一个参数中可以指定一个格式字符,这 ...
- 在Spring MVC Controller的同一个方法中,根据App还是WEB返回JSON或者HTML视图。
如有高见,欢迎交流! 最近在做一个web的项目,web版已经开发完毕,现在正在进行手机APP的开发,开发中遇到一个问题: 就是web版和app版都有登录功能,本想着是分别走不同的URL,实际开发的时候 ...
- [osgEarth]osgEarth
参考:http://bbs.osgchina.org/forum.php?mod=viewthread&tid=5484&extra=page%3D1&_dsign=70b15 ...
- java_web学习(16)Ajax
Ajax Ajax(Asynchronous JavaScript and XML的缩写),允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做Ajax. Ajax:一种不用 ...