Articles of tcp

使用android低级api解码H264流媒体

我在android中使用MediaCodec低级别Api来解​​码从IP CAMERA收到的h264原始流。 来自IP摄像机的原始流,在TCP / IP连接上接收。 要解码流,我的代码是: @Override protected void onCreate(Bundle savedInstanceState) { MediaCodec mCodecc; MediaFormat mFormat; BufferInfo mInfo; ByteBuffer[] inputBuffers ; ByteBuffer[] outputBuffers ; } protected void Init_Codec() { mCodecc = MediaCodec.createDecoderByType(“video/avc”); mFormat = MediaFormat.createVideoFormat(“video/avc”, width, height); mInfo = new BufferInfo(); mFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar); mCodecc.configure(mFormat, holder.getSurface(), null,0); } protected void Start_Codec() { mCodecc.start(); inputBuffers = mCodecc.getInputBuffers(); outputBuffers […]

为什么DefaultHttpClient通过半封闭套接字发送数据?

我在Android(2.3.x)上使用DefaultHttpClient和ThreadSafeClientConnManager将HTTP请求发送到我的REST服务器(嵌入式Jetty)。 在大约200秒的空闲时间后,服务器用[FIN]关闭TCP连接。 Android客户端以[ACK]响应。 这应该并确实使套接字处于半闭状态(服务器仍在监听,但无法发送数据)。 我希望当客户端再次尝试使用该连接时(通过HttpClient.execute ), DefaultHttpClient将检测半关闭状态,关闭客户端的套接字(从而发送它的[FIN / ACK]以完成关闭) ,并为请求打开一个新连接。 但是,有一点问题。 相反,它通过半封闭套接字发送新的HTTP请求。 只有在发送后才检测到半关闭状态,并且套接字在客户端关闭([FIN]发送到服务器)。 当然,服务器无法响应请求(它已经发送了它的[FIN]),因此客户端认为请求失败并通过新的套接字/连接自动重试。 最终结果是服务器查看并处理请求的两个副本。 有想法该怎么解决这个吗? (我的服务器使用第二个副本执行了正确的操作,但我很恼火有效负载会被传输两次。) DefaultHttpClient在第一次尝试写入新的HTTP数据包时,是否应该检测到套接字已关闭,请立即关闭该套接字并启动一个新的套接字? 在服务器发送[FIN]后几分钟内,如何在套接字上发送新的HTTP请求,我感到很困惑。

无法通过TCP / IP连接Android ADB

我正试图让Android Debug Bridge从我的64位Windows 7台式电脑上运行到我的Nexus10。 我通过USB连接设备,然后我按照“ 如何通过TCP连接到Android与ADB?” ,但我最终得到一条无法连接的错误消息: C:\adt-bundle\sdk\platform-tools>adb usb restarting in USB mode C:\adt-bundle\sdk\platform-tools>adb devices -l List of devices attached R32D300NXJV device product:mantaray model:Nexus_10 device:manta C:\adt-bundle\sdk\platform-tools>adb tcpip 5555 restarting in TCP mode port: 5555 C:\adt-bundle\sdk\platform-tools>adb connect 192.168.231.2 unable to connect to 192.168.231.2:5555 为了开始调试,我尝试从台式计算机上ping Nexus10。 两台设备通过台式计算机连接到同一路由器,通过电缆连接到Nexus10,无线连接。 但是,我得到了 C:\adt-bundle\sdk\platform-tools>ping 192.168.231.2 Pinging 192.168.231.2 with 32 bytes of data: […]

在Java / Android中更快地检测到损坏的套接字

背景 我的应用程序从手机收集数据并将其发送到远程服务器。 数据首先存储在内存中(或者当文件足够大时存储在文件中),每隔X秒左右,应用程序就会刷新该数据并将其发送到服务器。 关键是每一条数据都成功发送,我宁愿发送两次数据而不是发送数据。 问题 作为测试,我将应用程序设置为每5秒发送一个带有时间戳的数据,这意味着服务器上每5秒钟会出现一个新行。 如果我杀了服务器,我希望线路停止,现在应该将它们写入内存。 当我再次启用服务器时,我应该能够确认没有丢失任何事件。 然而问题是当我杀死服务器时,IO操作开始失败大约需要20秒,这意味着在这20秒内,应用程序会愉快地发送事件并将其从内存中删除,但它们永远不会到达服务器并永远丢失。 我需要一种方法来确保数据实际到达服务器。 这可能是最基本的TCP问题之一,但不是更少,我还没有find任何解决方案。 东西我试过了 设置Socket.setTcpNoDelay(true) 删除所有缓冲的编写器,直接使用OutputStream 每次发送后刷新流 附加信息 我无法改变服务器的响应方式,这意味着我无法告诉服务器确认数据(不仅仅是TCP的机制),服务器只是默默接受数据而不发回任何内容。 代码片段 课程初始化: socket = new Socket(host, port); socket.setTcpNoDelay(true); 数据发送的位置: while(!dataList.isEmpty()) { String data = dataList.removeFirst(); inMemoryCount -= data.length(); try { OutputStream os = socket.getOutputStream(); os.write(data.getBytes()); os.flush(); } catch(IOException e) { inMemoryCount += data.length(); dataList.addFirst(data); socket = null; return […]

通过套接字查看Web服务器。 。 。

目前,我支持具有以下架构的客户端,用于工业制造过程: 他们在PC上运行Windows程序来控制工业机械。 他们有一个专有的应用程序(我为他们维护)在Android设备(基本上是手机)上运行,通过TCP套接字与PC软件无线连接,因此它可以远程控制这些工业流程。 客户现在想要的是在PC上运行的Web服务器和内置于应用程序中的Web浏览器,以控制一些不受其Windows程序控制的其他进程。 我在PC上设置了一个WAMP服务器和一个示例网页,我可以在PC上的任何浏览器上看到它作为“localhost”。 我知道如何通过WebView类将Web浏览器视图添加到Android应用程序。 但我不知道如何让手机上的浏览器通过TCP连接看到PC上的WAMP服务器。 我如何将这两件事挂钩?

无法在Android上使用ServerSocket

我正在尝试在Android设备上使用ServerSocket侦听端口。 我希望能够使用同一网络上的计算机通过WiFi连接到此端口。 将它绑定到端口时我没有exception,但是当我检查netstat时它说: Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 (null):4040 (null):* LISTEN 我已经尝试了无数种方法将它绑定到localhost,0.0.0.0,设备的WiFi LAN IP地址与SocketInetAddress和InetAddress.getByName 。 似乎没什么用。 当我尝试从同一个WiFi中的计算机连接到端口时(我已尝试过netcat和Java的Socket.connect() ),我在Wireshark中看到的只是一个ARP请求: Who has [phone’s LAN address]? Tell [computer LAN address]. 此请求会重复,直到超时。 我尝试了相反的方法,通过在计算机上设置ServerSocket并从手机连接到该端口,这非常有效。 我的测试手机是带有自定义ROM的三星Spica i5700。 有任何想法吗? 编辑:代码很简单,如下所示: ServerSocket server = new ServerSocket(); server.setReuseAddr(true); server.setTimeout(0); server.bind(new InetSocketAddress(4040)); Socket client = null; while((client = server.accept()) […]

Android TCP连接最佳实践

我正在开发一个需要TCP连接到TCP服务器的Android应用程序(以Node.js编写) 我的Android TCP客户端正在工作,可以来回发送消息。 我的特定问题是: 在Android中处理与服务器的TCP连接的最佳方法是什么? 如何维护连接(在onDestroy()等上正确关闭连接)? 有什么方法然后使用AsyncTask(除了普通的Thread类,Android 4.0中不允许) 我在AsyncTask中有我的套接字连接,如下所示: @Override protected Void doInBackground(Void… params) { try { Log.d(“TCP_MESSAGE”, “Connecting…”); socket = new Socket(MY_LOCAL_IP, 8080); dataOutput = new DataOutputStream(socket.getOutputStream()); inputstream = new InputStreamReader(socket.getInputStream()); input = new BufferedReader(inputstream); while (!canceled) { String message = input.readLine(); handleMessage(message); } } catch (Exception e) { e.printStackTrace(); } } return null; […]

从Android(作为客户端)发送TCP数据 – 没有数据被发送?

我正在尝试通过TCP将数据从我的Android应用程序发送到我的PC。 代码如下: Socket socket = new Socket(“10.0.78.75”, 50505); OutputStream out = socket.getOutputStream(); PrintWriter output = new PrintWriter(out); mStatusText.setText(“Sending Data to PC”); output.println(“Hello from Android”); mStatusText.setText(“Data sent to PC”); socket.close(); mStatusText.setText(“Socket closed”); 这样做时我没有任何错误,但是,服务器应用程序(用C#编写)不会获得任何数据。 它看到客户端连接到它,并看到数据正在发送,但是,数据字符串是空的…并且想到为什么会发生这种情况? PS:服务器代码从以下站点复制,并已使用C#TCP客户端进行测试。 http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server

如何无限期建立TCP连接?

我需要无限期地建立TCP连接(尽可能)。 不是自己的服务器,所以我们不能改变它的工作方式。 此服务器每分钟都需要一些ping才能知道连接是否存在。 如果服务器在几分钟(少于五分钟)后没有收到ping,则会关闭连接和会话。 通过这种方式,我需要维护与服务器的TCP连接,并能够在指定的时间段发送ping。 目前我的Android服务标志为“正在进行”,因此Android不应该杀死它(至少通过正常程序)。 Android服务似乎运行良好,ping定期发送。 然而,当服务在移动电话(而不是模拟器)上运行并且它变得空闲时,android似乎在CPUhibernate时冻结服务,因此TimerTask发送ping停止工作并且连接断开。 我试图通过部分唤醒锁来锁定手机进入睡眠状态,它解决了问题,但手机耗电太多,这是不可行的。 我注意到AlarmManager可以帮助完成这项任务,所以我想安排一个警报来更新正在运行的服务,然后发送ping。 这将使CPU进入hibernate状态并发送ping。 但每分钟安排一个警报可能也是如此耗费电量? 我目前还没有测试过这种方法,但是可行吗? 是否有更好的方法来保持这种TCP连接? 像Gmail这样的Android服务如何解决这类问题?

Android模拟器如何在eclipse中联系主机开发机器?

我有一个正常的简单java程序作为服务器运行,等待客户端与TCP连接。 在另一个eclipse项目中,我正在构建一个Android应用程序。 该应用程序必须联系主机上运行的java程序以接收消息。 我不能简单地使用“localhost”联系服务器,因为仿真器在虚拟路由器后运行,我将访问“电话”的网络而不是主机的网络。 那么,我应该使用什么ip来联系主机开发机器? 该机器是在VirtualBox上运行的Linux,其Ip为10.0.0.5。 我试图在模拟器上使用该ip,但即便如此,我也无法建立连接。