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());
而是 先写到一个临时数组里面,然后去读那个数组里面的东西,有点多此一举的感觉?