jake1036
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2010年7月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
统计
随笔 - 19
文章 - 0
评论 - 10
引用 - 0
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
给我留言
查看公开留言
查看私人留言
随笔档案
2010年11月 (1)
2010年9月 (1)
2010年8月 (1)
2010年7月 (9)
搜索
最新评论
1. re: java UDP 操作
<font size=4>写的不错!</font>
--o
2. re: java socket连接池
是不是可以在建立一个连接池,比如5个连接到服务器的连接,客户端在需要连接的时候,由服务器发给它一个可用的连接
--songxin
3. re: java socket连接池
@yackl
请问下,有没大概或者简单点的解决办法了?
--songxin
4. re: java socket连接池
这个连接池没什么大的作用啊。
服务器端是在接收到客户端的请求之后起一个线程处理的,
你只能说你有5个线程等待处理socket请求。
--songxin
5. re: java socket连接池[未登录]
垃圾
--aaa
阅读排行榜
1. java socket连接池(5303)
2. java socket非阻塞I/O(4486)
3. java日期控件(2421)
4. java UDP 操作(2369)
5. 利用回调函数在线程和主类中传递信息(782)
评论排行榜
1. java socket连接池(9)
2. java UDP 操作(1)
3. java日期控件(0)
4. java被隐藏的指针(0)
5. java socket非阻塞I/O(0)
java UDP 操作
1 DatagramSocket 类
要收发DatagramPacket必须打开一个数据报socket ,当服务器构造DatagramSocket时。
1.1 服务器和客户端的服务器
两者使用的socket都是一样的,区别仅仅在于 服务器端的端口是已知端口,而客户端的端口是系统分配的。
TCP端口和UDP端口之间没有关联,所以两者可以共同绑定在同一个端口上,而不会有相互影响。
1.2 DatagramSocket 类的构造函数
DatagramSocket创建一个在指定端口监听的入站数据报的 socket ,使用此构造函数可以编写出在指导的端口监听的服务器。
如果服务器在匿名端口监听,客户端就无法与之联系。
DatagramSocket 中的receive 方法,是阻塞方法,只有当接收到数据的时候,才会进行下面的代码,否则只会阻塞当前的进程。
1.3 一个简单的UDP 客户端
客户端接收用户在控制台上的输入,然后调用 DatagramSocket 中的send方法, 将数据传递出去。
package
cn.bupt.udptest;
import
java.io.BufferedReader;
import
java.io.IOException;
import
java.io.InputStreamReader;
import
java.net.DatagramPacket;
import
java.net.DatagramSocket;
import
java.net.InetAddress;
import
java.net.SocketException;
import
java.net.UnknownHostException;
public
class
UDPDiscardClient
{
public
final
static
int
DEFAULT_PORT
=
9
;
/** */
/**
*
@param
args
*/
public
static
void
main(String[] args)
{
String hostname
=
null
;
int
port
=
DEFAULT_PORT ;
if
(args.length
>
0
)
{
hostname
=
args[
0
] ;
port
=
Integer.parseInt(args[
1
]) ;
}
try
{
InetAddress server
=
InetAddress.getByName(hostname) ;
BufferedReader userInput
=
new
BufferedReader(
new
InputStreamReader(System.in)) ;
DatagramSocket theSocket
=
new
DatagramSocket() ;
while
(
true
)
{
String theLine
=
userInput.readLine() ;
if
(theLine.equals(
"
.
"
))
break
;
byte
[] data
=
theLine.getBytes(
"
UTF-8
"
) ;
DatagramPacket theOutput
=
new
DatagramPacket(data , data.length , server , port) ;
theSocket.send(theOutput) ;
}
}
catch
(UnknownHostException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
catch
(SocketException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
catch
(IOException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
}
1.4 UDP服务器
每当接收到一个数据报的时候,packet需要设置成最大的可能的值,否则当接收多个数据报以后,packet的值会变成已经接收到的最小的值。
package
cn.bupt.udptest;
import
java.io.IOException;
import
java.net.DatagramPacket;
import
java.net.DatagramSocket;
import
java.net.SocketException;
public
class
UDPDiscardServer
{
public
final
static
int
DEFAULT_PORT
=
9
;
public
final
static
int
MAX_PACKET_SIZE
=
65507
;
/** */
/**
*
@param
args
*/
public
static
void
main(String[] args)
{
//
TODO Auto-generated method stub
int
port
=
DEFAULT_PORT ;
byte
[] buffer
=
new
byte
[MAX_PACKET_SIZE] ;
port
=
Integer.parseInt(args[
0
]) ;
try
{
DatagramSocket server
=
new
DatagramSocket(port) ;
DatagramPacket packet
=
new
DatagramPacket(buffer , buffer.length) ;
while
(
true
)
{
server.receive(packet) ;
String s
=
new
String(packet.getData() ,
0
, packet.getLength() ,
"
UTF-8
"
) ;
System.out.println(packet.getAddress()
+
"
at port
"
+
packet.getPort()
+
"
says
"
+
s);
/**/
/*
必须重新设置
*/
packet.setLength(buffer.length) ;
}
}
catch
(SocketException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
catch
(IOException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2 感想
利用UDP协议来收发数据,都是将数据放在DatagramPacket 中,而TCP协议都是放在流中,通过getInputStream 和 getOutputStream 函数来获得流。
在服务器端UDP需要调用含有端口参数的DatagramSocket 构造函数 , 在客户端设置DatagramSocket时,调用匿名端口构造函数。
然后在构造DatagramPacket 构造函数的时候,发送端需要制定发送主机的 主机名 和 端口 。
posted on 2010-07-20 21:19
buptduming
阅读(2369)
评论(1)
编辑
收藏
Comments
#
re: java UDP 操作
o
Posted @ 2016-02-27 14:07
<font size=4>写的不错!</font>
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理