首页
学习
活动
专区
圈层
工具
发布

Java连接
EN

Stack Overflow用户
提问于 2015-04-25 08:30:04
回答 2查看 8.6K关注 0票数 5

我正在使用Netbeans试图在客户端和服务器之间建立UDP连接,这是一个简单的程序,UDPClientUDPServer发送一个字符串,服务器将该字符串大写并发送回客户端。

客户端UDPClient的类代码:

代码语言:javascript
复制
    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());

        }
    }

和我的服务器端类UDPServer

代码语言:javascript
复制
    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);

        }
    }

计算程序正常运行,输出无错误。服务器根本不接收数据包,也没有与客户端交互。为什么会发生这种事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-25 09:03:59

您尚未在服务器中指定任何侦听端口,因此服务器侦听随机可用端口。

在服务器端尝试使用这个

代码语言:javascript
复制
DatagramSocket socket = new DatagramSocket(9876);
票数 4
EN

Stack Overflow用户

发布于 2015-04-25 09:17:25

问题是您的服务器代码没有指定端口--它将侦听一个随机可用的端口,而客户机将发送到9876。若要纠正此情况,请使用:

代码语言:javascript
复制
DatagramSocket socket = new DatagramSocket(9876, InetAddress.getByName("localhost"));

(如果您在linux系统上),我强烈建议使用netstat来调试这类代码:

代码语言:javascript
复制
netstat -ln | grep 9876

将告诉您进程是否正在侦听端口9876。另一个有用的工具是netcat,它可以用来发送和接收TCP和UDP:

代码语言:javascript
复制
nc -u localhost 9876

允许您通过UDP向服务器发送消息。

在客户端代码中,还需要将接收到的字节转换回字符串以获得有意义的输出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29862870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档