Articles of 套接字

无法在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()) […]

为什么我的服务总是绑定到ipv6 localhost而不是ipv4?

我有一个服务,创建一个ServerSocket并绑定到localhost:7060 。 当我在我的Android设备上执行“netstat -an”时,我发现它使用的是ipV6 localhost而不是ipv4 localhost接口。 输出是这样的: tcp6 0 0 :: ffff:127.0.0.1:7060 ::: * LISTEN 使用ipV4的端口如下所示: tcp 0 0 127.0.0.1:5060 0.0.0.0:* LISTEN 迫使它总是使用IPv4的诀窍是什么? 我正在使用iptables设置端口转发规则。 我的版本支持ipv4目标地址。 这就是我如何创建用于侦听端口的Java代码。 InetAddress localAddress = Inet4Address.getByName(“localhost”); //InetAddress localAddress = Inet4Address.getLocalHost(); sockServer = new ServerSocket(nPort, 20, localAddress); 我遵循其他建议,比如设置系统属性,在我的服务启动时更喜欢ipV4。 这没有任何区别。 System.setProperty(“java.net.preferIPv4Stack”, “true”); 我是在为嵌入式设备构建的Android 2.3上运行的。 更新:我检查了android树中的InetAddress.java源代码。 它正在读取上面的标志,如下所示。 static boolean preferIPv6Addresses() { String propertyName = […]

Java中的Android和IPv6

我正在开发一个Android应用程序,我需要使用IPv6连接到服务器。 在手机上启用了IPv6,我可以通过ip addr查看我的本地IPv6地址。 我也可以成功从PC上ping6我的手机,反之亦然。 但是,我试图通过Java命令NetworkInterface.getNetworkInterfaces()获取Android上的本地地址我只获得IPv4地址。 我也尝试打开一个客户端套接字,但行Socket s = new Socket(MYSERVERIPV6ADDRESS, PORT); 总是抛出java.net.SocketException: Invalid argument 。 我确信地址是正确的,因为我在我的计算机上尝试使用相同的代码并且工作正常。 似乎IPv6受操作系统支持,但不受Java虚拟机支持。 有没有办法解决这个问题?

将两个音频流混合到android中的单个音频流中?

