Tag: 套接字

如何限制从Socket通过ObjectInputStream读取的最大大小?

有没有办法限制从java中的ObjectInputStream读取的最大缓冲区大小? 如果很明显有问题的对象是恶意巨大的,那么我想停止反序列化。 当然,有ObjectInputStream.read(byte [] buf,int off,int len),但我不想受到分配的性能损失,比如byte [1000000]。 我在这里错过了什么吗?

如何可靠,高效地读取Java Server中Apple推送通知服务器的所有错误响应?

我正在研究Java中的Apple推送通知的服务器端开发。 我正在使用增强格式,以便检测失败的消息并重新发送跟踪错误消息的消息。 我知道Apple不保证Push Notifications的发送,但我希望能够知道Apple是否收到了我的消息以及是否包含任何错误。 我注意到当我尝试向Apple发送无效消息(无效设备令牌,太大的有效负载等等)时,我可以在套接字关闭之前发送更多消息。 当套接字关闭时,从Apple读取错误代码为时已晚,所以我不知道哪条消息是坏消息(或者即使有错误的消息,因为Apple说连接可能偶尔会关闭,即使没有错误)。 我在JavaPNs源中看到的处理此问题的方法是在发送每条消息(或消息组)后立即读取Apple的响应。 如果频繁执行则从套接字读取,并在没有任何内容可读的情况下等待超时。 如果您不经常发送推送通知,这是可以接受的。 如果您尝试以高频率发送大量通知(比方说每秒数百个),则无法在每条消息之后停止等待来自Apple的响应(即使您等待的响应时间仅为20毫秒,限制你每秒50条消息,你无法知道Apple写错误响应需要多长时间,所以短暂的等待可能还不够。 如果您在每条消息之后没有停止阅读可能的错误,那么在向Apple发送消息期间您的连接可能会被关闭,在这种情况下,您将无法获得导致连接关闭的消息的ID 。 我正在考虑的另一种方法是在单独的线程中执行读取和写入。 通过这种方式,我可以更好地从Apple获取错误消息(在连接关闭之前),而不会影响我向Apple发送消息的速度。 这种方法在编程上更复杂,并且由于我的服务器需要将APN发送到多个iOS应用程序,每个应用程序都需要自己的套接字和读取器/写入器线程,这将使我需要的线程数增加两倍。 在尝试向Apple的沙盒服务器发送推送通知时,学习了APN服务器的所有上述行为。 我不确定Apple的生产服务器的行为是否更好,我不确定在生产服务器上执行测试是个好主意。 我的问题 – 有没有办法在关闭连接之前可靠地读取Alpha的错误响应,而不会牺牲性能? 是否有可能以某种方式从服务器关闭后从套接字读取输入?

从Java套接字读取数据

我有一个Socket在某个x端口上侦听。 我可以从我的客户端应用程序将数据发送到套接字但无法从服务器套接字获得任何响应。 BufferedReader bis = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String inputLine; while ((inputLine = bis.readLine()) != null) { instr.append(inputLine); } ..此代码部分从服务器读取数据。 但除非服务器上的Socket关闭,否则我无法从服务器读取任何内容。 服务器代码不受我的控制,无法对其进行编辑。 如何从客户端代码中克服此问题。 谢谢

通过TCP / IP从Droid发送恒定速率数据流

在我学习Java / Android开发的过程中,我遇到了很多障碍。 主要是因为我对线程/进程之间的线程和通信并不是很了解。 我正在尝试将IMU数据从Android设备流式传输到计算机上的python应用程序。 每当传感器值发生变化时,传感器侦听器会将当前值保存到变量中,供网络处理程序访问。 反过来网络处理程序应该在一个计时器上运行,以33Hz的或多或少的固定速率发送值和当前时间戳(可能有点快?嗯,我愿意接受10Hz的慢速,但是不比那慢)。 无论如何,当我测试这个时,我可以在计算机界面上看到数据几乎没有以每秒30的稳定速度进入,而是出现激增,有时甚至根本不会出现,并且整体累积相当延迟(即值越晚,它们进入的延迟越多)。 我知道网络中可能存在一些差异和一些滞后,但我至少会喜欢总体速度至少是正确的,即它不会变得越来越糟,我发送的时间越长。 考虑到这些设备都在一个普通的wifi网络上,并且我能够在没有任何延迟的情况下通过wifi传输1080pvideo,我相信该协议应该能够每30ms处理一个64字节的字符串而不会出现麻烦。 为了消除传感器读取器作为问题源,我做了一个最小的工作示例,它每30ms只发送一个字符串,没有任何传感器读数。 我基本上从各种stackoverflowpost中获取了这些代码,并对其进行了修改,直到它或多或少做了我想要的。 问题是网络接口在AsynchronousTask中运行,我不确定如何在启动后访问它。 我的理论是,浪费资源为每个新数据包打开一个新套接字,但我不确定如何在后台打开套接字,然后在计时器上将值传递给它并告诉它发送。 这是我测试这个的基本活动: package com.jamesdoesntlikejava.motionlearning15; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import java.util.Timer; import java.util.TimerTask; public class SendValuesActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_send_values); // creating timer task, timer final Timer timer = new […]

