UPD和TCP

TCP:Transmission Control
Protocol 传输控制协议

UDP 是User Datagram
Protocol 用户数据包协议

项目中遇到一个需求,需要在IPhone或者Android手机设备模拟手柄,在屏幕上绘制手柄按键、摇杆甚至鼠标等,然后通过WIFI和安卓电视的服务端连接起来,实现电视上的游戏和手机的上行、下行数据通路。

采取的做法是手机端发送UDP广播,电视UDP服务端收到后通过UDP单点通信,返回信息给手机端。手机端再和服务端创建TCP连接。

代码片段:

private static final String MULTICASTHOST = "239.255.255.255";
private static final int PORT = 5858;

private static final String CLIENT_SOCKET_TYPE_NORMAL = "normal";
private static final String CLIENT_SOCKET_TYPE_CLOSE = "close";


/**
* UDP server
* @author siyuan
*
*/
private class UDPMulticastServer implements Runnable {
private MulticastSocket multicastSocket;
private InetAddress receiveAddress;

public UDPMulticastServer() {
try {
multicastSocket = new MulticastSocket(PORT);
receiveAddress = InetAddress.getByName(MULTICASTHOST);
multicastSocket.joinGroup(receiveAddress);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void run() {
byte buf[] = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, 1024);
while (true) {
try {
multicastSocket.receive(dp);
String info = new String(buf, 0, dp.getLength());
// 1、判断非自己的IP,则是服务端IP
printLog("接收: " + dp.getAddress());
parseData(dp, info);
} catch (Exception e) {
e.printStackTrace();
multicastSocket.close();
}
}
}
}


/**
* UDP 点对点

* @param message
*/
private void sendUDPP2PMessage (String message) {
try {
InetAddress serverAddr = InetAddress.getByName(remoteIPAddress);
DatagramSocket socket = new DatagramSocket();
byte[] buf = message.getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length,
serverAddr, PORT);
socket.send(packet);
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}


/**
* tcp 服务端
* @author siyuan
*
*/
private class TCPServer implements Runnable {
private boolean isTCPSocketConnecting = false;
private int lastButtonValue = 0;

@Override
public void run() {
byte buf[] = new byte[1024];
ServerSocket serverSocket = null;
Socket socket = null;
try {
serverSocket = new ServerSocket(PORT);
while (true) {
socket = serverSocket.accept();
// 等待客户端连接
printLog("serverSocket wait");
isTCPSocketConnecting = true;

while(isTCPSocketConnecting) {
InputStream inputStream = socket.getInputStream();
inputStream.read(buf);
String info = new String(buf, "utf-8");

String[] data = info.split("=");

JSONObject requestJO = null;
try {
requestJO = new JSONObject(data[1]);
} catch (JSONException e) {
e.printStackTrace();
}

if(requestJO != null) {
if(CLIENT_SOCKET_TYPE_NORMAL.equals(requestJO.opt("status"))) {
if(data[1].contains("button")) {
//按钮
parseKeyEvent(requestJO);
} else if(data[1].contains("motion")) {
//摇杆
parseMotionEvent(requestJO);
}
} else if(CLIENT_SOCKET_TYPE_CLOSE.equals(requestJO.opt("status"))) {
isTCPSocketConnecting = false;
continue;
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
serverSocket.close();

isTCPSocketConnecting = false;
} catch (IOException e) {
e.printStackTrace();
}
}
}


/**
* tcp 点对点通信
* @param message
*/
private void sendTCPMessage(String message) {
Socket socket = null;
try { //TCP服务器IP地址
InetAddress serverAddr = InetAddress.getByName(remoteIPAddress);
socket = new Socket(serverAddr, PORT);
PrintWriter out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream())),true);
out.println(message);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

UPD和TCP,布布扣,bubuko.com

时间: 2024-10-14 23:32:07

UPD和TCP的相关文章

python3.x——socket初步

python3.x,socket. 网络请求的本质是socket,俗称套接字. 以udp为例,通俗来讲时,包括五个流程: 客户端: 1 # 通信的五个步骤 2 3 from socket import * 4 5 # 1.选择通信方式 6 udpSocket = socket(AF_INET, SOCK_DGRAM) 7 # 2.对方通信地址 8 sendAddr = ("192.168.10.198", 8080) 9 # 3.写入数据 10 sendData = bytes(inp

Snmp学习总结(七)——SNMP4J介绍

一.SNMP4J介绍 SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应.SNMP4J是纯面向对象设计与SNMP++(用C++实现SNMPv1/v2c/v3)相类似. SNMP4J API 提供以下下特性: 支持MD5和SHA验证,DES,3DES,AES128.AES192和AES256加密的SNMPv3. 支持MPv1,MPv2C和MPv3,带执行的可阻塞的信息处理模块. 全部PDU格式. 可阻塞的传输拓扑.支持UPD.TCP.T

android 发送UDP广播,搜寻服务器建立socket链接

应用场景:客户端(手机,pc)需要搜寻所在局域网内的服务器并获得服务器地址. 方法简介:客户端发送UDP广播,服务收到广播后得到客户端ip地址,然后向客户端发送一次socket链接,客户端收到socket链接,获得服务器地址. 相关知识: UPD.TCP.TCP是面向链接的,可靠的通信方式.UDP是面向非链接的通讯方式.TCP的建立比较麻烦,要经过"三次握手".而UDP的建立比较简单,发送方只管把内容发送出去,不管接收方是否收到.UDP的传输分为:单播,多播,广播.其中,多播和广播是通

java UDP传输详解

UDP传输是一个面向无连接的传输方式,什么叫无连接呢,简单点说呢就是不管你在不在线,我都发数据给你,像那个电影里警察拿的那个呼叫用的就这这个原理 还有以前的QQ聊天也是,现在2013版的可以选择是UPD还是TCP,好了不多说,上点代码玩一下 分析:通过udp传输方式,将一段数据发送出去 思路: 1,建议udpsocket服务 2,提供数据,并将数据封装到数据包中 3,通过socket服务的发送功能,讲数据包发送出去. 4,关闭资源 牢记思路,代码哪里都有 package com.szc02; i

SNMP4J与ObjectSNMP对比分析之我见

SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应.Object SNMP是一个面向对象的SNMP开发组件,与关系数据库流行的O-R Mapping技术类似,实现了Object到SNMP MIB的操作映射(简称O-M Mapping).使用SNMP4J与ObjectSNMP开发类似于使用原生JDBC开发与Hibernate框架. SNMP4J介绍 SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命

基于linux7的ectd安装与部署

系统环境 iostat Linux 3.10.0-693.17.1.el7.x86_64 (swarm1) 2018年03月28日 _x86_64_ (2 CPU) cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) getenforce Disabled etcd简介etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库.etcd内部采用raft协议作为一致

haproxy在线管理与维护分享

相比于nginx负载均衡,haproxy有一个很好用的功能,就是可以动态的维护后端的server,而不必重启整个服务.完成这项功能需要使用到haproxy socket和socat. 1. haproxy sock 开启haproxy unix socket 在配置文件的global选项里添加: #vim /etc/haproxy/haproxy.cfg stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin stats t

干货:如何实现RTSP推送H.264、RTSP推送H.265(hevc)

rtsp推送相关的资料和测试软件比较少,本文介绍rtsp推送相关信令和测试效果: 1. rtsp推送流程. 主要分两部分:第一部分先发送信令:第二部分发送rtp包. ?信令流程: ?1.1?先发送OPTIONS, OPTIONS比较常用,就不做详细说明了. 1.2 发送ANNOUNCE, 发送ANNOUNCE主要是把要推送的音视频信息通过sdp格式传给服务器.关于sdp信息如何构造,对于h264请参考rfc6184. h265请参考rfc7798. 下面举两个例子. h264+aac ANNOU

高薪岗位云计算面试题,云计算运维工程师必备

云计算产业市场规模快速增长,人才需求数量激增.相关云计算企业加大对核心技术的投入,提高对客户的服务,无论从技术层面,运营商层面还是集成与服务提供层面,人才需求巨大.下面给大家分享高薪岗位云计算面试题,云计算运维工程师必备好好收藏吧. 1.osi七层参考模型有哪些? 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.udp协议工作在哪一层?ping工作在哪一层? UDP工作在传输层 ping 工作在网络层 3.linux系统中用于检测通信的命令有哪些?(四个以上) ping trac