Articles of 套接字

DataOutputStream和ObjectOutputStream之间有什么区别?

我正在学习Java中的套接字编程。 我见过客户端/服务器应用程序示例,有些使用DataOutputStream ,有些使用ObjectOutputStream 。 两者有什么区别? 是否存在性能差异?

Android java.net.SocketException:套接字失败:EACCES(权限被拒绝)

嗨伙计们我得到了一个Android应用程序,但是当我启动它时,我的控制台出错了。 我正在使用Datagram套接字创建连接,我使用2个类: MainActivity (它是应用程序的主要活动)和UdpClientServer来创建连接。 这里的代码MainActivity: public class MainActivity extends Activity { private UdpClientServer cu; private EditText textIpScheda; private EditText textUdpPort; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textIpScheda = (EditText) findViewById(R.id.textIpScheda); textUdpPort = (EditText) findViewById(R.id.textUdpPort); try { cu = new UdpClientServer(this); } catch (IOException e) { e.printStackTrace(); } } public EditText getTextIpScheda(){ return textIpScheda; […]

Android上通过TCP套接字传输音频

我通过套接字从C服务器传输麦克风输入。 我知道流是有效的,因为它与C客户端有关,我在Android客户端上获得了正确的值。 我正在播放1024 flatarray。 一个浮点数是4个字节。 所以我得到了一个每帧4096字节的传入流。 我从这个字节中获取浮点数,我知道这些浮点数是我发送的,所以该部分应该工作。 现在我希望使用AudioTrack将该流直接传送到手机扬声器。 我试着输入我直接收到的字节:只是噪音。 我试着将它强制转换为字节数组,仍然是相同的。 我试图将那个浮点数转换为简短(因为AudioTrack占用字节或短)。 我可以得到一些可能是我的麦克风输入(敲门),但非常沙哑,而且非常迟钝。 我会理解帧之间是否存在延迟,但我甚至无法得到一个清晰的声音。 然而,我可以清楚地输出一个我本地产生的声音,然后放入那个短小的声音。 现在我想知道我的代码中是否有一些问题你可以看到,因为我没有看到它们。 我正在做的是:我在一个字节数组中放入4个字节。 我把浮子拿出来了。 一旦我在我的浮动数组中得到一个帧(我用bool控制它,不好,但它应该工作)我把它放在我的短片中,让audiotrack播放它。 这种双重演员可能会很慢,但我这样做是因为它是我最接近实际输入的。 编辑:我通过比较浮点数来检查结束,它们具有介于-1和1之间的正确值,并且与我发送的值相同。 由于我在转换为浮动时不改变endianess,我不明白为什么直接将4096字节数组转发到AudioTrack也不起作用。 multithreading可能有问题,但我不知道它可能是什么。 编辑2:我发现了一个小问题 – 我在1023重置了j。但是那个丢失的浮点数应该不是问题。 除了那个之外我做的是将从套接字中获取流的方法放在另一个线程中,而不是在异步任务中调用它。 这使它工作,我现在能够理解麦克风的声音。 质量仍然很差 – 代码中可能有这样的原因吗? 我也有大约10秒的延迟。 只有大约半秒钟是由WLAN引起的,所以我想知道它是否可能是代码故障。 任何进一步的想法表示赞赏 编辑3:我玩了代码并在评论中实现了一些greenapps的想法。 使用新的线程结构,我遇到了没有声音的问题。 像一样。 我不知道怎么可能,所以我换回来了。 我试图让线程更轻量级的其他东西没有任何影响。 我有一个延迟,我的质量很差(我可以识别敲门声,但我无法理解声音)。 我认为我的转换可能有问题,所以我把我从套接字收到的字节直接放在AudioTrack中 – 只有丑陋的脉冲静态噪音。 现在我更加困惑,因为这个确切的流仍然适用于C客户端。 如果我find解决方案,我会报告,但仍然欢迎任何帮助。 编辑4我应该添加,我可以从另一个Android应用程序播放麦克风输入,我直接将该输入作为字节发送(我将排除浮动投射的东西,并将我直接接收的字节放入我的播放器代码中的audioTrack)。 它也发生在我身上,这可能是一个问题,由C服务器流式传输的所述floatarray来自64位机器,而手机是32位。 这可能是一个问题,即使我只是将浮动数据传输为4个字节? 或者,我的另一个想法:我收到的字节的基础数字格式是浮点数。 AudioTrack期望什么格式? 即使只放入字节 – 我是否需要将该浮点数转换为int并将其转换回字节或其他内容? 新代码: public class […]

两个Android手机之间的实时video流

我目前正在研究两款Android手机之间的video流。 我写了一个能够将video录制到sd文件的应用程序(使用MediaRecorder); 我写了另一个能够显示文件video的应用程序。 这两个应用程序都完美 我在以下网站find了一个关于“用Android播放video – 无需写入本地文件”的网站。 这正是我想要做的。 http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system 我修改了我的代码。 对于录像机,它是: socket=severSocket.accept(); ParcelFileDescriptor=pfd; recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); recorder.setVideoFrameRate(15); recorder.setVideoSize(320, 240); recorder.setPreviewDisplay(holder.getSurface()); pfd = ParcelFileDescriptor.fromSocket(socket); recorder.setOutputFile(pfd.getFileDescriptor()); recorder.prepare(); recorder.start(); 对于video播放器: Socket socket = new Socket(IP,PORT); mMediaPlayer = new MediaPlayer(); pfd = ParcelFileDescriptor.fromSocket(socket); mMediaPlayer.setDataSource(pfd.getFileDescriptor()); // <– here is the problem mMediaPlayer.setDisplay(holder); mMediaPlayer.prepare(); mMediaPlayer.setOnBufferingUpdateListener(this); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.setOnVideoSizeChangedListener(this); mMediaPlayer.start(); […]

