package cn.sjxy.webserver;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//为了提高服务的效率,把没有用户的请求都包装成一个线程对象
class Tomcat implements Runnable{
private Socket socket;
public Tomcat(Socket socket) {//传递为用户服务的客服对象
this.socket=socket;
}
@Override
public void run() {
//获取输入输出流对象
InputStream in=null;
OutputStream out=null;
try {
in=this.socket.getInputStream();
out=this.socket.getOutputStream();
if(in!=null) {
byte[] buff=new byte[1024];
int len=in.read(buff);
String request=new String(buff,0,len);
//截取该请求的字符串(请求头信息,HTTP)
request=request.substring(0, request.indexOf("\r\n"));
request=request.split(" ")[1];
request=request.substring(1);
System.out.println(request);
//在服务器端查找该请求的资源是否存在,如果存在则输出给客户端,如果不存在给客户一个响应提示信息
//把该资源包装成一个文件
File file=new File("src/"+request);
if(file.exists()) {
//则把该字符以流的形式输出给客户端
FileInputStream fout=new FileInputStream(file);
while((len=fout.read(buff))>0) {
//把读取出的数据写出给客户端
out.write(buff, 0, len);
}
//释放资源
fout.close();
}else {
//给客户端一个输出提示信息
if(out!=null) {
String info="<h1><font color='red'>对不起,您请求的网络资源不存在!</font></h1>";
out.write(info.getBytes());
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(in!=null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(out!=null) {
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public class TomcatMoni {
public static void main(String[] args) {
// 创建一个服务端的ServerSocket
try {
ServerSocket server=new ServerSocket(8080);
while(true) {//模拟不停的为用户请求服务
//获取为客户请求服务的一个对应Socket
Socket client=server.accept();
//把该socket包装成一个线程
new Thread(new Tomcat(client)).start();
// //获取用户的请求(输入流对象)
// InputStream in=client.getInputStream();
// //获取一个响应的输出流对象(为用户提供输出服务)
// OutputStream out=client.getOutputStream();
// //首先读取用户的请求信息
// byte[] buff=new byte[1024];
// int len=in.read(buff);
// //把读取到的字节数据转换成字符串
// String request=new String(buff,0,len);
// //字符串的截取
// request=request.substring(0, request.indexOf("\r\n"));
// request=request.split(" ")[1];
// request=request.substring(1);
// System.out.println(request);
// //在服务器端查找该请求的资源是否存在,如果存在则输出给客户端,如果不存在给客户一个响应提示信息
// //把该资源包装成一个文件
// File file=new File("src/"+request);
// if(file.exists()) {
// //表示资源存在
// }else {//表示资源不存在
// //给客户端一个输出提示信息
// if(out!=null) {
// String info="<h1><font color='red'>对不起,您请求的网络资源不存在!</font></h1>";
// out.write(info.getBytes());
// }
//
// }
// out.close();
// in.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
第一章代码.rar
需积分: 0 104 浏览量
更新于2024-02-29
收藏 4.92MB RAR 举报
在IT行业中,编程是核心部分,而代码是程序员的语言。"第一章代码.rar"这个压缩包文件很可能是某个教学课程或项目的一部分,包含了学习编程或解决特定问题的第一阶段代码示例。接下来,我们将深入探讨编程的一些关键知识点,以及如何通过这些代码来学习和提升自己的技能。
1. **编程语言基础**:代码通常是用某种编程语言编写的,如Python、Java、C++或JavaScript等。了解所使用的编程语言的基本语法和特性至关重要,因为这决定了代码的结构和功能。例如,Python以其简洁易读的语法著称,而Java则强调面向对象的编程思想。
2. **变量与数据类型**:编程中的变量是存储信息的容器,可以是数字、字符串、布尔值或其他复杂的数据结构。理解各种数据类型(如整型、浮点型、字符串、列表、字典等)及其操作方法,是编写有效代码的基础。
3. **控制流**:包括条件语句(如if-else)和循环结构(如for和while)。这些允许程序根据特定条件执行不同路径,或者重复执行某段代码直到满足特定条件。
4. **函数与模块**:函数是代码的可重用单元,能封装特定任务。模块则是一组相关的函数和其他定义,可以被引入到不同的程序中。学习如何创建和调用函数,以及导入和使用外部模块,能提高代码的组织性和效率。
5. **错误与异常处理**:编程过程中难免会遇到错误,理解如何通过try-except语句捕获和处理异常,可以确保程序在出现问题时能够优雅地退出,而不是崩溃。
6. **调试技巧**:学会使用调试工具,如打印语句、断点、步进执行等,有助于找出并修复代码中的错误。此外,良好的编程习惯,如添加注释和保持代码整洁,也有助于调试。
7. **版本控制**:在实际项目中,使用像Git这样的版本控制系统管理代码至关重要。它允许团队协作,跟踪代码的历史变化,以及轻松回滚到任何历史版本。
8. **代码测试**:编写测试用例,确保代码的正确性是开发过程中的重要环节。单元测试、集成测试和验收测试都是保证代码质量的有效手段。
9. **软件设计原则**:遵循DRY(Don't Repeat Yourself)原则,使代码避免冗余;使用SOLID原则进行面向对象设计,可以使代码更具扩展性和维护性。
10. **算法与数据结构**:掌握常见算法(排序、搜索、图论等)和数据结构(栈、队列、树、图等)的概念和实现,是解决问题和优化性能的关键。
通过"第一章上课代码",我们可以实践上述概念,并逐步建立编程思维。每个子文件可能对应一个特定的主题或练习,通过阅读、理解和修改这些代码,可以加深对编程概念的理解,提升编程能力。同时,如果可能的话,将所学应用到实际项目中,将会是巩固知识和技能的最佳方式。