问答详情
源自:4-3 编程实现基于 UDP 的 Socket 通信之客户端

UDP服务器接受多个客服端。

package com.guoke2;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;

/** * @author  guokewind 
 * @date 创建时间:2015年6月1日 下午6:28:05 
 * @version 
 * @parameter  
 * @since  
 * @return  */
public class Server {
	public static void main(String[] args) {
		try {
			//1.创建服务器DatagramSocket
			DatagramSocket socket=new DatagramSocket(8800);
			System.out.println("****服务器已经启动,等待客户端连接");
			//2.创建数据包,用于接收客户端发送的数据
			while(true){
				byte [] data= new byte[1024];
				DatagramPacket packet=new DatagramPacket(data, data.length);
				//3.接收客户端发送的数据
				socket.receive(packet);
				ServerThread serverThread=new ServerThread(socket,packet);
				serverThread.start();
				}
		} 
		catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}			catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
package com.guoke2;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/** * @author  guokewind 
 * @date 创建时间:2015年6月1日 下午7:16:08 
 * @version 
 * @parameter  
 * @since  
 * @return  */
public class ServerThread extends Thread {
	private DatagramSocket socket;
	private DatagramPacket packet;
	/*
	 * 通过构造方法把套接字和数据包传过来,不要传byte [] data,
	 * 用packet.getData()体现数据是通过数据包传送过来的 
	 */
	public ServerThread(DatagramSocket socket,DatagramPacket packet){
		this.socket=socket;
		this.packet=packet;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		try{
			byte [] data=packet.getData();//返回数据缓冲区
			String info=new String(data,0,packet.getLength());
			System.out.println("我是服务器"+Thread.currentThread()+",客户端说:"+info);
			InetAddress address =packet.getAddress();//得到主机的地址
			int port=packet.getPort();//返回某台远程主机的端口号
			byte []data2="欢迎您!".getBytes();
			DatagramPacket packet2=new DatagramPacket(data2, data2.length,address,port);//发送data2到主机
			socket.send(packet2);
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}			catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}


提问者:风中过客 2015-06-01 21:29

个回答

  • 慕姐0908070
    2016-08-23 11:35:47

    http://img.mukewang.com/57bbc46f0001c8a305690117.jpg

    为什么构造方法中没有传入data,这个地方创建线程的时候为什么可以传入??

  • iMcLaren
    2016-02-11 21:29:06

    try {

                //1.创建服务器DatagramSocket

                DatagramSocket socket=new DatagramSocket(8800);

                System.out.println("****服务器已经启动,等待客户端连接");

                //2.创建数据包,用于接收客户端发送的数据

                while(true){

                    byte [] data= new byte[1024];

                    DatagramPacket packet=new DatagramPacket(data, data.length);

                    //3.接收客户端发送的数据

                    socket.receive(packet);

                    ServerThread serverThread=new ServerThread(socket,packet,data);

                    serverThread.start();

                    }

            } 

    为什么把 DatagramPacket packet=new DatagramPacket(data, data.length);

    写在while循环外就不行,我写在上面一直不行,看你这么写改了竟然就可以了。。。

  • 云心随风
    2016-01-16 14:58:22

     不可以用多线程吗?

  • 武庚_Rehan
    2015-09-28 17:58:58

    1,需要手动关闭的

    2,packet返回的字节数组不一定全部用完了,因此要通过packet.getLength()方法构造一个String,可以这样写

    String info = new String(packet.getData(), 0, packet.getLength());

  • 金大侠
    2015-07-21 13:40:21

    问题1. 当客户端的数据报发送完毕,客户端创建的DatagramSocket是否需要关闭(手动的)?

    问题2. run方法中的 读取来自客户端的数据报里面的数据,为什么不直接

               String Info = new String(packet.getData());

               而是 先写到一个临时数组里面,然后去读那个数组里面的东西,有点多此一举的感觉?