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(); } } }
为什么构造方法中没有传入data,这个地方创建线程的时候为什么可以传入??
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循环外就不行,我写在上面一直不行,看你这么写改了竟然就可以了。。。
不可以用多线程吗?
1,需要手动关闭的
2,packet返回的字节数组不一定全部用完了,因此要通过packet.getLength()方法构造一个String,可以这样写
String info = new String(packet.getData(), 0, packet.getLength());
问题1. 当客户端的数据报发送完毕,客户端创建的DatagramSocket是否需要关闭(手动的)?
问题2. run方法中的 读取来自客户端的数据报里面的数据,为什么不直接
String Info = new String(packet.getData());
而是 先写到一个临时数组里面,然后去读那个数组里面的东西,有点多此一举的感觉?