2011.09.15
来源:互联网 发布:linux下redis安装配置 编辑:程序博客网 时间:2024/05/17 23:09
java UDP 操作
1 DatagramSocket 类
要收发DatagramPacket必须打开一个数据报socket ,当服务器构造DatagramSocket时。
1.1 服务器和客户端的服务器
两者使用的socket都是一样的,区别仅仅在于 服务器端的端口是已知端口,而客户端的端口是系统分配的。
TCP端口和UDP端口之间没有关联,所以两者可以共同绑定在同一个端口上,而不会有相互影响。
1.2 DatagramSocket 类的构造函数
DatagramSocket创建一个在指定端口监听的入站数据报的 socket ,使用此构造函数可以编写出在指导的端口监听的服务器。
如果服务器在匿名端口监听,客户端就无法与之联系。
DatagramSocket 中的receive 方法,是阻塞方法,只有当接收到数据的时候,才会进行下面的代码,否则只会阻塞当前的进程。
1.3 一个简单的UDP 客户端
客户端接收用户在控制台上的输入,然后调用 DatagramSocket 中的send方法, 将数据传递出去。
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 extends Thread {
public final static int DEFAULT_PORT = 3000;
public UDPDiscardClient() {
start();
}
public void run() {
String hostname = "localhost";
int port = DEFAULT_PORT;
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();
}
}
public static void main(String[] args) {
new UDPDiscardClient();
}
}
1.4 UDP服务器
每当接收到一个数据报的时候,packet需要设置成最大的可能的值,否则当接收多个数据报以后,packet的值会变成已经接收到的最小的值。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UDPDiscardServer extends Thread {
public final static int DEFAULT_PORT = 3000;
public final static int MAX_PACKET_SIZE = 65507;
public UDPDiscardServer() {
start();
}
public void run() {
serverWork();
}
public void serverWork() {
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();
}
}
public static void main(String[] args) {
new UDPDiscardServer();
}
}
2 感想
利用UDP协议来收发数据,都是将数据放在DatagramPacket 中,而TCP协议都是放在流中,通过getInputStream 和 getOutputStream 函数来获得流。
在服务器端UDP需要调用含有端口参数的DatagramSocket 构造函数 , 在客户端设置DatagramSocket时,调用匿名端口构造函数。
然后在构造DatagramPacket 构造函数的时候,发送端需要制定发送主机的 主机名 和 端口- 2011.09.15
- 2011.09.15
- 2011.09.15-网络编程
- 2011.09.05
- 2011.09.01
- 2011.09.02
- 2011.09.05
- 2011.09.06
- 2011.09.01
- 2011.09.02
- 2011.09.06
- 2011.09.05
- 2011.09.06
- 2011.09.05
- 2011.09.06
- 2011.09.06
- 2011.09.05
- 2011.09.07
- 一个软件项目主要分为哪些阶段?各个阶段主要做哪些工作?
- 2011-9-19 xml 初步学习
- 實例解析Java jquery json的執行過程
- UML
- python 小程序
- 2011.09.15
- 挺不错grub2详细说明,放在这里备用
- Google员工教你如何面试
- xml
- linux下dup/dup2函数的用法1
- 字符设备驱动之I2C设备驱动(1)
- GetMemory
- sed使用
- xml和html