为了账号安全,请及时绑定邮箱和手机立即绑定

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();
		}
		
	}
}


正在回答

5 回答

http://img1.sycdn.imooc.com//57bbc46f0001c8a305690117.jpg

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

0 回复 有任何疑惑可以回复我~
#1

风中过客 提问者

哈哈, 那个啥, 请忽略掉那个data
2016-08-25 回复 有任何疑惑可以回复我~

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循环外就不行,我写在上面一直不行,看你这么写改了竟然就可以了。。。

0 回复 有任何疑惑可以回复我~

 不可以用多线程吗?

0 回复 有任何疑惑可以回复我~

1,需要手动关闭的

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

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

0 回复 有任何疑惑可以回复我~

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

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

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

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信