1-1 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序。具体如下:
(1)、Tom和Jerry聊天的双方都应该具有发送端和接收端;
(2)、利用DatagramSocket与DatagramPacket;
(3)、实现 java.lang.Runnable类,重写 run()方法。

我采用了四个java文件实现,也可创建内部内实现多线程:
JerryClient.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class JerryClient {public static void main(String[] args) throws IOException {/*RunnableJerry jerry = new RunnableJerry();jerry.run();*/new Thread(new RunnableJerry()).start();//System.out.println("send=======start");JerryClient jerryClient = new JerryClient();jerryClient.send();//System.out.println("send=====end");}public void send() throws IOException {DatagramSocket ds = new DatagramSocket();//通过DatagramSocket对象创建udp服务BufferedReader bufr =new BufferedReader(new InputStreamReader(System.in));//从键盘上面输入文本String line = null;while((line=bufr.readLine())!=null)//当输入不为空时{if("byebye".equals(line))//当输入为byebye时退出程序break;//确定好数据后,并把数据封装成数据包byte[] buf = line.getBytes();DatagramPacket dp =new DatagramPacket(buf,buf.length, InetAddress.getByName("localhost"),52014);//发送至指定IP,指定端口ds.send(dp);//通过send方法将数据包发送出去}}public void receive() throws IOException {//@SuppressWarnings("resource")DatagramSocket ds = new DatagramSocket(52013);//接收端监听指定端口while(true){//定义数据包,用于存储数据byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);ds.receive(dp);//通过服务的receive方法将收到数据存入数据包中,receive()为阻塞式方法//通过数据包的方法获取其中的数据String ip = dp.getAddress().getHostAddress();String data = new String(dp.getData(),0,dp.getLength());System.out.println("Tom: "+data);}}
}

Runnable.java

import java.io.IOException;public class RunnableJerry implements Runnable{@Overridepublic void run() {JerryClient jerryClient = new JerryClient();try {//System.out.println("receive=====start");jerryClient.receive();//System.out.println("receive=====end");} catch (IOException e) {e.printStackTrace();}}
}

TomClient.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class TomClient {public static void main(String[] args) throws IOException {/*RunnableTom tom = new RunnableTom();tom.run();*/new Thread(new RunnableTom()).start();TomClient tomClient = new TomClient();tomClient.send();}public void send() throws IOException {DatagramSocket ds = new DatagramSocket();//通过DatagramSocket对象创建udp服务BufferedReader bufr =new BufferedReader(new InputStreamReader(System.in));//从键盘上面输入文本String line = null;while((line=bufr.readLine())!=null)//当输入不为空时{if("byebye".equals(line))//当输入为byebye时退出程序break;//确定好数据后,并把数据封装成数据包byte[] buf = line.getBytes();DatagramPacket dp =new DatagramPacket(buf,buf.length, InetAddress.getByName("localhost"),52013);//发送至指定IP,指定端口ds.send(dp);//通过send方法将数据包发送出去}}public void receive() throws IOException {//@SuppressWarnings("resource")DatagramSocket ds = new DatagramSocket(52014);//接收端监听指定端口while(true){//定义数据包,用于存储数据byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);ds.receive(dp);//通过服务的receive方法将收到数据存入数据包中,receive()为阻塞式方法//通过数据包的方法获取其中的数据String ip = dp.getAddress().getHostAddress();String data = new String(dp.getData(),0,dp.getLength());System.out.println("Jerry:"+data);}}
}

RunnableTom.java

import java.io.IOException;public class RunnableTom implements Runnable {@Overridepublic void run() {TomClient tomClient = new TomClient();try {tomClient.receive();} catch (IOException e) {e.printStackTrace();}}
}

运行效果:

1-2 利用Java Socket编写一个简单的Web服务器,具体如下:
(1)、使用 ServerSocket 监听某一端口,然后等待连接获取 Socket对象;
(2)、创建一个类 HttpServer 继承 java.lang.Thread 类,重写 run()方法,执行浏览器请求;
(3)、获得浏览器请求,解析资源文件路径;
(4)、读取资源文件,响应给浏览器;
(5)、浏览器地址栏输入: http://localhost:8000/index.html;
(6)、效果如下:

需要注意的html位置信息,定义在public static final String ROOT

HttpServer.java

package q2;import java.io.*;
import java.net.Socket;public class HttpServer extends  Thread{/*** web资源根路径*/public static final String ROOT = "F:/code/Java_code/StudyCode/NetworkLab/Lab1/src/q2";/*** 输入流对象,读取浏览器请求*/private InputStream input;/*** 输出流对象,响应内容给浏览器*/private OutputStream out;public HttpServer(Socket socket) {try {input = socket.getInputStream();out = socket.getOutputStream();} catch (IOException e) {e.printStackTrace();}}/*** 多线程方法调用*/@Overridepublic void run() {String filePath = read();response(filePath);}private void response(String filePath) {File file = new File(ROOT + filePath);if (file.exists()) {// 1、资源存在,读取资源try {BufferedReader reader = new BufferedReader(new FileReader(file));StringBuffer sb = new StringBuffer();String line = null;while ((line = reader.readLine()) != null) {sb.append(line).append("\r\n");}StringBuffer result = new StringBuffer();result.append("HTTP /1.1 200 ok \r\n");result.append("Content-Type:text/html \r\n");result.append("Content-Length:" + file.length() + "\r\n");result.append("\r\n:" + sb.toString());out.write(result.toString().getBytes());out.flush();out.close();} catch (Exception e) {e.printStackTrace();}} else {// 2、资源不存在,提示 file not foundStringBuffer error = new StringBuffer();error.append("HTTP /1.1 400 file not found /r/n");error.append("Content-Type:text/html \r\n");error.append("Content-Length:20 \r\n").append("\r\n");error.append("<h1 >File Not Found..</h1>");try {out.write(error.toString().getBytes());out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}}private String read() {BufferedReader reader = new BufferedReader(new InputStreamReader(input));try {// 读取请求头, 如:GET /index.html HTTP/1.1String readLine = reader.readLine();String[] split = readLine.split(" ");if (split.length != 3) {return null;}System.out.println(readLine);return split[1];} catch (IOException e) {e.printStackTrace();}return null;}
}

WebServer.java

package q2;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class WebServer {public static void main(String[] args) {new WebServer().startServer(8000);}public void startServer(int port){try {@SuppressWarnings("resource")ServerSocket serverSocket = new ServerSocket(port);while(true){Socket socket = serverSocket.accept();new HttpServer(socket).start();}} catch (IOException e) {e.printStackTrace();}}
}

运行效果:

【计算机网络作业】Java UDP聊天 和 Socket编写一个简单的Web服务器相关推荐

  1. java实现web服务器_Java 实现一个简单的web服务器

    在日常的开发中,我们用过很多开源的web服务器,例如tomcat.apache等等.现在我们自己实现一个简单的web服务器,基本的功能就是用户点击要访问的资源,服务器将资源发送到客户端的浏览器.web ...

  2. http服务器响应格式,熟悉Http协议的请求和响应格式,编写一个简单的Http服务器。 基本要求:1 正确解...

    熟悉Http协议的请求和响应格式,编写一个简单的Http服务器. 基本要求: 1 正确解 2016-08-23 0 0 0 暂无评分 其他 1 积分下载 如何获取积分? 熟悉Http协议的请求和响应格 ...

  3. 如何用socket构建一个简单的Web Server

    2019独角兽企业重金招聘Python工程师标准>>> 背景 现代社会网络应用随处可见,不管我们是在浏览网页.发送电子邮件还是在线游戏都离不开网络应用程序,网络编程正在变得越来越重要 ...

  4. linux下udp实现聊天软件,socket实现一个简单的对话聊天软件

    socket可以在网络间进行通信, 基本上有两种通信协议, 一种是TCP, 一种是UDP. UDP是一种面向无链接的通信协议, 通信前无需与对端建立连接. 只要有目的ip地址和port端口, 就可以将 ...

  5. 新建maven写页面_使用 IDEA 创建 Maven Web 项目 (三)- 编写一个简单的 WEB 应用

    编写 Servlet 类 首先,需要在 java 目录下,创建一个名为 org.smart4j.chapter1 的包.然后,在该包下创建一个 HelloServlet  的类,代码如下: packa ...

  6. c++编写一个简单的Http服务器

    1.http协议格式 请求: 首行:方法 + url + 版本号(/favicon.ico???) Header:请求的属性,冒号分割的键值对,每组属性用 \n 分割,遇空行结束 body:空行后面都 ...

  7. 编写简单的WEB服务器

    一.背景 我们都知道使用浏览器访问网址的方法,将网址输入进地址框中就会显示出相应的文字.图片.视频等信息.实际上基于socket的客户/服务器原理是相似的,虽然可能承载信息的载体不同,但其背后的原理是 ...

  8. 使用Java编写一个简单的 JFrame登陆注册界面(一)

    使用Java awt 及 Swing 组件编写一个简单的JFrame登陆注册界面. 示例: 下面开始介绍如何编写. 通过调用实例化一个JFrame框架,在框架内嵌入JPanel,在JPanel上进行添 ...

  9. rust服务器配置文件,使用Rust编写一个简单的Socket服务器(1):Rust下的配置载入...

    前言 早在2020年12月的时候,那会儿我正在看The Rust Programming Language.而这本书最后的"结业"任务是要编写一个简单的Socket服务器,而于此同 ...

最新文章

  1. 学习asp.net ajax 笔记(一)
  2. word-breakword-wrap
  3. boost::uuid模块实现不同形式随机生成器的基准的测试程序
  4. 访问 Neutron 外部网络 - 每天5分钟玩转 OpenStack(143)
  5. 第43课 最大公约数 《小学生C++趣味编程》
  6. PB市净率,PE市盈率
  7. 语言压缩zip win_主流压缩软件挨个尝试后,我选择了没有短板的全能压缩Bandizip...
  8. 昨晚调试一段PHP程序时遇到的三个问题
  9. 从时分复用、频分复用到码分复用(CDMA)
  10. 使用Astah画UML类图经验总结
  11. 四大逆向工程软件简介
  12. 不用登陆QQ也能使用QQ截图工具
  13. 内存管理之内存映射——概述
  14. 2021年CFA全套资料无偿分享|备考经验|备考计划
  15. Python-QQ聊天记录分析-jieba+wordcloud
  16. C/C++语言编程规范
  17. 从零使用okhttp和gson解析聚合数据的新闻头条API
  18. Python坦克大战小游戏(三):背景
  19. 小高不太行之前端--JSON
  20. AutoCAD各版本对应的R版本参数值及其对应注册表中的数值(2002-2023)

热门文章

  1. 3 分钟带你深入了解 Cookie、Session、Token
  2. 机器学习2-线性回归
  3. 中汇(天津)税务师事务所
  4. 烤仔头条 | 你爱我,我爱你,百亿豪猫,喵喵喵~
  5. CSS3 3D旋转动画
  6. java zipfile entries_Java ZipFile.getEntries方法代碼示例
  7. php mysql安装包_apache php mysql集成开发环境
  8. 狂神说java spring篇 学习笔记
  9. html——搜索结果简单ListView展示页面
  10. 最简单的用js模拟计算器进行计算(初级)