创建两个类 分别添加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协议中的端口问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)