Java编程利用socket多线程访问服务器文件代码示例
作者:ysk_xh_521 发布时间:2023-10-11 15:36:37
标签:java,socket,多线程
这篇文章将向大家展示Java编程利用socket多线程访问服务器文件代码示例,如果您想先了解Java多线程socket编程的基础知识,可以看下这篇文章:Java多线程编程实现socket通信示例代码。
接下来进入正文,我们看看利用socket多线程访问服务器代码:
ServerMain.java
package com.ysk.webServer;
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerMain {
static boolean start = true;
public static void main(String[] args) {
// 1.声明所用的对象
// ServerSocket
// Socket
// BufferedReader
// PrintStream 因为这个流是用来按照http相应规则返回数据给浏览器的,
// http响应规则中可能既要写字符又要写字节 所以使用这个流
try {
// 2 赋值,为try catch语句块外面的变量赋值
ServerSocket serverSocket = new ServerSocket(7878);
while (true) {
while (start) {
System.out.println("服务端已启动,等待客户端连接。。");
Socket socket = serverSocket.accept();
System.out.println("客户端已连接");
Thread thread = new ServerThread(socket);
thread.start();
}
// 3 处理请求,即从socket中拿出浏览器按照http协议封装好的请求(字符串)
// 关心请求行
// 按照空格拆分字符串,拆出来的第一部分是请求方式
// 拆出来的第二部分是资源路径
// 4 处理响应
// 如果 请求方式 是GET即代表没有请求体
// 从请求行中寻找到要访问的文件
// 从本地目录下查找(不是遍历整个文件系统
// 代表着我们要定义一个目录位置,此位置为数据仓库,
// 专门来存放客户端可能会访问的数据
// 咱们暂定这个目录为“项目/files”)
// 看看是否有此文件,对于/ 资源特殊处理,代表
// 如果有文件,利用输出流,把数据拼成http响应格式的数据,
// 返回给客户端(数据找到了,响应码200)
// 如果没有文件,返还error.html文件(代表比较友好的提示方式),
// 也得按照http响应格式返还error.html
}
// 如果是post方式,暂不处理
} catch (Exception e) {
}
}
// 关闭资源
// 什么时候关服务器,什么时候关客户端
}
ServerThread.java
package com.ysk.webServer;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class ServerThread extends Thread {
// 和本线程相关的Socket
Socket socket = null;
BufferedReader in = null;
BufferedReader inerror = null;
PrintStream out = null;
static boolean result = false;
static String filepath = "";
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String temp = in.readLine();
if (temp != null) {
ServerMain.start = false;
String method = temp.split(" ")[0];
System.out.println(method);
String filename = temp.split(" ")[1].replaceAll("/", "");
System.out.println(filename);
String path = "files";
findFile(path, filename);
System.out.println("result:" + result);
if (result) {
// 找到文件,以字节方式去读
String resource = filepath + filename;
getResource(resource);
} else {
// 返回error.html
String resource = "files\\error.html";
getResource(resource);
}
}
} catch (Exception e) {
} finally {
try {
if (out != null)
out.close();
if (inerror != null)
inerror.close();
if (in != null)
in.close();
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//通过流去读文件
private void getResource(String resource) {
try {
FileInputStream fileInputStream = new FileInputStream(resource);
out = new PrintStream(socket.getOutputStream(), true);
out.println("HTTP/1.1 200 ok");
out.println();
int inttemp;
while ((inttemp = fileInputStream.read()) != -1) {
out.write(inttemp);
}
out.flush();
fileInputStream.close();
ServerMain.start = true;
result = false;
} catch (Exception e) {
}
}
// 查找文件
private static void findFile(String path, String filename) throws IOException {
File file = new File(path);
File[] tempList = file.listFiles();
System.out.println("该目录下对象个数:" + tempList.length);
for (int i = 0; i < tempList.length; i++) {
if (tempList[i].isFile() && filename.equals(tempList[i].getName())) {
System.out.println("已找到该文件:" + filename);
filepath = path + "\\";
result = true;
} else if (tempList[i].isDirectory()) {
// 读取某个文件夹下的所有文件夹
System.out.println("读取某个文件夹下的所有文件夹");
findFile(tempList[i].getParent() + "\\" + tempList[i].getName(), filename);
}
}
}
}
来源:http://blog.csdn.net/ysk_xh_521/article/details/77460856


猜你喜欢
- 文件移动是计算机资源管理常用的一个操作,这在操作系统中可以通过文件的剪切与复制或鼠标拖动来实现。但是在Java文件的编程实现中,大多是通过复
- 本文实例讲述了Android中SeekBar和RatingBar用法。分享给大家供大家参考,具体如下:什么是SeekBar?可以拖动的进度条
- 本文实例讲述了C#实现的文件操作封装类。分享给大家供大家参考,具体如下:最近发现群共享里面有个C# 文件操作封装类,其方法是调用Window
- 1.Overview经常研究.NET源码库的小伙伴会经常看到一个关键字volatile,那它在开发当中的作用是什么呢?我们一起来看看官方文档
- 1.aar包是android studio下打包android工程中src、res、lib后生成的aar文件,aar包导入其他android
- 本文实例讲述了C#实现缩放字体的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Colle
- 本文实例讲述了Android DatePicker和DatePickerDialog基本用法。分享给大家供大家参考,具体如下:DatePic
- 一、Spring Bean 集合注入在【Spring学习笔记(三)】已经讲了怎么注入基本数据类型和引用数据类型,接下来介绍如何注入比较特殊的
- 在C#中,可以使用一些第三方库或内置类库实现动态执行脚本的功能。以下是几个常用的方案:1.使用Roslyn编译器Roslyn是微软推出的一个
- 1.加入jackson的jar包2.在响应的方法上加上@ResponseBody:把java对象转化为json对象3.方法的返回值可以是对象
- 背景相信大家对Android Studio已经不陌生了,Android Studio是Google于2013 I/O大会针对Android开
- 继上一次利用Servlet实现图片上传,这次利用基于MVC的Struts框架,封装了Servlet并简化了JSP页面跳转。JSP上传页面上传
- Ping pingSender = new Ping(); PingReply reply = pingSender.Send("
- 二分查找算法的思想很简单,《编程珠玑》中的描述: 在一个包含t的数组内,二分查找通过对范围的跟综来解决问题。开始时,范围就是整个
- @ConditionalOnProperty作用及用法在spring boot中有时候需要控制配置类是否生效,可以使用@Conditiona
- 目录前言:一、IronPython二、Python打包exe调用三、Python提供WebApi接口(推荐)总结:前言:在平时工作中,需求有
- 本文实例讲述了Java使用自定义注解实现为事件源绑定事件 * 操作。分享给大家供大家参考,具体如下:一 定义注解import java.la
- jmap命令可以打印java进程的JVM堆信息,今天在某台机器上运行该命令查看 19560进程的堆信息jmap -heap 19560出现以
- 本文实例讲述了Android中Market的Loading效果实现方法。分享给大家供大家参考。具体如下:在Android中,要实现Loadi
- 1.导入相关jar包,具体哪些包我记不太清了2.在applicationContext中加入相关配置信息,如下所示:<beans xm