j2se-10.14-log

2006.10.14          晴
      HTTP服务器,利用了线程可以实现多人的访问,代码是COPY过来了,可还是一知半解,另外还有UDP编程,和多播编程.其中主要用到了DatagramSocket,DatagramPacket, MulticastSocket ,InetAddress等类.

下面是今天的代码:
1.http服务器

public class HttpServer {

 public void startServer() {
  ServerSocket ss;
  try {
   ss = new ServerSocket(81);// 创建一个Server套接字并绑定端口
   while (true) {
    Socket socket = ss.accept();//侦听并接受到此套接字的连接,并返回新套接字
    // 启动谈话线程
    HttpSession session = new HttpSession(socket);
    Thread thread = new Thread(session);
    thread.start();
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  HttpServer server = new HttpServer();
  server.startServer();
 }

}

public class HttpSession implements Runnable {
 public static final String PATH_NAME = "F:\\网站资料\\" ;

 private Socket socket;
 public HttpSession(Socket socket){
  this.socket = socket ;
 }
 
 public void run() {
  try {
   BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   OutputStream out = socket.getOutputStream();

   String line = "";
   while( (line = reader.readLine()) != null){
    if(line.length() <= 4) continue;
    
    int start = line.indexOf(" ");
    int end = line.lastIndexOf(" ");
    
    if(start <= 0 || end <= 0 || start >= end)
     continue ;
    
    String cmd = line.substring(0, start).toUpperCase();
    if(cmd != null && cmd.equals("GET")){
     String fileName = line.substring(start + 2, end);
     String version = line.substring(end + 1);
     doGet(out, fileName) ;
    }    
    System.out.println(line);
   }   
   out.close();
   reader.close();
   socket.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 private void printOkResponse(OutputStream out, File file){
  PrintWriter pw = new PrintWriter(out) ;
  pw.println("HTTP/1.1 200 OK");
  pw.println("Server: Apache-Coyote/1.1");
  pw.println("ETag: W/\"6381-1144994988000\"");
  pw.println("Last-Modified: Fri, 14 Apr 2006 06:09:48 GMT");
  pw.println("Content-Type: text/plain");
  pw.println("Content-Length: " + file.length());

  DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL,
    DateFormat.FULL);
  pw.println(df.format(new Date()));

  pw.println("Connection: keep-alive");

  pw.println("");
  pw.flush();
 }
 
 private void doGet(OutputStream out, String fileName){
  File file = new File(PATH_NAME + fileName);
  printOkResponse(out, file) ;
  
  InputStream fis;
  try {
   fis = new FileInputStream(file);
   byte[] buff = new byte[1024];
   int len = 0;
   while((len = fis.read(buff) ) != -1){
    out.write(buff, 0, len);
   }
   fis.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
 }
 
}


2.UDP编程:
public class UDPClient {
 public void uDPReceive() {
  try {
   DatagramSocket socket = new DatagramSocket(8989);//声明本机的一个指定端口的UDP数据接收包
   while (true) {
    byte buffer[] = new byte[256];
    DatagramPacket packet = new DatagramPacket(buffer,
      buffer.length);//
    socket.receive(packet);
    System.out.write(packet.getData(), 0, packet.getData().length);
    System.out.println();
    Thread.sleep(500);
   }
  } catch (SocketException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (Throwable e) {
   e.printStackTrace();
  }

 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  UDPClient udpclient = new UDPClient();
  udpclient.uDPReceive();
 }

}


public class UDPServer {
 public void uDPSend() {
  try {
   DatagramSocket socket = new DatagramSocket();// 声明一个UDP用途的套接字
   while (true) {
    byte buffer[] = new byte[256];
    buffer = new Date().toString().getBytes();// 得到本地时间
    InetAddress address = InetAddress.getLocalHost();// 得到本机的address
    DatagramPacket packet = new DatagramPacket(buffer,
      buffer.length, address, 8989);// 得到带有目的IP的UDP数据包
    socket.send(packet);// 发送UDP数据包

   }
  } catch (SocketException e) {
   e.printStackTrace();
  } catch (UnknownHostException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }

 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  UDPServer udpserver = new UDPServer();
  udpserver.uDPSend();
 }

}



3.多播编程:
public class UDPClient {
 public void uDPReceive() {
  try {
   MulticastSocket  socket = new MulticastSocket(6789);// 创建多播套接字并将其绑定到特定端口
   InetAddress group=InetAddress.getByName("228.5.6.7");//创建一个多播组
   socket.joinGroup(group);//加入多播组
   while (true) {
    byte buffer[] = new byte[256];
    DatagramPacket packet = new DatagramPacket(buffer,
      buffer.length);// DatagramPacket主要是负责DatagramSocket的发送和接收
    socket.receive(packet);
    System.out.write(packet.getData(), 0, packet.getData().length);
    System.out.println();
    Thread.sleep(500);
   }
  } catch (SocketException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (Throwable e) {
   e.printStackTrace();
  }

 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  UDPClient udpclient = new UDPClient();
  udpclient.uDPReceive();
 }

}


public class UDPServer {
 public void uDPSend() {
  try {
   MulticastSocket  socket = new MulticastSocket(6789);// 创建多播套接字并将其绑定到特定端口
   InetAddress group=InetAddress.getByName("228.5.6.7");//创建一个多播组
   socket.joinGroup(group);//加入多播组
   while (true) {
    byte buffer[] = new byte[256];
    buffer = new Date().toString().getBytes();// 得到本地时间
    DatagramPacket packet = new DatagramPacket(buffer,
      buffer.length,group,6789);// 创建带有多播组的UDP数据包
    socket.send(packet);// 发送UDP多播数据包
    Thread.sleep(500);

   }
  } catch (SocketException e) {
   e.printStackTrace();
  } catch (UnknownHostException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (Throwable e) {
   e.printStackTrace();
  }

 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  UDPServer udpserver = new UDPServer();
  udpserver.uDPSend();
 }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值