DatagramSocket dp = new DatagramSocket(by,0,by.length,InetAddress.getByName("127.0.0.1"),10000);哪里错了
时间: 2024-09-26 07:09:59 浏览: 35
在这个 `DatagramSocket` 的构造函数创建示例中,看起来有两处潜在的问题:
1. **数据缓冲区长度**:`new DatagramSocket(by, 0, by.length, ...)` 中的 `by.length` 可能不是正确的接收缓冲区大小。在 UDP 地址族中,通常不需要显式地指定缓冲区的长度,除非你有一个特定的需求。如果你想要使用默认大小,直接传入0即可。
2. **目标端口**:`InetAddress.getByName("127.0.0.1"), 10000` 部分看起来是在本地主机上监听 10000 端口,但如果这不是你要连接的目标主机的端口,你需要替换为实际目标主机的 IP 和端口号。
修正后的代码可能像这样:
```java
DatagramSocket dp = new DatagramSocket(by, 0, InetAddress.getByName("127.0.0.1"), 10000);
```
如果要发送到远程服务器,那么应该是:
```java
DatagramSocket dp = new DatagramSocket(by, 0, InetAddress.getByName("remote_ip_address"), remote_port);
```
这里需要将 `"remote_ip_address"` 替换为实际的远程主机IP地址,并将 `remote_port` 替换为你想要发送数据的目标端口。
相关问题
private String GetUserByFingerprint(String fp) { String sError = null; try { DatagramSocket sockUdp = new DatagramSocket(); sockUdp.setSoTimeout(8000); InetAddress adrs_Idsvr = InetAddress.getByName("127.0.0.1");// seidsvr.jar UDP 17020 byte[] wbuf = String.format("SysID=wssvr;Finger=%s;", fp).getBytes(); // fp: 0301... DatagramPacket wPkt = new DatagramPacket(wbuf, wbuf.length, adrs_Idsvr, 17020); sockUdp.send(wPkt); Thread.sleep(1000); byte[] rbuf = new byte[256]; DatagramPacket rPacket = new DatagramPacket(rbuf, rbuf.length); sockUdp.receive(rPacket);// Blocking... sockUdp.close(); String sBuf = new String(rbuf); // DevMsg=90,{UserName}; int iEqual = sBuf.indexOf('='); int iComma = sBuf.indexOf(','); int iCol = sBuf.indexOf(';'); if (iEqual>0 && iComma>0 && iCol>0) { if (iComma+1 == iCol) // not match return null; else return String.format("{\"UserName\":\"%s\", \"MatchScore\":%s}", sBuf.substring(iComma+1, iCol), sBuf.substring(iEqual+1, iComma)); } else { sError = sBuf; } } catch (Exception e) { sError = "GetUserByFingerprint: "+e.getMessage(); log.error(sError); } return String.format("{\"ErrorMessage\":\"%s\"}", sError); }
这段代码看起来像是一个 Java 方法,它的作用是根据指纹获取用户信息。它使用了 UDP 协议向本地地址为 127.0.0.1、端口号为 17020 的服务器发送了一个字符串,其中包含了系统 ID 和指纹信息。然后该方法等待 1000 毫秒,接收从服务器返回的消息,并解析该消息以获取用户名和匹配得分。如果解析失败,则该方法将返回错误消息。
请编写程序实现基于UDP协议的Socket通信过程。 服务器端开放: IP地址:127.0.0.1或者localhost 端口号:12345 用于接收从客户端发送过来的数据: 用户名:admin;密码:123 客户端代码: public class UDPClient { public static void main(String[] args) throws IOException { InetAddress address = InetAddress.getByName("localhost"); int port = 12345; byte[] data = "用户名:admin;密码:123".getBytes(); DatagramPacket packet = new DatagramPacket(data, data.length, address, port); DatagramSocket socket = new DatagramSocket(); socket.send(packet); socket.close(); } } 要求输出结果为: ****服务器端已经启动,等待客户端发送数据 我是服务器,客户端说:用户名:admin;密码:123
服务器端代码:
```java
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPServer {
public static void main(String[] args) throws Exception {
int port = 12345;
DatagramSocket socket = new DatagramSocket(port);
System.out.println("****服务器端已经启动,等待客户端发送数据");
while (true) {
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String message = new String(packet.getData(), 0, packet.getLength());
System.out.println("我是服务器,客户端说:" + message);
}
}
}
```
客户端代码已经给出,直接运行即可。服务器端代码监听端口 12345,接收客户端发来的数据并在控制台输出。
阅读全文