目录



这个肯定可以。三次握手都可以保证连接成功了,何况是四次,但是会降低传输的效率。


先运行服务端,在运行客户端 ,
package com.test.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//TCP协议Socket使用BIO进行通行:服务端
public class BIOServer {
// 在main线程中执行下面这些代码
public static void main(String[] args) {
//1单线程服务
ServerSocket server = null;
Socket socket = null;
InputStream in = null;
OutputStream out = null;
try {
server = new ServerSocket(8000);
System.out.println("服务端启动成功,监听端口为8000,等待客户端连接...");
while (true){
socket = server.accept(); //等待客户端连接
System.out.println("客户连接成功,客户信息为:" +
socket.getRemoteSocketAddress());
in = socket.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
//读取客户端的数据
while ((len = in.read(buffer)) > 0) {
System.out.println(new String(buffer, 0, len));
}
//向客户端写数据
out = socket.getOutputStream();
out.write("hello!".getBytes());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.test.io;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
//TCP协议Socket:客户端
public class Client01 {
public static void main(String[] args) throws IOException {
//创建套接字对象socket并封装ip与port
Socket socket = new Socket("127.0.0.1", 8000);
//根据创建的socket对象获得一个输出流
OutputStream outputStream = socket.getOutputStream();
//控制台输入以IO的形式发送到服务器
System.out.println("TCP连接成功 \n请输入:");
while(true){
byte[] car = new Scanner(System.in).nextLine().getBytes();
outputStream.write(car);
System.out.println("TCP协议的Socket发送成功");
//刷新缓冲区
outputStream.flush();
}
}
}
先运行服务端,在运行客户端 。测试结果发送成功:


先运行服务端,在运行客户端
//UDP协议Socket:服务端
public class Server1 {
public static void main(String[] args) {
try {
//DatagramSocket代表声明一个UDP协议的Socket
DatagramSocket socket = new DatagramSocket(8888);
//byte数组用于数据存储。
byte[] car = new byte[1024];
//DatagramPacket 类用来表示数据报包DatagramPacket
DatagramPacket packet = new DatagramPacket(car, car.length);
// //创建DatagramPacket的receive()方法来进行数据的接收,等待接收一个socket请
求后才执行后续操作;
System.out.println("等待UDP协议传输数据");
socket.receive(packet);
//packet.getLength返回将要发送或者接收的数据的长度。
int length = packet.getLength();
System.out.println("啥东西来了:" + new String(car, 0, length));
socket.close();
System.out.println("UDP协议Socket接受成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
//UDP协议Socket:客户端
public class Client1 {
public static void main(String[] args) {
try {
//DatagramSocket代表声明一个UDP协议的Socket
DatagramSocket socket = new DatagramSocket(2468);
//字符串存储人Byte数组
byte[] car = "UDP协议的Socket请求,有可能失败哟".getBytes();
//InetSocketAddress类主要作用是封装端口
InetSocketAddress address = new InetSocketAddress("127.0.0.1", 8888);
//DatagramPacket 类用来表示数据报包DatagramPacket
DatagramPacket packet = new DatagramPacket(car, car.length, address);
//send() 方法发送数据包。
socket.send(packet);
System.out.println("UDP协议的Socket发送成功");
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
先运行服务端,在运行客户端 。测试结果成功发送成功:

| 类名 | 用于 | 作用 |
|---|---|---|
| Socket | TCP协议 | Socket类同时工作于客户端和服务端,所有方法都是通用的,这个类三个主要作用,校验包信息,发起连接(Client),操作流数据(Client/Server) |
| ServerSocket | TCP协议 | ServerSocket表示为服务端,主要作用就是绑定并监听一个服务器端口,为每个建立连接的客户端“克隆/映射”一个Socket对象,具体数据操作都是通过这个Socket对象完成的,ServerSocket只关注如何和客户端建立连接 |
| DatagramSocket | ODP协议 DatagramSocket | 类用于表示发送和接收数据报包的套接字。 |
| DatagramPacket | ODP协议 | DatagramPacket 类用来表示数据报包,数据报包用来实现无连接包投递服务。 |
| InetAddress | IP+端口号 | Java提供了InetAddress类来代表互联网协议(IP)地址,InetAddress类没有提供构造器,而是提供了如下两个静态方法来获取InetAddress实例: |
| InetSocketAddress | IP+端口号 | 在使用Socket来连接服务器时最简单的方式就是直接使用IP和端口,但Socket类中并未提供这种方式,而是靠SocketAddress的子类InetSocketAddress来实现 IP 地址 + 端口号的创建,不依赖任何协议。 |




一、首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一
致、证书的公钥(RSA加密)等进行校验;
二、客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数使用公钥进行加密
(RSA加密);
三、消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;
四、发送给服务端,此时只有服务端(RSA私钥)能解密。
五、解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。
HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
| 类别 | 描述 |
|---|---|
| 1xx: | 指示信息–表示请求已接收,正在处理 |
| 2xx: | 成功–表示请求已被成功接收、理解、接受 |
| 3xx: | 重定向–要完成请求必须进行更进一步的操作 |
| 4xx: | 客户端错误–请求有语法错误或请求无法实现 |
| 5xx: | 服务器端错误–服务器未能实现合法的请求 |
| 状态码 | 描述 |
|---|---|
| 200: | 请求被正常处理 |
| 204: | 请求被受理但没有资源可以返回 |
| 206: | 客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。 |
| 301: | 永久性重定向 |
| 302: | 临时重定向 |
| 303: | 与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上 |
| 304: | 发送附带条件的请求时,条件不满足时返回,与重定向无关 |
| 307: | 临时重定向,与302类似,只是强制要求使用POST方法 |
| 400: | 请求报文语法有误,服务器无法识别 |
| 401: | 请求需要认证 |
| 403: | 请求的对应资源禁止被访问 |
| 404: | 服务器无法找到对应资源 |
| 500: | 服务器内部错误 |
| 503: | 服务器正忙 |
| 请求方式 | 描述 |
|---|---|
| GET: | 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器 |
| POST: | 用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。 |
| PUT: | 传输文件,报文主体中包含文件内容,保存到对应URI位置。 |
| HEAD: | 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有 > 效。 |
| PATCH: | 客户端向服务器传送的数据取代指定的文档的内容(部分取代) |
| TRACE: | 回显客户端请求服务器的原始请求报文,用于"回环"诊断 |
| DELETE: | 删除文件,与PUT方法相反,删除对应URI位置的文件。 |
| OPTIONS: | 查询相应URI支持的HTTP方法。 |
cookie是由Web服务器保存在用户浏览器上的文件(key-value格式),可以包含用户相关的信
息。客户端向服务器发起请求,就提取浏览器中的用户信息由http发送给服务器
session 是浏览器和服务器会话过程中,服务器会分配的一块储存空间给session。
服务器默认为客户浏览器的cookie中设置 sessionid,这个sessionid就和cookie对应,浏览器在向
服务器请求过程中传输的cookie 包含 sessionid ,服务器根据传输cookie 中的 sessionid 获取出
会话中存储的信息,然后确定会话的身份信息。
cookie与session区别
史上最全Java面试宝典,BAT大厂面试必备。整理不易,建议先关注点赞加收藏
| 序号 | 名称 | 地址 |
|---|---|---|
| 1 | Java基础面试题(91道含答案) | (点击查看) |
| 2 | Java并发编程面试题 (123道含答案) | (点击查看) |
| 3 | Java异常面试题 (33道含答案) | (点击查看) |
| 4 | Java虚拟机(JVM)面试题(51道含答案) | (点击查看) |
| 5 | Java集合面试题(52道含答案) | (点击查看) |
| 6 | Linux面试题(50道含答案) | (点击查看) |
| 7 | Memcache面试题(23道含答案) | (点击查看) |
| 8 | Mybatiss面试题 (37道含答案) | (点击查看) |
| 9 | MySQL面试题(40道含答案) | (点击查看) |
| 10 | Netty面试题(49道含答案) | (点击查看) |
| 11 | Nginx面试题(23道含答案) | (点击查看) |
| 12 | RabbitMQ面试题(22道含答案) | (点击查看) |
| 13 | Redis面试题(70道含答案) | (点击查看) |
| 14 | SpringBoot面试题(44道含答案) | (点击查看) |
| 15 | SpringCloud面试题(49道含答案) | (点击查看) |
| 16 | SpringMVC面试题(29道含答案) | (点击查看) |
| 17 | Spring面试题(75道含答案) | (点击查看) |
| 18 | TCP、UDP、Socket、Http网络编程面试题(47道含答案) | (点击查看) |
| 19 | Tomcat面试题(15道含答案) | (点击查看) |
| 20 | Zookeeper面试题(28道含答案) | (点击查看) |
| 21 | 多线程面试题(60道含答案) | (点击查看) |
| 22 | 设计模式面试题(14道含答案) | (点击查看) |
| 23 | BIO、NIO、AIO、Netty面试题(35道含答案) | (点击查看) |
| 24 | Dubbo面试题(47道含答案) | (点击查看) |
| 25 | ElasticSearch面试题(31道含答案) | (点击查看) |
| 26 | Git常用命令(63条) | (点击查看) |
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里