Java套接字 – 发送对象并将对象分发到所有已连接的客户端

所以在这里,我是一个3D游戏,效果很棒…… 但是,我希望让它成为多人游戏。 我对套接字很新,所以我不完全了解如何使用它们,更具体地说,如何将对象从客户端发送到服务器,然后将该对象分发给所有其他客户端。 这是我发送的对象: public class Vector3f{ int x, y, z; public Vector3f(int x, int y, int z){ this.x = x; this.y = y; this.z = z; } } (这是为了玩家的位置)客户端类将创建一个新的Socket,只是我的本地IP和端口1500(例如),而服务器将创建服务器套接字到端口1500(显然)。 我只想知道如何将这个对象发送到服务器(或主机),然后服务器编辑该对象以获得不同的值,然后将其发回。 例如: 在Client类中,类似于: Vector3f origionalpos = new Vector3f(0,0,0); System.out.println(“x: “+origionalpos.x+” y: “+origionalpos.y+” z: “+origionalpos.z); ObjectOutputStream.writeObject(origionalpos); 然后服务器会收到这个,并在发回之前修改对象,如下所示: Vector3f obj = ObjectRecievedFromClient; obj.x+=10; obj.y+=10 obj.z+=10 ObjectOutputStream.writeObject(obj); //here […]

通过Java中的socket发送打印机命令

我正在尝试通过套接字向卡片打印机发送命令,但我无法使其正常工作。 现在,我有一个用PHP开发的程序,它正在运行,但我需要让它在Java中运行。 PHP中的程序是这样的: $ESC = chr(27); //Ascii character for Escape $CR = chr(13); // Ascii character for Carriage Return $cmd = $ESC . $command . $CR; socket_send($socket, $cmd, strlen($cmd), 0); socket_recv($socket, $respuesta, strlen($respuesta), 0); 在Java中,我正在做这样的事情 char ESC = (char)27; //Ascii character for Escape char CR = (char) 13; //Ascii character for Carriage Return ////////////// Socket […]

Android自动搜索服务器

我有一个Android应用程序(通过网络)与桌面服务器应用程序(基于Java和GUI编程)进行通信。 现在要测试,我只是有一种方法来指定Android手机上的套接字。 但是,将来当我发布应用程序时,我希望它能够尝试自己连接到服务器。 到目前为止,我所获得的一些想法是获取手机的IP地址,然后在同一端口上循环通过C类地址空间,并查看是否有任何这些套接字连接。 你们有什么别的建议吗? 此外,在Android中获取手机IP地址的最佳方法是什么? 我有办法,但它只适用于Android 2.3及更低……在ICS上它完全失败并给出随机乱码。 这里是: public String getLocalIpAddress() { try { for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } } } } catch (Exception ex) { } return null; }

两个媒体播放器对象不同时播放同步歌曲

我正在研究一个Android应用程序。这个应用程序的正常概念是在同一时间播放多个设备中的歌曲。一切都已完成但是歌曲不是同步播放。我已经做了大量的研发来解决这个问题,但没有取得成功但最后我发现了一个Android Media Player问题。为了找到这个问题,我做了一个演示Application.Description如下。 演示应用说明 我创建了一个Android媒体播放器firstPlayer和secondPlayer.firstPlayer的两个对象。一旦App是Lunch,就会开始播放歌曲。现在我在test.xml中使用了一个Button.once用户将点击此按钮secondPlayer启动并播放相同的音乐我在firstPlayer中设置。我也在第一个播放器播放的位置寻找secondPlayer。 码 changePlayer = (Button) findViewById(R.id.changePlayer); String fileName = “/qq.mp3”; String baseDir = Environment.getExternalStorageDirectory() + “/Test App” + fileName; Log.e(TAG, “path :” + baseDir); try { firstPlayer = new MediaPlayer(); secondPlayer = new MediaPlayer(); firstPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); secondPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); firstPlayer.setDataSource(baseDir); secondPlayer.setDataSource(baseDir); firstPlayer.prepare(); secondPlayer.prepare(); firstPlayer.start(); } catch (IOException e) { e.printStackTrace(); } changePlayer.setOnClickListener(new View.OnClickListener() { […]

服务器检测到客户端从套接字丢失连接

在Java中,如果我通过套接字连接到客户端到服务器并且客户端有exception导致它崩溃,那么服务器是否有任何方法可以检测到套接字连接丢失。 我假设一种方法会对客户端进行某种心跳轮询,但是有更简单/更简单的方法吗?

如何在阻塞模式NIO中实现超时?

我没有使用任何选择器或类似的东西。 我只是一个简单的ServerSocketChannel监听和一个SocketChannel在阻塞模式下连接到它。 我想在连接上施加超时,但SocketChannel.socket().setSoTimeout()不起作用。 我尝试让后台线程hibernate30秒并检查变量是否仍为null (因为它将阻止等待读入该变量)但我无法正确同步变量,因为我无法访问我的局部变量匿名课。 还有其他方法可以实现这一目标吗? 更新:我说错了我的问题。 我还希望读取操作以及连接本身超时。