Android服务器套接字

我无法通过桌面上的程序访问模拟器上的Android Server,如何解决? 一些代码(从如何findAndroid设备的局域网IP地址? ): public static ArrayList getSelfIP(){ try { ArrayList ipList = new ArrayList(); 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()) { ipList.add(inetAddress.getHostAddress().toString()); } } } return ipList; } catch (SocketException ex) {} return null; } 结果是[fe80::5054:ff:fe12:3456%eth0, […]

读取输入流时出错:软件在java服务器中导致连接中止

我基本上是想在Android设备上托管服务器。 客户端设备通过TCP连接到服务器并发送请求。 服务器执行客户端请求的操作,然后将数据写回套接字。 连接未被服务器终止,并且将通过套接字连续读取请求并回复。 注意:每个请求消息的前4个字节包含实际消息/请求的长度。 parseXmlInputAndExecuteCmd函数根据输入XML字符串的内容执行各种异步操作。 这最终会导致’allowResponse’variables的布尔值更改为true,并生成某个响应,该响应存储在名为’response’的Stringtypes的variables中。 一旦布尔值’allowResponse’变为true,线程就会恢复执行并将响应写回套接字的OutputStream 其中一些异步操作包括连接和断开与公司VPN的连接。 这可能是错误的原因吗? 使用的一些类级variables是: private volatile boolean allowResponse = false; private String response; 服务器代码: private void startServer() { try { ServerSocket serverSocket = new ServerSocket(8080); while (true) { Socket connectionSocket = serverSocket.accept(); BufferedInputStream bufInpStream = new BufferedInputStream(connectionSocket.getInputStream()); BufferedOutputStream bufOutStream = new BufferedOutputStream(connectionSocket.getOutputStream()); ByteArrayOutputStream contentLengthBaos = new ByteArrayOutputStream(); int […]

Android Socket.IO保持连接活动的最佳实践

我的Android应用程序使用AndroidAsync库连接到带有Socket.IO客户端的Node.js服务器。 套接字客户端是通过服务建立的。 应用程序打开时,套接字需要保持打开/连接状态 应用程序未打开时,套接字可以关闭 有一个例外,当应用程序未打开时,套接字需要保持打开状态 我目前正在onResume启动Socket.IO服务,并停止应用程序中每个Activity onPause 。 这似乎效率很低,因为我每次按下主页按钮或切换到应用程序中的其他活动时,基本上都会停止套接字并重新创建一个新套接字。 关于保持套接字打开的上述要求的最佳方法是什么? public class SocketIOService extends Service { private Preferences prefs; private SocketIOClient socket; @Override public int onStartCommand(Intent intent, int flags, int startId) { try { ConnectCallback callback = new ConnectCallback() { @Override public void onConnectCompleted(Exception ex, SocketIOClient client) { if (ex != null) { ex.printStackTrace(); return; […]

当有数据可用于在socket中读取时,android中是否有任何回调机制

好吧,我熟悉c,iOS环境下的套接字编程。但现在尝试通过套接字连接我的android和我的远程服务器……作为一个启动,我在C中编写了一个简单的服务器程序并在我的桌面上运行它耐心地等待连接请求,接受连接,然后等待一些请求字符串,并在获取请求字符串时返回一些响应字符串,然后再次等待下一个请求然后继续..你明白了… 至今 我已经与我的android和服务器建立了连接 发送和接收数据 这是我的客户端代码.. public class SocketMaster { private Socket clientSocket = null; BufferedReader socketReadStream = null; public boolean connectToHost(String ip, int port){ try { InetAddress serverAddr = InetAddress.getByName(ip); try { clientSocket = new Socket(serverAddr, port); socketReadStream = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String line = null; String stringToSend = “This is from client …Are you […]

连接到String上具有蓝牙地址的设备

我正在做一个Android应用程序,我将另一个设备的MAC作为一个字符串(长度为17个字符),并且需要使用那个以连接到该设备(启动蓝牙连接的线程)。 我整个下午一直在玩它,无法弄清楚如何做到这一点。 问题是它不允许我将BluetoothDevice设置为等于字符串。 有没有办法可以/必须这样做? (决定不把我的任何尝试作为代码,看看它们是如何充满错​​误的) 它必须与运行完全相同的应用程序的另一台平板电脑通信。 我之前浏览了这个页面,我的大部分应用都基于此。 我的主要问题是使用ConnectThread示例时, 我有一个MAC地址字符串,如何连接到该MAC? 任何帮助将受到高度赞赏,

通过互联网进行Android P2P(直接连接)(NAT后面)

我正在开始一个小型项目,基本上是经典战舰游戏的多人游戏(与超过两个玩家一样)。 在我深入编码之前,我试图解决的一个问题是多个玩家之间的沟通问题。 当前的可能性是使用中央HTTP服务器作为通信的中央集线器(与Android C2DM API结合以允许从HTTP服务器到设备的推送通信)。 这似乎是一个很好的解决方案,因为从理论上讲,只要您可以访问Internet,它就应该可以正常工作,无论您是否支持NAT。 然而,所提出的解决方案具有存在一个单点故障/额外负载(网络服务器)的缺点。 所以我想尝试其他选择。 我想过在客户端之间使用套接字建立直接连接(网络服务器只是用作初始会合点),但是这只有在所有设备都在同一网络中时才能正常工作。 考虑到今天我们几乎总是落后于路由器的NAT,我怎样才能实现直接通信? 我一直在阅读有关打孔的内容,但我找不到任何有良好记录的好文库(包含很好的使用示例),并且肯定适用于Android。 大多数(如果不是全部)打孔技术(STUN,ICE等等)广泛使用只适用于UDP,这对于音频/video以及可能丢失一些消息的实时多人游戏很好,但对于多人转向基于游戏的重要一点是保证每个回合的数据传递(这是不可能直接用UDP进行的)。 那么任何想法如何在NAT后面的Android设备之间实现可靠的打孔(最好通过TCP)? 它不必在100%的情况下工作(可能不支持某些陌生人的NAT)但如果它适用于大多数情况会很好。