我试图混合两个音频流来获得单个输出流是否有可能在Android? 在我的例子中,我有一个来自麦克风的输入流,即我正在使用AudioRecord录制用户语音。 我想将这个录音与一个简短的声音片段混合,然后创建一个新流,它是两个流的混合,然后通过数据报套接字发送。 我已经研究了很多,这就是我所知道的。 首先,SoundPool可以帮助我实现目标,但我认为我不能提供麦克风作为输入源。 目前,我将记录从MIC保存在缓冲区中,然后通过数据报套接字进行流式传输。 我以为我可以将声音片段保存在另一个缓冲区中,然后添加两个缓冲区(我知道这是一个愚蠢的想法,因为我必须管理各种声音属性)。 也可能是我可以将录音从麦克风保存到文件并将声音片段录制到不同的文件并混合它们,但我想我不能这样做,因为我试图通过数据报套接字流式传输录音。 我认为使用Java的声音API可以实现我想要实现的目标。 但Android不支持它。 总而言之,我想要实现的目标是在基于VoIP(SIP)的呼叫中注入声音效果(声音效果就像蟋蟀声音和我的声音一样)。 我希望我对我的问题做了明确的解释。 问题1:我怎样才能做到这一点? 问题2:我可以使用Java的Sound API创建一个JAR文件并在我的项目中使用它吗? (关于这一点,我认为这是不可能的) 以下是我的录音和音频播放的一些代码。 这是我的录音代码: public void run() { // TODO Auto-generated method stub try{ int minbuffer = AudioRecord.getMinBufferSize(sample, config, format); DatagramSocket socket = new DatagramSocket(); Log.d(TAG, “Socket Created”); socket.setBroadcast(true); byte[] ubuff = new byte[minbuffer]; DatagramPacket packet; Log.d(TAG, “Packet Created”); InetAddress dest […]

蓝牙连接失败“java.io.IOException:读取失败,套接字可能关闭或超时,读取ret:-1”

我正在尝试通过我在Nexus 5中安装的应用程序连接设备。我想在android中创建类似彩虹联系人的应用程序。 在我的应用程序中,我的目标是通过蓝牙连接到另一台设备并传输一组联系人或文件。 我按照这个问题 ,但是提到的解决方法对我不起作用这是我的完整代码。 这是我的应用程序中的代码片段,我试图获取套接字并建立连接。 我能够通过配对设备对话框,但是当我尝试配对时,会出现错误 //to create socket if (secure) { bluetoothSocket = device.createRfcommSocketToServiceRecord(uuid); } else { bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid); } //connection establishment try { bluetoothSocket.connect(); success = true; break; } catch (IOException e) { //try the fallback try { Class clazz = tmp.getRemoteDevice().getClass(); Class[] paramTypes = new Class[] {Integer.TYPE}; Method m = […]

在Android上使用Socket.IO始终返回XHR轮询错误

我正在编写一个需要连接到node.js服务器上运行的Socket.IO实例的Android应用程序。 尝试连接到实例并使用iOS设备传输数据完美无瑕,但是当我尝试使用Android设备时,它会失败。 我正在使用Native java客户端 ,这是我在android端使用的代码: mManager = new Manager(new URI(“https://example.com”)); mSocket = mManager.socket(“/users”); // socket events listeners mSocket.on(Socket.EVENT_CONNECTING, new Emitter.Listener() { @Override public void call(Object… args) { Log.v(TAG, “Caught EVENT_CONNECTING”); for (Object obj : args) { Log.v(TAG, “Errors :: ” + obj); } } }).on(Socket.EVENT_CONNECT, new Emitter.Listener() { @Override public void call(Object… args) { Log.v(TAG, […]

Android illegalstatexception

我正在尝试将带有Android的UDP数据包发送到我的计算机上用C#编写的服务器。 当我在手机上运行应用程序时,我会收到非法状态exception。 我认为这可能与在主要活动上执行网络操作有关,但我不确定如何解决这个问题。 这是我的客户: public class MainActivity extends Activity { WifiManager wifi; InetAddress dev_ip; final int serverPort = 31337; Thread drawThread = new Thread(new drawer()); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //set up wifi and connection wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); int ip = info.getIpAddress(); String ipaddr = (ip & […]

Android:Socket – java.net.SocketException:sendto failed:EPIPE(Broken pipe)

我正在尝试使用套接字与服务器建立连接。 连接管道断开,如下所示。 01-31 14:47:16.536: W/System.err(27255): java.net.SocketException: sendto failed: EPIPE (Broken pipe) 01-31 14:47:16.550: W/System.err(27255): at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:496) 01-31 14:47:16.550: W/System.err(27255): at libcore.io.IoBridge.sendto(IoBridge.java:465) 01-31 14:47:16.550: W/System.err(27255): at java.net.PlainSocketImpl.write(PlainSocketImpl.java:507) 01-31 14:47:16.550: W/System.err(27255): at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46) 01-31 14:47:16.664: W/NetworkManagementSocketTagger(24437): setKernelCountSet(10021, 1) failed with errno -2 01-31 14:47:16.684: W/System.err(27255): at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269) 01-31 14:47:16.693: W/System.err(27255): at java.io.DataOutputStream.write(DataOutputStream.java:98) 01-31 14:47:16.693: W/System.err(27255): at java.io.OutputStream.write(OutputStream.java:82) […]

保护VpnService中的套接字

我正在探索Android的VpnService的function。 目前,我通过在用户空间重建IP堆栈构建了一个非常基本的请求转发器:我从VpnService的输入流中读取IP数据包,解析它们,对于我不想转发的连接,我尝试重新创建那些VPN连接外部的套接字连接。 我已经明白最后一点是由VpnService.protect()促成的,并尝试按如下方式实现它: Socket socket = new Socket(); vpnService.protect(socket); socket.connect(new InetSocketAddress( header.getDestinationAddress(), // From my IP datagram header body.getDestinationPort())); // From the TCP datagram header 不幸的是,这种方法导致环回VPN接口。 虽然上面的代码只是阻塞并最终超时,但我通过从一个单独的线程调用Socket.connect(InetSocketAddress)来观察环回; 连接直接返回到我的VpnService的输入流,并重复该过程。 不用说,这会导致循环。 我觉得这样做的原因是在创建套接字时(以及随后调用VpnService.protect(Socket) ),我还没有设置目标IP和端口。 这似乎确实如此,因为通过在我的VpnService实现中重写VpnService.protect(Socket)和VpnService.protect(int)并在两种情况下调用supers都会返回false。 如何正确保护套接字连接?

从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