Java基础23 Socket手撸应用服务器

public static final int PORT = 8888;

public void start(){

System.out.println(“启动服务器。。。”);

//创建ServerSocket对象

try {

ServerSocket server = new ServerSocket(PORT);

//循环获得客户端连接

while(true){

Socket client = server.accept();

System.out.println(client.getInetAddress()+“连接了”);

//获得客户端的输入流和输出流

try(DataInputStream dis = new DataInputStream(client.getInputStream());

DataOutputStream dos = new DataOutputStream(client.getOutputStream())){

//读取客户端的消息

System.out.println(“客户端”+client.getInetAddress()+“说:”+dis.readUTF());

//给客户端发消息

dos.writeUTF(“我是服务器端,客户端你好啊~~~~~~~~~~~~~~~~”);

}catch(IOException ex){

ex.printStackTrace();

}

}

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

new Server().start();

}

}

客户端实现步骤:

  1. 创建Socket对象

  2. 调用Socket对象的getInputStream来读取数据。

  3. 调用Socket对象的getOutputStream来发送数据。

public class Client {

public void sendMessage(String ip,int port,String msg){

//创建Socket对象,连接服务器端

try {

Socket socket = new Socket(ip,port);

//获得输出流和输入流

try(DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

DataInputStream dis = new DataInputStream(socket.getInputStream())){

//发送数据给服务器端

dos.writeUTF(msg);

//读取服务器端的消息

System.out.println(“服务器端说:”+dis.readUTF());

}catch(Exception ex){

ex.printStackTrace();

}

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

new Client().sendMessage(“192.168.53.5”, 8888,

“你好!!!服务器端”);

}

}

Socket实现文件上传


文件的上传的步骤

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IimwXFK3-1611022265375)(Socket.assets/clipboard-1610675065080.png)]

服务器端:

  1. 创建ServerSocket

  2. 调用accept获得客户端Socket

  3. 定义字节数组

  4. 创建文件输出流,获得客户端输入流

  5. 循环读取输入流的字节,写入到文件输出流

客户端:

  1. 创建Socket

  2. 获得socket对象输出流

  3. 创建文件输入流

  4. 循环读取文件输入流字节,写入到输出流

public class FileServer {

public static final int PORT = 8888;

public static final String DIR = “C:\upload\”;

public void start(){

System.out.println(“start…”);

//创建服务器端对象

try (ServerSocket server = new ServerSocket(PORT)😉{

//调用accept接受客户端连接

while(true){

Socket socket = server.accept();

//创建文件输出流和网络输入流

try(ObjectInputStream in = new ObjectInputStream(

socket.getInputStream());

//读取客户端发来的文件名,创建文件输出流

OutputStream out =

new FileOutputStream(DIR+in.readUTF())😉{

//从网络中读取数据,写入到本地磁盘

int len = 0;

byte[] buffer = new byte[1024];

while((len = in.read(buffer)) != -1){

out.write(buffer, 0, len);

}

System.out.println(“服务器保存完毕”);

}catch(IOException ex){

ex.printStackTrace();

}

}

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

new FileServer().start();

}

}

public class FileClient {

/**

  • 发送文件

*/

public void sendFile(String ip,int port,String path){

File file = new File(path);

//创建连接,创建文件输入流,网络输出流

try(Socket socket = new Socket(ip,port);

InputStream in = new FileInputStream(path);

ObjectOutputStream out = new ObjectOutputStream(

socket.getOutputStream())){

//先发送文件名给服务器

out.writeUTF(file.getName());

out.flush();

//读取本地文件数据,写入到网络输出流中

int len = 0;

byte[] buffer = new byte[1024];

while((len = in.read(buffer)) != -1){

out.write(buffer, 0, len);

}

System.out.println(“客户端发送完毕”);

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

new FileClient().sendFile(“127.0.0.1”, 8888,

“D:\java_code\Test10.java”);

}

}

Socket实现模拟服务器


在这里插入图片描述

HTML服务器的简单工作原理:

  1. 用户在浏览器输入URL地址

  2. 浏览器发送请求给服务器

  3. 服务器从请求头中解析信息:请求方法、URL等

  4. 从URL中解析到资源名称,就到服务器上查找HTML文件

  5. 服务器发送响应状态给浏览器

  6. 服务器发送响应头给浏览器

  7. 服务器开始发送HTML文件的内容

  8. 浏览器接收到HTML内容渲染出来

/**

  • 模拟服务器

*/

public class MyTomcat {

private static final int PORT = 8888;

private static final String WEB_DIR = “D:/webapps”;

public void start(){

//创建服务端Socket

try(ServerSocket server = new ServerSocket(PORT)){

System.out.println(“服务器启动了。。。。”);

while(true){

//接受客户端连接

Socket client = server.accept();

//读取浏览器的请求

service(client);

}

} catch (IOException e) {

e.printStackTrace();

}

}

//服务客户端

public void service(Socket client){

//获得客户端的输入流和输出流

try(BufferedReader reader = new BufferedReader(

new InputStreamReader(client.getInputStream()));

BufferedOutputStream writer = new BufferedOutputStream(

client.getOutputStream())){

//读取客户端的请求信息

String request = reader.readLine();

if(request == null){

return;

}

System.out.println(request);

//将请求进行分割

String[] requests = request.split("\ ");

if(requests.length < 2){

return;

}

//通过请求头中的路径查找文件

String path = requests[1];

File file = new File(WEB_DIR+path);

if(!file.exists()){

//如果不存在,就发送404错误

writer.write(“HTTP/1.1 404 NOT FOUND\r\n”.getBytes());

}else{

//如果存在,就发送200

writer.write(“HTTP/1.1 200 OK\r\n”.getBytes());

//读取本地HTML文件的内容

BufferedReader br = new BufferedReader(new FileReader(file));

StringBuilder strb = new StringBuilder();

String line = null;

while((line = br.readLine()) != null){

strb.append(line);

}

br.close();

String html = strb.toString();

System.out.println(“html–>”+html);

//发送响应头给客户端

String header = “Content-Type:text/html;charset=utf-8\r\n”

  • “Content-Length:”+html.getBytes(“UTF-8”).length+“\r\n”;

writer.write(header.getBytes());

//正文和响应头之间发送分割符号

writer.write(new byte[]{10,13},0,2);

//发送正文

writer.write(html.getBytes(“UTF-8”));

System.out.println(“发送完毕!”);

}

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

MyTomcat myTomcat = new MyTomcat();

myTomcat.start();

}

}

在D:/webapps下添加hello.html文件,启动服务器

在浏览器输入测试:http://localhost:8888/hello.html

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
厂,18年进入阿里一直到现在。**

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-dKMxmqJ6-1715727530999)]

[外链图片转存中…(img-v50xm10x-1715727531000)]

[外链图片转存中…(img-Ko01UaF9-1715727531000)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值