Java UDP 连接
Java UDP Connection
我正在使用 Netbeans IDE 尝试在客户端和服务器之间建立 UDP 连接,这是一个简单的程序,UDPClient 将字符串发送到 UDPServer 和服务器将字符串大写并发送回 client.I 使客户端和服务器端在一个单独的项目中。
我的 class 客户端代码 UDPClient
:
package udpclient;
import java.io.*;
import java.net.*;
public class UDPClient {
public static void main(String[] args) throws IOException{
//get input from user
BufferedReader user_in = new BufferedReader(
new InputStreamReader(System.in));
//create udp socket connection
DatagramSocket socket = new DatagramSocket();
//creat buffers to process data
byte[] inData = new byte[1024];
byte[] outData = new byte[1024];
//get ip destination wanted
InetAddress IP = InetAddress.getByName("localhost");
//read data from user
System.out.println("Enter Data to send to server: ");
outData = user_in.readLine().getBytes();
/*
* make pkts for interaction
*/
//send pkts
DatagramPacket sendPkt = new DatagramPacket(outData, outData.length, IP, 9876);
socket.send(sendPkt);
//receive pkts
DatagramPacket recievePkt = new DatagramPacket(inData, inData.length);
socket.receive(recievePkt);
System.out.println("Replay from Server: "+recievePkt.getData());
}
}
和我的服务器端 class UDPServer
:
package udpserver;
import java.io.*;
import java.net.*;
public class UDPServer {
public static void main(String[] args) throws IOException{
// TODO code application logic
//connection
DatagramSocket socket = new DatagramSocket();
//pkt buffers
byte[] inServer = new byte[1024];
byte[] outServer = new byte[1024];
//receive pkt
DatagramPacket rcvPkt = new DatagramPacket(inServer,inServer.length);
socket.receive(rcvPkt);
//display receive
System.out.println("Packet Received!");
//retrive pkt info to send response to same sender
InetAddress IP = rcvPkt.getAddress();
int port = rcvPkt.getPort();
//process data
String temp = new String(rcvPkt.getData());
temp = temp.toUpperCase();
outServer = temp.getBytes();
//send response packet to sender
DatagramPacket sndPkt = new DatagramPacket(outServer, outServer.length, IP, port);
socket.send(sndPkt);
}
}
算算程序运行正常,没有输出错误。服务器根本没有收到数据包,它没有与客户端交互。为什么会这样?
您尚未在服务器中指定任何侦听端口,因此服务器侦听随机可用端口。
在服务器端试试这个
DatagramSocket socket = new DatagramSocket(9876);
问题是您的服务器代码未指定端口 - 它将侦听随机可用端口,而客户端正在发送到 9876。要更正此问题,请使用:
DatagramSocket socket = new DatagramSocket(9876, InetAddress.getByName("localhost"));
(如果您使用的是 linux 系统)我强烈建议您使用 netstat 来调试此类代码:
netstat -ln | grep 9876
会告诉您是否有进程正在侦听端口 9876。
另一个有用的工具是 netcat,它可以用来发送和接收 TCP 和 UDP:
nc -u localhost 9876
允许您通过 UDP 向服务器发送消息。
在您的客户端代码中,您还需要将接收到的字节转回字符串以获得有意义的输出。
我正在使用 Netbeans IDE 尝试在客户端和服务器之间建立 UDP 连接,这是一个简单的程序,UDPClient 将字符串发送到 UDPServer 和服务器将字符串大写并发送回 client.I 使客户端和服务器端在一个单独的项目中。
我的 class 客户端代码 UDPClient
:
package udpclient;
import java.io.*;
import java.net.*;
public class UDPClient {
public static void main(String[] args) throws IOException{
//get input from user
BufferedReader user_in = new BufferedReader(
new InputStreamReader(System.in));
//create udp socket connection
DatagramSocket socket = new DatagramSocket();
//creat buffers to process data
byte[] inData = new byte[1024];
byte[] outData = new byte[1024];
//get ip destination wanted
InetAddress IP = InetAddress.getByName("localhost");
//read data from user
System.out.println("Enter Data to send to server: ");
outData = user_in.readLine().getBytes();
/*
* make pkts for interaction
*/
//send pkts
DatagramPacket sendPkt = new DatagramPacket(outData, outData.length, IP, 9876);
socket.send(sendPkt);
//receive pkts
DatagramPacket recievePkt = new DatagramPacket(inData, inData.length);
socket.receive(recievePkt);
System.out.println("Replay from Server: "+recievePkt.getData());
}
}
和我的服务器端 class UDPServer
:
package udpserver;
import java.io.*;
import java.net.*;
public class UDPServer {
public static void main(String[] args) throws IOException{
// TODO code application logic
//connection
DatagramSocket socket = new DatagramSocket();
//pkt buffers
byte[] inServer = new byte[1024];
byte[] outServer = new byte[1024];
//receive pkt
DatagramPacket rcvPkt = new DatagramPacket(inServer,inServer.length);
socket.receive(rcvPkt);
//display receive
System.out.println("Packet Received!");
//retrive pkt info to send response to same sender
InetAddress IP = rcvPkt.getAddress();
int port = rcvPkt.getPort();
//process data
String temp = new String(rcvPkt.getData());
temp = temp.toUpperCase();
outServer = temp.getBytes();
//send response packet to sender
DatagramPacket sndPkt = new DatagramPacket(outServer, outServer.length, IP, port);
socket.send(sndPkt);
}
}
算算程序运行正常,没有输出错误。服务器根本没有收到数据包,它没有与客户端交互。为什么会这样?
您尚未在服务器中指定任何侦听端口,因此服务器侦听随机可用端口。
在服务器端试试这个
DatagramSocket socket = new DatagramSocket(9876);
问题是您的服务器代码未指定端口 - 它将侦听随机可用端口,而客户端正在发送到 9876。要更正此问题,请使用:
DatagramSocket socket = new DatagramSocket(9876, InetAddress.getByName("localhost"));
(如果您使用的是 linux 系统)我强烈建议您使用 netstat 来调试此类代码:
netstat -ln | grep 9876
会告诉您是否有进程正在侦听端口 9876。 另一个有用的工具是 netcat,它可以用来发送和接收 TCP 和 UDP:
nc -u localhost 9876
允许您通过 UDP 向服务器发送消息。
在您的客户端代码中,您还需要将接收到的字节转回字符串以获得有意义的输出。