- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
嘿,我一直在研究数据报类,但我就是不明白为什么我的“服务器”不会从“客户端”接收数据包。
我已经在我自己的 PC 上同时运行的服务器和客户端上对其进行了测试,并且它工作得很好,但是如果我尝试将服务器移至另一台 PC,它...不会。
现在我知道我一定是在套接字/地址/端口方面做错了什么......我以前没有使用过网络,所以我了解不多。
这是服务器代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.net.UnknownHostException;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.sql.Connection;
import java.util.ArrayList;
public class ServerThread extends Thread {
private boolean needsToRun;
private DatagramSocket socket;
public ServerThread() {
super();
needsToRun = true;
try {
socket = new DatagramSocket(4446);
}
catch (SocketException ex) {
ex.printStackTrace();
}
}
@Override
public void run() {
while(needsToRun) {
byte[] buf = new byte[265];
DatagramPacket packet = new DatagramPacket(buf,buf.length);
try {
socket.receive(packet);
}
catch(IOException e) {
e.printStackTrace();
}
String data = new String(packet.getData(),0,packet.getLength());
if(data != null)
System.out.println(data);
}
socket.close();
}
}
您会看到一些未使用的导入,但我只是精简了代码以使其变得基本(其中大部分来 self 实际上希望服务器在收到数据后对其进行的操作,但我已经使该部分正常工作)。
这是客户端代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class Main {
public static void main(String[] args) throws SocketException, UnknownHostException, IOException {
// get a datagram socket
DatagramSocket socket = new DatagramSocket();
// send request
String testInfo = "Hi";
byte[] buf = testInfo.getBytes();
/*This could possible be a point at which the code won't work.
*to get the bytes of the IP address of the computer I'm trying to run the server
*on I just did
* byte[] address = InetAddress.getLocalHost().getAddress();
* on the computer I was running the server on. I'm 95% sure that the IP addresses
* match.
*/
byte[] inet = {-64,-88,1,5};
InetAddress address = InetAddress.getByAddress(inet);
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4446);
try {
socket.send(packet);
}
catch(Exception e) {
e.printStackTrace();
}
socket.close();
}
}
我已经检查过代码的明显部分,例如端口和地址(请参阅代码内注释)。
所以我真正想要的是,如果您不明白为什么代码无法工作,那么您能告诉我一些端口可能出现问题的事情以及诸如此类的事情(端口可能被关闭等(除非我也相当确定端口是开放的))。
感谢您的任何建议。
最佳答案
I've tested it with the server and client both running on my own PC at once and it works perfectly, but if I try to move the server over to another PC, it...doesnt.
我预计这是某种网络或防火墙问题,而不是 Java 客户端和服务器应用程序的问题。 (他们在同一台机器上运行时可以说话的证据表明了这一点......)
检查这些事情:
检查客户端是否可以解析服务器的IP地址;例如尝试对其进行 ping 操作或在已知服务器支持的其他端口上连接到它。
检查客户端和服务器计算机上的软件防火墙是否允许端口 4446 上的 UDP 流量。
如果两台计算机之间有网桥和/或路由器,请检查它是否没有阻止端口 4446 上的 UDP 流量。
关于java - 数据报包和套接字的未知错误 - Java Networking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4181218/
我有一个twisted从这里代理:Python Twisted proxy - how to intercept packets . 它打印 HTTP 数据,我还想拦截并检查原始 IP 数据报。如何h
如果我在从客户端到服务器的 udp 套接字(在我的例子中是 QUdpSocket)上连续写入 2 次,我是否可能只收到一个数据报,其中包含我从客户端写入的两个数据?或者我确定我总是会得到 2 个单独的
我正在尝试使用原始套接字在 ruby 中编写自己的 UDP 实现,以用于教育目的。 这是我到目前为止所拥有的: require 'socket' addr = Socket.pack_sockad
我有一个非常基本的问题。想象一下,有一个简单的 udp 客户端,它正在监听传入的数据报。这些数据报只是字节[],但它们可能包含复杂的信息,如字符串、整数等。 是否有任何优雅的方法来解码数据报,例如使用
我必须开发一个分布式系统,该系统包括通过 TCP 套接字与来自其 IP 地址的某人进行聊天 session ,该系统连接到一个服务器,该服务器列出了过去 3 分钟连接到它的所有 ip。除了这个主要功能
使用Java编写基于UDP的客户端/服务器。 当服务器不断从套接字获取数据包时: socket.receive(packet); 即使客户端发送多个数据包,例如数据包 1、2、3 和 4,客户端也只能
您好,我想制作一个与“SendIP 发送任意 IP 数据包的命令行工具”类似的程序 我有一个程序可以发送“IPv4 + UDP”。我尝试通过 Wireshark 验证我的程序,但没有收到任何消息,我不
我正在尝试设计一个系统,其中有发送方和接收方,双方都可以发送和接收数据包。我为每个发送方和接收方使用 2 个数据报 channel ,并在每一侧使用 2 个线程来处理该问题。 从发送者向接收者发送数据
我的问题:使用 net.Read... 方法仅复制给定字节数组或 slice 大小的字节数。我当然不想每次都分配最大 64 kB 的 UDP 数据报。 是否有go方法来确定数据报的大小(在数据报头中)
考虑通过套接字发送的 100 个字节。使用 TCP 套接字,如果我调用 recv()长度为 50,我得到前 50 个字节,如果我再次调用它,我得到第二个 50 个字节。使用 UDP 套接字,如果我调用
有谁知道 Tibco rvd 数据报的可用 Javadoc(特别是类“com.tibco.tibrv.TibrvMsg”)?反编译类以获得签名并不难,但这并不能说明预期的最佳用法等。 我所需要的只是用
通过无连接数据报 Unix 套接字发送时出现 ECONNREFUSED 的可能原因是什么? 也欢迎任何有关如何调试此问题的建议,因为此问题是可重现的。 无论是否使用 sendto() 或 sendms
在为 Android 编写一个简单的 UDP 广播应用程序时,我遇到了一个奇怪的问题。 基本上,我的应用程序想要将数据流广播到本地网络上的设备。每个 UDP 数据包都有一个按顺序递增的数字,以便我知道
简单地说,我能够从连接的套接字接收数据,直到它启动后大约 10 秒。解决此问题的解决方案是,将数据发送到“客户端”(ARDrone)以保持数据流继续运行,否则它将停止向手机发送数据。但是,出于某种原因
这个问题在这里已经有了答案: How do I get amount of queued data for UDP socket? (2 个回答) 3年前关闭。 哪一个ioctl的 FIONREAD返
我正在向这个 Haskell 服务器发送简单的 UDP 数据包。对于数据包的来源,我使用“aspell -l en dump master”生成的纯文本文件。但是,任何超过 120,000 条消息的列
服务器: $address = '127.0.0.1'; $port = 46123; if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_
我有一个宽带雷达,我想打开。要打开它,我必须发送两个寄存器,如下所示: int reg0[3] = {0x00, 0xC1, 0x01}; int reg1[3] = {0x
我正在尝试使用 udp 套接字发送一些数据,并通过 Windows 环回适配器在同一个套接字上接收它们。在我的网络属性中,我将环回适配器设置为具有以下 ip 192.168.1.1 recvfrom
这个问题在这里已经有了答案: How does Skype work without port forwarding? (4 个答案) 关闭 9 年前。 我是网络新手...我有一个(愚蠢?:))关于
我是一名优秀的程序员,十分优秀!