java编程 利用UDP方式,客户端向服务器发送三边值,服务器,根据三边值计算三角形面积返回客户端

java编程 利用UDP方式,客户端向服务器发送三边值,服务器,根据三边值计算三角形面积返回客户端,第1张

创建两个类 分别添加main方法 一个作为server类一个作为client类

客户端先发送再接收  服务器端先接收再发送

下面给你一个server和client的例子 你在基础上改一下就行了

client发送的时候发送三边值  server接收后 写一个计算三角形面积的函数 把接收到的三边值传入函数计算出结果作为数据返回到client端

/

 UDPServer

 /

import javaio;

import javanet;

class UDPServer{

    public static void main(String[] args)throws IOException{

        DatagramSocket  server = new DatagramSocket(5050);

        byte[] recvBuf = new byte[100];

        DatagramPacket recvPacket 

            = new DatagramPacket(recvBuf , recvBuflength);

        serverreceive(recvPacket);

        String recvStr = new String(recvPacketgetData() , 0 , recvPacketgetLength());

        Systemoutprintln("Hello World!" + recvStr);

        int port = recvPacketgetPort();

        InetAddress addr = recvPacketgetAddress();

        String sendStr = "Hello ! I'm Server";

        byte[] sendBuf;

        sendBuf = sendStrgetBytes();

        DatagramPacket sendPacket 

            = new DatagramPacket(sendBuf , sendBuflength , addr , port );

        serversend(sendPacket);

        serverclose();

    }

}/

 UDPClient

 /

import javaio;

import javanet;

class UDPClient{

    public static void main(String[] args)throws IOException{

        DatagramSocket client = new DatagramSocket();

        

        String sendStr = "Hello! I'm Client";

        byte[] sendBuf;

        sendBuf = sendStrgetBytes();

        InetAddress addr = InetAddressgetByName("127001");

        int port = 5050;

        DatagramPacket sendPacket 

            = new DatagramPacket(sendBuf ,sendBuflength , addr , port);

        clientsend(sendPacket);

        byte[] recvBuf = new byte[100];

        DatagramPacket recvPacket

            = new DatagramPacket(recvBuf , recvBuflength);

        clientreceive(recvPacket);

        String recvStr = new String(recvPacketgetData() , 0 ,recvPacketgetLength());

        Systemoutprintln("收到:" + recvStr);

        clientclose();

    }

}

TCP是面向连接,UDP面向非连接,资料不复制,在这里简单说下:

TCP建立连接时需要传说的三次握手,服务端与客户端需要确认对方身份而已,建立好连接后,就开始传递消息,直到有一方断开连接位置。 就好比两个人打电话,要先通了才能说话。

UDP只是数据报发送,它的优点速度快,并非要向TCP那样麻烦建立,它只负责将信息发出,但是并不确保信息的准确完整性等,就好比发短信,短信是出去了,但是中间是否有问题,是否对方手机能收到就不管了。

在java中想要实现上述两种协议通信,可采用socket建立连接,socket可以理解为码头,其实是套接字,这里简单说下,就好比两个城市运输货物,通过码头走货一样。至于如何通过socket建立两个连接,网上资料多的是,在这里不复制例子了。

在Java中 *** 纵UDP

使用位于JDK中Javanet包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文

在描述它们之前,必须了解位于同一个位置的InetAddress类。InetAddress实现了Javaio Serializable接口,不允许继承。它用于描述和包装一个Internet IP地址,通过三个方法返回InetAddress实例:

getLocalhost():返回封装本地地址的实例。

getAllByName(String host):返回封装Host地址的InetAddress实例数组。

getByName(String host):返回一个封装Host地址的实例。其中,Host可以是域名或者是一个合法的IP地址。

DatagramSocket类用于创建接收和发送UDP的Socket实例。和Socket类依赖SocketImpl类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。DatagramSocket类有3个构建器:

DatagramSocket():创建实例。这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。

DatagramSocket(int port):创建实例,并固定监听Port端口的报文。

DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。

值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。DatagramSocket类最主要的方法有4个:

Receive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”。

Send(DatagramPacket d):发送报文d到目的地。

SetSoTimeout(int timeout):设置超时时间,单位为毫秒。

Close():关闭DatagramSocket。在应用程序退出的 焙颍ǔ;嶂鞫头抛试矗乇誗ocket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。

“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。

DatagramPacket类用于处理报文,它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。应用程序在产生数据包是应该注意,TCP/IP规定数据报文大小最多包含65507个,通常主机接收548个字节,但大多数平台能够支持8192字节大小的报文。DatagramPacket类的构建器共有4个:

DatagramPacket(byte[] buf, int length, InetAddress addr, int port):从Buf数组中,取出Length长的数据创建数据包对象,目标是Addr地址,Port端口。

DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):从Buf数组中,取出Offset开始的、Length长的数据创建数据包对象,目标是Addr地址,Port端口。

DatagramPacket(byte[] buf, int offset, int length):将数据包中从Offset开始、Length长的数据装进Buf数组。

DatagramPacket(byte[] buf, int length):将数据包中Length长的数据装进Buf数组。

DatagramPacket类最重要的方法就是getData()了,它从实例中取得报文的Byte数组编码。

应该能收到消息,只是值不对吧?

你这样试试。

你 JAVA 发送消息的时候,将 byte 数组中的每个值都加 128 试试。

JAVA 和 C# 的在这部分的区别在,JAVA 的byte 取值范围是 -128 至 127,而 C# 的 byte 取值范围是 0 至 255。

或者 C# 接收到消息后,将数组中每个值都加 128 看看。

使用DatagramSocket和DatagramPacket

其中DatagramSocket使用一个发送的端口号

DatagramPacket的参数

DatagramPacket(bytes[] bytes,int bytes[]length,InetAddress ip, int port);里的port就是目标端口

要向两个端口号发送,需要创建两个DatagramPacket,分别填写两个IP地址和端口号,并用DatagramSocket发送。

另外两个端口需要做监听

要注意ip要为局域网可以畅通无阻,广域网可能导致网管阻止

下面是个例子,发两遍即可。

int SERVER_PORT=7000;

String severIp="1921681100";

DatagramSocket clientSocket;

try

{

InetAddress local = InetAddressgetByName(severIp);

DatagramPacket dPacket;

clientSocket = new DatagramSocket;

dPacket = new DatagramPacket("Hello"getBytes("utf-8"),"Hello"getBytes("utf-8")length,

local, SERVER_PORT);

clientSocketsend(dPacket);//这里是发送

byte[] msg = new byte[11246];

DatagramPacket rPacket = new DatagramPacket(msg, msglength);

clientSocketreceive(rPacket);//这里是接收监听

}

catch (IOException e)

{

eprintStackTrace();

}

clientSocketclose();

java UDP连接,如果要发送文件的话,你只能自己定义一系列的协议

因为TCP UDP 双方发送都是二进制数据

那么这个实现非常复杂

得不停的发送数据,写数据,建议使用>

以上就是关于java编程 利用UDP方式,客户端向服务器发送三边值,服务器,根据三边值计算三角形面积返回客户端全部的内容,包括:java编程 利用UDP方式,客户端向服务器发送三边值,服务器,根据三边值计算三角形面积返回客户端、TCP和UDP通信有什么区别 如何分别用java实现、JAVA问题 UDP协议中的端口问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10092122.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存