我是初学者,还在自学中,学习到UDP协议,自己写了端代码,不知道怎么的处理不了客户端的信息,请大家帮忙指点一下,3Q
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServer {
/**
* @param args
*/
public static void main(String[] args) {
DatagramSocket ds=null;
DatagramPacket receive;
byte[] b=new byte[1024];
int port=10000;
try{
ds=new DatagramSocket(port);
receive=new DatagramPacket(b,b.length);
while(true){
ds.receive(receive);
new UDPServerThread(receive);
}
}catch(Exception e){
}finally{
try{
ds.close();
}catch(Exception e1){}
}
}
}import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServerThread extends Thread{
DatagramSocket ds=null;
DatagramPacket receive,send;
public UDPServerThread(DatagramPacket receive){
this.receive=receive;
start();
}
public void run(){
byte[] b=receive.getData();
int len=receive.getLength();
System.out.println("接收到客户端数据:"+new String(b,0,len));
byte[] b1="OK!".getBytes();
send=new DatagramPacket(b1,b1.length,receive.getAddress(),receive.getPort());
try {
ds=new DatagramSocket();
ds.send(send);
} catch (Exception e) {
}finally{
try{
ds.close();
}catch(Exception e1){}
}
}
}
我用System.out.println(“”);方式测试了一下,启动客户端程序后,服务端运行到线程的run方法就卡住了,byte[] b=receive.getData();被阻塞了,不知道什么原因UDPJAVA服务端多线程
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServer {
/**
* @param args
*/
public static void main(String[] args) {
DatagramSocket ds=null;
DatagramPacket receive;
byte[] b=new byte[1024];
int port=10000;
try{
ds=new DatagramSocket(port);
receive=new DatagramPacket(b,b.length);
while(true){
ds.receive(receive);
new UDPServerThread(receive);
}
}catch(Exception e){
}finally{
try{
ds.close();
}catch(Exception e1){}
}
}
}import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServerThread extends Thread{
DatagramSocket ds=null;
DatagramPacket receive,send;
public UDPServerThread(DatagramPacket receive){
this.receive=receive;
start();
}
public void run(){
byte[] b=receive.getData();
int len=receive.getLength();
System.out.println("接收到客户端数据:"+new String(b,0,len));
byte[] b1="OK!".getBytes();
send=new DatagramPacket(b1,b1.length,receive.getAddress(),receive.getPort());
try {
ds=new DatagramSocket();
ds.send(send);
} catch (Exception e) {
}finally{
try{
ds.close();
}catch(Exception e1){}
}
}
}
我用System.out.println(“”);方式测试了一下,启动客户端程序后,服务端运行到线程的run方法就卡住了,byte[] b=receive.getData();被阻塞了,不知道什么原因UDPJAVA服务端多线程
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;public class UDPClient {
public static void main(String[] args){
DatagramSocket socket = null;
DatagramPacket sendPacket = null;
DatagramPacket receivePacket = null;
try{
// 1,创建DatagramSocket
socket = new DatagramSocket();
// 2,创建发送用的packet
byte[] buff =
"please give me your time :"
.getBytes("UTF-8");
sendPacket = new DatagramPacket
(buff,buff.length,
new InetSocketAddress(
"localhost",9900));
// 3,利用socket以及DatagramPacket发送数据
socket.send(sendPacket);
// 4,创建接收用的packet
byte[] buffRe = new byte[20];
receivePacket =
new DatagramPacket(buffRe,buffRe.length);
//5,利用socket以及DatagramPacket接收数据
socket.receive(receivePacket);
System.out.println(new String(buffRe));
}catch(Exception e){
e.printStackTrace();
}finally{
try{
// 6,关闭socket
if(socket!=null)socket.close();
}catch(Exception e){}
}
}
}服务端package com.briup.ch12;import java.net.DatagramPacket;
import java.net.DatagramSocket;import java.util.Date;public class UDPServer {
public static void main(String[] args){
DatagramSocket socket = null;
DatagramPacket sendPacket = null;
DatagramPacket receivePacket = null;
try{
// 1,创建DatagramSocket
socket = new DatagramSocket(9900);
while(true){
// 2,创建接收用的packet
byte[] buffRe = new byte[40];
receivePacket =
new DatagramPacket(buffRe,buffRe.length);
//3,利用socket以及DatagramPacket接收数据
socket.receive(receivePacket);
System.out.println(new String(buffRe));
// 4,创建发送用的packet
byte[] buff =
new Date().toString()
.getBytes();
// 5, 获得客户端的信息,并包装
sendPacket = new DatagramPacket
(buff,buff.length,
receivePacket.getSocketAddress());
// 6,利用socket以及DatagramPacket发送数据
socket.send(sendPacket);
}
}catch(Exception e){
e.printStackTrace();
}
}
}你的例子我因为时间原因没怎么看,但是感觉和我以前的写的一个挺像的,你找找区别吧、、
System.out.println("receive----");
ds.receive(receive);
System.out.println(receive);
new UDPServerThread(receive).start();
}
已经解决了,把receive=new DatagramPacket(b,b.length);移动到while循环里面就没问题了,但是为什么呢?
while(true){
receive=new DatagramPacket(b,b.length);
ds.receive(receive);
new UDPServerThread(receive);
}