远程连接在 efflux 中不起作用基于 rtp/rtcp java 的库

如何解决远程连接在 efflux 中不起作用基于 rtp/rtcp java 的库

我不得不在一个项目中使用 #the loop Running def navigation(): actions = ActionChains(driver) . . . ,经过一番搜索,我在 github 上遇到了 https://github.com/jonbo372/efflux java 项目。这个项目没有一个完整的工作示例,所以在尝试了很多之后,我制作了一些测试文件并让它们运行。在我的设置中,有一个 python 服务器,它打开两个端口,一个用于 rtp/rtcp,另一个用于 rtp,并接受其上的数据和使用 efflux 库通过 rtcp 协议发送数据的客户端.

服务器代码

rtp/rtcp

服务器将打印与客户端通信所需的两个 import socket,simpleaudio as sa import threading,queue from multiplex import * from threading import Thread import time class ServerUDP: existing = [] joined = [] def __init__(self): while 1: try: self.s = socket.socket(socket.AF_INET,socket.soCK_DGRAM) self.s.bind(('127.0.0.1',0)) self.clients = set() self.recvPackets = queue.Queue() break except: print("Couldn't bind to that RTP port") while 1: try: self.s2 = socket.socket(socket.AF_INET,socket.soCK_DGRAM) self.s2.bind(('127.0.0.1',0)) self.clients2 = set() self.recvPackets2 = queue.Queue() break except: print("Couldn't bind to that RTP port") def get_ports(self): return self.s.getsockname() def get_ports2(self): return self.s2.getsockname() def RecvData(self,name,delay,run_event): while run_event.is_set(): data,addr = self.s.recvfrom(1600) print(addr,"read",data) y = list(addr) y[1] = 10000 #Android clients use port 5000 to get the data addr = tuple(y) self.clients.add(addr) self.recvPackets.put((data,addr)) #add the data and sender's data to the queue def RecvData2(self,addr = self.s2.recvfrom(1600) print(addr,data) y2 = list(addr) y2[1] = 20001 #Android clients use port 5000 to get the RTCP packets addr = tuple(y2) self.clients2.add(addr) self.recvPackets2.put((data,addr)) #add the data and sender's data to the queue def close(self): self.s.close() def close2(self): self.s2.close() if __name__ == "__main__": roomserver = ServerUDP() run_event = threading.Event() run_event.set() run_event2 = threading.Event() run_event2.set() d1 = 1 d2 = 1 t = Thread(target= roomserver.RecvData,args = ("bob",d1,run_event)) t2 = Thread(target= roomserver.RecvData2,args= ("allen",d2,run_event2)) # t.daemon = True t.start() t2.start() #Start a new server for this room port = roomserver.get_ports()[1] port2 = roomserver.get_ports2()[1] # self.rooms[data[1]] = [t,data[2],port] # port_byte = port.to_bytes(4,'big') # send(self.request,port_byte,encode= False) #Send the port number. An ID should also be sent for every client print("port is",port) print("port2 is",port2) # print("next iteration") try: while 1: time.sleep(.1) except KeyboardInterrupt: print("attempting to close threads. Max wait =",d1) run_event.clear() run_event2.clear() t.join() t2.join() print("threads successfully closed") 端口。

客户端代码

udp

如果客户端和服务器在同一台主机上,则上面的代码有效,但在不同主机上运行时则无效。在后一种情况下,我无法在服务器端看到数据包。在进一步调试 Efflux 时,它使用一些数据报通道来发送/接收数据包。但是我也看不到任何错误消息。
我将两台主机/笔记本电脑连接到同一个手机的热点。

但是在远程服务器的情况下,如果我使用 import com.biasedbit.efflux.packet.AppDataPacket; import com.biasedbit.efflux.packet.CompoundControlPacket; import com.biasedbit.efflux.packet.ControlPacket; import com.biasedbit.efflux.packet.DataPacket; import com.biasedbit.efflux.participant.RtpParticipant; import com.biasedbit.efflux.participant.RtpParticipantInfo; import com.biasedbit.efflux.session.*; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.util.HashedWheelTimer; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.UUID; import com.biasedbit.efflux.participant.SsrcGenerator; public class test { private static final byte N = 1; private static MultiParticipantSession[] sessions; public static void main(String[] args) { //sessions is an array of session where each session has a local participant and a remote participant sessions = new MultiParticipantSession[N]; final AtomicInteger[] counters = new AtomicInteger[N]; final CountDownLatch latch = new CountDownLatch(N); for(byte i = 0; i < N; i++) { final int temp = i; long ssrc = 2; // a local participant is created with an identifier ssrc it's ip address and two ports required to send data packets and \\ // control packets to server side. RtpParticipant participant = RtpParticipant .createReceiver(new RtpParticipantInfo(ssrc),"127.0.0.1",10000 + (i * 2),20001 + (i * 2)); // above local participant is added to the session sessions[i] = new MultiParticipantSession("session" + i,8,participant); sessions[i].init(); final AtomicInteger counter = new AtomicInteger(); counters[i] = counter; //following are the two listeners for data and control packets from remote side. sessions[i].addDataListener(new RtpSessionDataListener() { @Override public void dataPacketReceived(RtpSession session,RtpParticipantInfo participant,DataPacket packet) { System.err.println(session.getId() + " received data from " + participant + ": " + packet); if (counter.incrementAndGet() == ((N - 1) * 2)) { latch.countDown(); } } }); sessions[i].addControlListener(new RtpSessionControlListener() { @Override public void controlPacketReceived(RtpSession session,CompoundControlPacket packet) { System.err.println("CompoundControlPacket received by session " + temp); } @Override public void appDataReceived(RtpSession session,AppDataPacket appDataPacket) { System.err.println("CompoundControlPacket received by session " + temp); } }); } // a remote participant is created with an identifier,it's ip address and the two ports to communicate\\ //here we have to put the ports values obtained from running the server code. RtpParticipant participant = RtpParticipant .createReceiver(new RtpParticipantInfo(22),"192.168.43.11",63302,51755); System.err.println("Adding " + participant + " to session " + sessions[0].getId()); //remote participant is added as a receiver to the session. sessions[0].addReceiver(participant); //a sample byte array of some data. byte[] deadbeef = {(byte) 0xde,(byte) 0xad,(byte) 0xbe,(byte) 0xef}; for (byte i = 0; i < 100; i++) { //sending the byte array from local participant to remote participants within the session,in current case there's only one,the python server. sessions[0].sendData(deadbeef,0x45,false); sessions[0].sendData(deadbeef,false); } } } 套接字发送数据包(如下所示),那么我可以在服务器端看到数据包。

Datagram

我已经坚持了 5 天了,但仍然无法解决。问题是我无法追踪发送数据包时发生的故障,是因为网络连接还是外排问题。我使用 InetAddress address = null; try { address = InetAddress.getByName("192.168.43.11"); } catch (UnkNownHostException e) { e.printstacktrace(); } DatagramSocket socket= null; try { socket = new DatagramSocket(); } catch (SocketException e) { e.printstacktrace(); } byte[] deadbeef = {(byte) 0xde,(byte) 0xef}; while(true){ DatagramPacket pkt = new DatagramPacket(deadbeef,deadbeef.length,address,63302); socket.send(pkt); System.err.println("sending data " + pkt +" " + i); } 运行此流出代码

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?