TCP通信, javaWeb 基于Http通信的
概念比较重要
网络: 两台或者多台电脑之间能够通信: 广域网(外网), 局域网(内网)
TCP/IP协议(定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准):
IP: ip地址, 电脑的一个唯一地址, 方便电脑之间通信, ip地址唯一
四个字节, 每个字节使用 "."分割: 每一位的范围: 0~255
方便记忆: 使用域名(英文符号) 替换ip, 映射: www.baidu.com
域名: 绑定一个ip 14.215.177.39, 访问百度: 根据ip访问,
IP: 确定与那台电脑通信
底层: 把域名转换为ip地址
端口: 端口号, 0~65535个 , 与这个台电脑的那个程序通信
0-1023是公认端口号,即已经公认定义或为将要公认定义的软件保留的
1024-65535是并没有公共定义的端口号,用户可以自己定义这些端口的作用。8888 8090 9999 7777
http: 默认端口: 80
https: 默认端口: 443
mysql的默认端口: 3306
端口: TCP: 0~65535 UDP:0~65535
TCP: 面向连接的可靠的连接,基于字节流
TCP通信的时候:
发送据之前, 与对方建立一个连接, 三次握手机制
Socket编程: Socket (客户端的套接字) ServerSocket(服务端的套接字(Socket))
当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取(字节流)来进行通信。
流式套接字: TCP, 面向连接
Socket socket = new Socket("127.0.0.1",8888);
4、UDP通信
数据报套接字: 面向无连接
Socket socket = new Socket("127.0.0.1",8888);
ServerSocket serverSocket = new ServerSocket(8888); Socket client = serverSocket.accept();//阻塞 System.out.println("有客户端连接");
OutputStream out = socket.getOutputStream(); BufferedWriter bw = null; bw = new BufferedWriter(new OutputStreamWriter(out)); //发送数据 Scanner input = new Scanner(System.in); bw.write(input.next()); //input.next() 阻塞 bw.newLine(); //写了换行符 bw.flush(); //刷新缓存区
InputStream in = socket.getInputStream(); BufferedReader br = null; br = new BufferedReader(new InputStreamReader(in)); String line = br.readLine(); //阻塞方法, 读到行结尾 换行符 System.out.println("服务端说:"+line);
//关闭资源 bw.close(); br.close(); client.close(); serverSocket.close();
关闭资源过多且重复时
/**
* 关闭资源的方法
*/
public class CloseUtil {
public static void close(Closeable... closeables){
//判断closeables创建出来
if(closeables != null && closeables.length > 0){
for (Closeable closeable : closeables) {
if(closeable != null){
try {
closeable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
/**
* 发送工具类
*/
public class SendUtil {
public static void send(BufferedWriter bw, String content) throws IOException {
bw.write(content);
bw.newLine();
bw.flush();
}
}
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/**
* 服务器
*/
public class Server {
private static List<String> nameList = new ArrayList<>();
public static void main(String[] args) {
try {
//1.开启服务器
ServerSocket serverSocket = new ServerSocket(8888);
//2.等待客户端的连接
while(true){
Socket client = serverSocket.accept();
//读取指令
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
String flag = br.readLine();
switch (flag){
case "1":
//处理上传
doUpload(client);
break;
case "2":
//处理在想阅读
doReadOnLine(client);
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
//处理在线阅读
private static void doReadOnLine(Socket client) {
}
//处理上传
private static void doUpload(Socket client) {
//网络IO
BufferedReader br = null;
BufferedWriter bw = null;
//本地输出流
BufferedWriter bw2 = null;
try {
//ctrl+alt+T 包裹指定代码块
br = new BufferedReader(new InputStreamReader(client.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
//1.发送"请输入上传的小说名"
SendUtil.send(bw,"请输入上传的小说名");
//2.接收小说名 并保存
String name = br.readLine();
nameList.add(name);
//3.创建本地输出流,追加模式
//完善, 先判断服务器的保存小说目录是否存在, 如果不存在,创建目录
bw2 = new BufferedWriter(new FileWriter("d:/test/"+name+".txt",true));
//4.循环接收客户端上传的内容,写入到文件
String line = null;
while(!(line = br.readLine()).equals("exit")){ //不等于exit
//写入到文件
SendUtil.send(bw2,line);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
//5.关闭资源
CloseUtil.close(bw2,bw,br,client);
}
}
}
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
* 客户端
*/
public class Client {
Scanner input = new Scanner(System.in);
public static void main(String[] args) {
new Client().showEmun();
}
/**
* 显示菜单
*/
public void showEmun(){
System.out.println("欢迎访问Xxxx小说网站");
System.out.println("\t1.上传小说");
System.out.println("\t2.在线阅读");
System.out.println("请选择:");
int choose = input.nextInt();
switch(choose){
case 1:
//上传小说
upload(1);
break;
case 2:
//在线阅读
break;
}
}
/**
* 上传小说
* @param i
*/
private void upload(int i) {
Socket socket = null;
//网络IO
BufferedReader br = null;
BufferedWriter bw = null;
//本地输入流
BufferedReader br2 = null;
try {
//1.连接服务器
socket = new Socket("127.0.0.1",8888);
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//发送上传的指令
SendUtil.send(bw,i+"");
//2.接收服务器的信息
String info = br.readLine();
System.out.println(info);
//3.输入小说名
String name = input.next();
SendUtil.send(bw,name);
//4.使用本地输入流,读取客户端的硬盘上小说
br2 = new BufferedReader(new FileReader("d:/upload/"+name+".txt"));
//5.循环读取
String line = null;
while((line = br2.readLine()) != null){ //读到文件末尾
//6.把读到的一行数据发送给服务器
SendUtil.send(bw,line);
}
//7.小说上传完成, 发送一个exit.告诉服务器已结束
SendUtil.send(bw,"exit");
} catch (IOException e) {
e.printStackTrace();
}finally {
//8.关闭资源
CloseUtil.close(br2,bw,br,socket);
}
//回到菜单
showEmun();
}
}
new Vue({el: '#app',data(){results: []}});我正在尝试使用Sweet Alert显示警报,并在顶部输入搜索过滤器,然后我想根据警报中输入的内容过滤结果.问题是,Vue指令似乎没有在Sweet Alert中生效 – 可能是因为它不在#app的范围内.令我惊讶的是,我没有看到太多的问题,所以我认为我只是做错了什么.有没有办法在Sweet Alert的标记中使用V...
使用词表,遍历替换文章单词,再进行词频统计要求去除介词等无用单词单词单复数,动词不同时态等合并代码import java.awt.print.Printable;import java.io.RandomAccessFile;import java.util.ArrayList;import java.util.Collections;import java.util.Com...
&lt;!DOCTYPE html&gt;&lt;html lang="en"&gt;&lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt; &
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……这个数列从第3项开始,每一项都等于前两项之和。如果设F(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式::F(n)=F(n-...
harbor webook 从原理到构建
1.from matplotlib import pyplot Matplotlib是python的一个绘图库,是Python中最常用的可视化工具之一。 matplotlib是受MATLAB的启发构建的,matplotlib有一套完全仿照MATLAB的函数形式的绘图接口。 matplotlib.pyplot模块中,这套函数接口方便MATLAB用户过度到matplotlib包。简述一下绘图过程:fig = pyplot.figure() #在任何绘图之前,需要一个Figure对象。Figure可
OpenCV3.4.10+opencv_contrib编译最近做图像匹配需要用到feature2d功能,原本在opencv2.x里是封装好的,在opencv3里由于知识产区问题单独封装到opencv_contrib中了,WTF用这么长时间opencv3了居然没发现这个问题,用习惯了opencv官网提供的opencv2的win版本,突然需要编译源码还真有点不习惯,踩了个大坑好几天编不出来,给大家分享一下防止掉入深坑。1. 源码2.CMake3.运行VS4.常见错误/****************
原因是自己把一段html加入到它弹框中显示它是一个表单内容,但是我通过jquery取值的时候死活取不到选中后的值不管是原生还是jq都取不到 //获取发布类型 let type = $(" select[name='type']").val(); var myselect = document.querySelector('#type'); var index = myselect.selectedIndex; //获
要想让你的IDE支持velocity肯定是要装个支持velocity的插件,这里介绍的是:让Myeclipse支持velocity注:如下步骤都是按照本人自己的环境来操作,如安装计目录和版本不同,请按以下照葫芦画瓢,道理是一样的。IDE:Myeclipse for spring 9.1安装目录为:E:\Program Files\ 第一步: 通
《C语言深度剖解》链接:https://pan.baidu.com/s/1VC0ssjR1k2TLUOa7EXWIqg提取码:vs1p
PowerDesigner简单使用教程一、安装文件二、使用方法1.生成工作空间2.建立表3.设计表4.查看表SQL语句一、安装文件https://pan.baidu.com/s/1_BaCdk-bcDG5EnRq469JRg下载,解压,分为主体安装软件,破解软件和汉化包,内附readme。二、使用方法1.生成工作空间菜单栏选择:File→New,然后:2.建立表点击右上角表格样子...