Articles of 套接字

当有数据可用于在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)但如果它适用于大多数情况会很好。

Smack 4.1重新连接问题

我正在开发一个聊天应用程序 我有一个持续运行的后台服务。 应用程序运行顺利,我能够毫无问题地接收和发送消息。 我正在使用默认的Smack 4.1重新连接管理器,它会在连接丢失后立即连接(几乎90%的时间)。 但有时,当连接丢失时,Smack重新连接管理器停止工作。 我无法找出造成这个问题的原因。 当我检查手机时,经过12到14小时的延迟,我可以看到Android服务仍在运行,但XMPP重新连接已停止工作。 然后我必须强制停止应用程序,然后重新启动服务并让它再次连接到XMPP服务器。 我的假设是,当“电话网络从Wifi到数据或数据到Wifi”切换时,就会发生这种情况。 与此同时,Smack 4.1重新连接管理器停止工作。 虽然,我不确定。 我有问题 PingManager有什么用? PingManager在这种情况下可以提供帮助吗? 什么是StreamManagement? 我该如何启用它? 这种情况有用吗? 任何其他解决方案来解决这个问题? 我在考虑以下解决方案: 要使用GCM以及XMPP,所以当XMPP无法重新连接时,我可以获得PUSH并在PUSH的基础上再次连接。 使用警报服务。 ( 问题:由于连接丢失而在队列中的消息将取决于下一个警报计划) 每次用户返回应用程序时连接XMPP。 ( 问题:由于连接丢失而在队列中的消息将取决于用户返回应用程序)

在Android应用程序中使用套接字的正确方法

我正在开发这个应用程序,我需要在某些时候发送数据(主要是双打和字符串)到服务器。 我将使用TCP套接字和DataOutput / InputStreams。 我想知道最好的方法是什么。 我应该有一个单独的类来处理与实现的写/读方法的连接,或者只是在onCreate()的主Activity类中定义套接字/流等? 第一种方式甚至可能吗? 任何例子将不胜感激。 PS。 我应该使用不同的线程来处理连接吗? 编辑。 所以,如果我做对了,这应该是正确的: public class ConnectionHandler extends AsyncTask{ public static String serverip = “192.168.1.100”; public static int serverport = 7777; Socket s; public DataInputStream dis; public DataOutputStream dos; public int message; @Override protected Void doInBackground(Void… params) { try { Log.i(“AsyncTank”, “doInBackgoung: Creating Socket”); s = new […]

在Android中捕获网络数据包?

我正在开发一个项目,我需要捕获传入/传出的数据包并将它们存储在pcap文件中。 Android为此目的提供了VpnService ,这是在API级别14中添加的。尽管在SO上似乎有很多关于此的问题,但令人惊讶的是它的工作示例非常少。 我尝试使用添加在样本中的ToyVpn,但我无法使其工作。 然后我发现了这个例子。 VpnService示例 该示例总结了以下步骤中的捕获。 创建一个TUN界面(我仍然不确定TUN是什么,但在互联网上冲浪说它是在设备上模拟网络层)。 通过TUN获取传入数据包和传出数据包的文件描述符。 将这些数据包转发到实际的服务器。 (不确定这是什么服务器?每个传出的数据包都有一个requestUrl ,所以服务器在这里意味着将请求委托给requestUrl服务器 。或者服务器意味着在AWS上的某个地方创建自己的服务器并重定向那里的所有流量,反过来将流量重定向到实际目的地)。 从服务器获取响应。 在TUN的帮助下,再次将此响应传递给应用程序的预期组件。 我使用下面的代码创建了一个TUN。 我给出了上面提到的教程中给出的地址。 不确定,是否有正确的值。 以及如何确定这个地址。 Builder builder = new Builder(); ParcelFileDescriptor mInterface = builder.setSession(“MyVPNService”) .addAddress(“192.168.0.1”, 24) .addDnsServer(“8.8.8.8”) .addRoute(“0.0.0.0”, 0).establish(); 接下来,我获得了文件描述符,并打开了隧道。 FileInputStream in = new FileInputStream( mInterface.getFileDescriptor()); DatagramChannel tunnel = DatagramChannel.open(); // I have created a EC2 instance on AWS, and gave […]

adb.exe启动服务器失败了android studio

我键入adb nodaemon服务器错误:无法安装smartsocket侦听器:无法绑定到127.0.0.1:5037:通常只允许每个套接字地址(协议/网络地址/端口)的一个sage。 (10048) netstat -ano | findstr 5037 TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 5652 TCP 127.0.0.1:5037 127.0.0.1:55726 ESTABLISHED 5652 TCP 127.0.0.1:5037 127.0.0.1:55770 ESTABLISHED 5652 TCP 127.0.0.1:55726 127.0.0.1 :5037 ESTABLISHED 1620 TCP 127.0.0.1:55770 127.0.0.1:5037 ESTABLISHED 6488所以我找不到任何错误。我不知道显示adb.exe启动服务器失败。所以该怎么办请帮助解决

在Android中GCM与Socket

据我所知,大多数Android教程和示例都依赖于使用GCM将数据从服务器发送到Android设备; 并使用php脚本和post / get方法将数据从设备发送到服务器。 我的一个朋友(一个对an​​droid编程没有任何了解的人)只是问我,为什么我们不能在java中使用Socket类? 在传统的Java编程中,您使用套接字(IP地址+端口号)来实现类似于GCM的function(单个服务器多个客户端 – 使用适当的技术,您可以确保消息不会丢失,就像gcm一样)。 这个传统的socket方法也可以在android中实现吗? 如果是这样,GCM和套接字的优缺点是什么? 在哪种情况下套接字的使用是否合适? 据我所知,Whatsapp和许多其他应用程序都使用GCM。 有没有使用套接字的应用程序? PS:我只是一名CS学生; 如果我在某个地方弄错了我的概念,我会道歉

通过TCP套接字将音频写入服务器

我正在尝试通过TCP套接字和服务器将实时麦克风录制传输到服务器,以将输入流写入文件。 建立连接但是在一段时间后,我在客户端遇到连接拒绝错误。 服务器代码: public class auServer extends Thread{ private static ServerSocket serverSocket; private static int port = 3333; public void run() { System.out.println(“init success”); while(true) { try { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(10000); Socket clientSoc = serverSocket.accept(); System.out.println(“Waiting for client on port ” +serverSocket.getLocalPort() + “…”); System.out.println(“Just connected to ” + clientSoc.getRemoteSocketAddress()); InputStream in = […]

Android HTTP连接

任何人都可以告诉我为什么这在Android模拟器中不起作用? 从浏览器我有访问权限,服务器是内部的。 我能想到的是,我在我的应用程序上缺少一些配置,因此它可以访问网络层。 try { InetAddress server = Inet4Address.getByName(“thehost”); //Doesn’t work either //or InetAddress server2 = Inet4Address.getByAddress(new String(“192.168.1.30”).getBytes()); if(server.isReachable(5000)){ Log.d(TAG, “Ping!”); } Socket clientsocket = new Socket(server, 8080); } catch (UnknownHostException e) { Log.e(TAG, “Server Not Found”); } catch (IOException e) { Log.e(TAG, “Couldn’t open socket”); } 抛出UnknownHostException 谢谢