-
2011-09-20 18:54:27
今天写程序的时候遇到了一件非常奇怪的事,客户端跟服务器用SOCKET连接时,程序很奇怪的会卡死,而且不报错,DEBUG一天一直找不到错误,单步运行到 新建IO流的地方时,程序就不能继续往下走,而且不会报错,搞了一整天,不管是服务器端还是客户端都死在新建IO流的地方。。。
后来又百度了一下,改了客户端新建IO流的顺序,竟然就好了OTL……又欣喜有抓狂……
再后来,才搞清楚是自己太粗心忘了最重要的一点。。。 今天必须整理下,吃一堑长一智。。
如果服务器和客户端是通过IO流来通信的话,新建流的顺序必须是 相反的!
比如说 服务器端 建流的顺序是:
输出流ObjectOutputStream clientOutput = new ObjectOutputStream(socket.getOutputStream());
输入流ObjectInputStream clientInput = new ObjectInputStream(socket.getInputStream());那么客户端建立流的顺序必须是
输入流 ObjectInputStream clientInput = new ObjectInputStream(socket.getInputStream());
输出流ObjectOutputStream clientOutput = new ObjectOutputStream(socket.getOutputStream());
如果顺序不相反的话,就会出现奇怪的卡死,并且不报错!!
其实这也很容易理解,因为服务端的输出流 连接 的是 客户端的输入流 客户端的输出流 连接的是服务端的输入流
所以要是建流的顺序一样的话,就不能连接到对方的流了!!
除了IO流的顺序要注意,还有几个顺序也是要相反的
比如关闭流的顺序 要从最底层的开始close, 再关闭封装它的高级流
关闭数据库的也是 要先关闭ResultSet 再关闭Statement 再关闭数据库连接Connection。
更多相关内容 -
Netty客户端发送数据给服务器的两个通道
2019-07-11 23:36:02package zhangphil.nettysender;...import java.io.DataInputStream; import java.net.ServerSocket; import java.net.Socket; import java.sql.Date; import java.text.SimpleDateFormat; import io.netty.bootstr...package zhangphil.nettysender; import java.io.DataInputStream; import java.net.ServerSocket; import java.net.Socket; import java.sql.Date; import java.text.SimpleDateFormat; import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerAdapter; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.codec.json.JsonObjectDecoder; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; import io.netty.util.CharsetUtil; public class App { private int SERVER_PORT = 20000; public App() throws Exception { new Server().start(); connectServer(); } // Netty作为客户端,发起对服务器端的连接请求。 private void connectServer() { EventLoopGroup group = new NioEventLoopGroup();// 设置的连接group。 Bootstrap bootstrap = new Bootstrap().group(group).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000) // 超时时间。 .channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new JsonObjectDecoder()); ch.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8));// String解码。 ch.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));// String解码。 ch.pipeline().addLast(new MyChannelHandlerAdapter());// } }); try { System.out.println("客户端连接服务器..."); ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", SERVER_PORT) .addListener(new ChannelFutureListener() { public void operationComplete(ChannelFuture future) throws Exception { if (future.isSuccess()) { // 第一种方法。 // Netty在这里发送数据。 // sendDataToServer(future.channel()); } } }).sync(); // 等待连接关闭。 channelFuture.channel().closeFuture().sync(); } catch (Exception e) { e.printStackTrace(); } } /** * 发送数据到服务器端。 * * @throws Exception */ private void sendDataToServer(Channel channel) throws Exception { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat sdf = new SimpleDateFormat("MM-dd,HH:mm:ss:SSS"); while (true) { date.setTime(System.currentTimeMillis()); channel.writeAndFlush("客户端@" + sdf.format(date)); System.out.println("客户端发送数据:" + sdf.format(date)); Thread.sleep(1000); } } private class MyChannelHandlerAdapter extends ChannelHandlerAdapter { // 连接激活。 @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { super.channelActive(ctx); System.out.println("channelActive:" + ctx.channel().remoteAddress()); // 第二种方法。 // 连接可用激活后,Netty开始往服务器端发送数据。 sendDataToServer(ctx.channel()); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { super.channelInactive(ctx); System.out.println("channelInactive:" + ctx.channel().remoteAddress()); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { super.channelRead(ctx, msg); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { super.channelReadComplete(ctx); System.out.println(ctx.channel().remoteAddress() + "读写完成"); } } public static void main(String[] args) { try { new App(); } catch (Exception e) { e.printStackTrace(); } } // 服务器端。演示作为服务器接受来自客户端的数据。 private class Server extends Thread { private ServerSocket serverSocket; public Server() throws Exception { serverSocket = new ServerSocket(SERVER_PORT); } @Override public void run() { try { System.out.println("服务器启动..."); Socket socket = serverSocket.accept(); System.out.println("服务器接受连接"); DataInputStream dis = new DataInputStream(socket.getInputStream()); byte[] buffer = new byte[256]; int c = 0; while (true) { c = dis.read(buffer); System.out.println("服务器端收到数据:" + new String(buffer, 0, c)); } } catch (Exception e) { e.printStackTrace(); } } } }
-
java一个简单的客户端向服务端发送消息
2021-03-14 20:32:24java一个简单的客户端向服务端发送消息客户端代码:package com.chenghu.tcpip;import java.io.IOException;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;//客户端public class...java一个简单的客户端向服务端发送消息
客户端代码:
package com.chenghu.tcpip;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
//客户端
public class TcpClientDemo01 {
public static void main(String[] args) {
Socket socket=null;
OutputStream os=null;
try {
//服务器ip
InetAddress serverIP=InetAddress.getByName("127.0.1");
//端口
int port=9999;
//创建链接
socket=new Socket(serverIP,port);
//发送消息 io流
os=socket.getOutputStream();
os.write("你好!".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {//关闭资源
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
服务端代码:
package com.chenghu.tcpip;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public class TcpServerDemo01 {
public static void main(String[] args) {
ServerSocket serverSocket=null;
Socket socket=null;
InputStream is=null;
ByteArrayOutputStream bas=null;
try {
//需要 一个地址
serverSocket= new ServerSocket(9999);
while(true) {
//等待客户端连接
socket = serverSocket.accept();
//读取客户端的消息
is = socket.getInputStream();
//管道流
bas = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
bas.write(buffer, 0, len);
}
System.out.println(bas.toString());
}
} catch (IOException ex) {
ex.printStackTrace();
}finally {//关闭资源
if (bas != null) {
try {
bas.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
总结一下 :
客户端:
连接服务器Socket
发送消息
服务器
建立服务端口
等待用户连接accept();
接收消息
-
IO复用服务器linux C语言开发的包含客户端
2011-11-17 17:54:371,服务与客户端以两种格式进行数据发送,一个是以char数组,一个是以struct(就在头文件以内) 2,使用了IO复用(select监测)进行服务器编程 3,服务器总共使用一个进程,两个线程。(代码注解实际项目之中,以四... -
(客户端)发送请求====>(到服务器端) 过程分析
2020-09-23 20:49:05第一阶段: 客户端发送请求 通过DNS解析找到具体的ip地址和端口号 第二阶段: webserver(Tomca中间件)----->DispatcherServlet 第三阶段:springmvc处理请,求并响应结果返还给客户端 第一阶段 :DNS映射 具体什么是...总过程
第一阶段: 客户端发送请求 通过DNS解析找到具体的ip地址和端口号
第二阶段: webserver(Tomca中间件)----->DispatcherServlet
第三阶段:springmvc处理请,求并响应结果返还给客户端第一阶段 :DNS映射
具体什么是DNS?
DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译官”,有人说DNS就是一个本大得电话本,说的也挺贴切 它的基本工作原理可用下图来表示。
Dns服务的工作过程
我们在浏览器访问www.baidu.com这个域名,dns怎么查询到这台主机那?
1、在浏览器中输入www.baidu.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个ip地址映射,完成域名解析。
2、如果hosts里没有这个域名的映射,则会查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析记过给客户端,完成域名解析,此解析具有权威性。
4、如果要查询域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
5、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(baidu.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找baidu.com域服务器,重复上面的动作,进行查询,直至找到www.baidu.com主机。
6、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把请求转至上上级,以此循环。不管是本地DNS服务器用是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
DNS域名
第二阶段: webserver(Tomca中间件)----->DispatcherServlet
客户端访问网址,服务器端页面响应 --------通过sts断点分析
1.初始化会开启一些守护线程
2.线程池 取出相关线程处理请求
3.io流读取 socket 封装的HTTP请求数据
4服务器会调用Servlet中的service方法,把浏览器发送给服务器的请求信息信息封装到Request对象中
5.过滤器filter
6.DispatcherServlet前端控制器
第三阶段:springmvc处理请求,并响应结果返还给客户端
springmvc执行原理
(1).用户发送请求 至 前端控制器(DispatcherServlet);
提示:DispatcherServlet的作用:接收请求,调用其它组件处理请求,响应结果,相当于转发器、中央处理器,是整个流程控制的中心(2).前端控制器(DispatcherServlet)收到请求后调用处理器映射器(HandlerMapping)
处理器映射器(HandlerMapping)找到具体的Controller(可以根据xml配置、注解进行查找),并将Controller返回给DispatcherServlet;(3).前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)。处理器适配器经过适配调用具体的Controller;(Controller–> service --> Dao --> 数据库)
Controller执行完成后返回ModelAndView,
提示:Model(模型数据,即Controller处理的结果,Map) View(逻辑视图名,即负责展示结果的JSP页面的名字)
处理器适配器(HandlerAdapter)将controller执行的结果(ModelAndView)返回给前端控制器(DispatcherServlet);(4).前端控制器(DispatcherServlet)将执行的结果(ModelAndView)传给视图解析器(ViewReslover)
视图解析器(ViewReslover)根据View(逻辑视图名)解析后返回具体JSP页面(5).前端控制器(DispatcherServlet)根据Model对View进行渲染(即将模型数据填充至视图中);
前端控制器(DispatcherServlet)将填充了数据的网页响应给用户。
其中整个过程中需要开发人员编写的部分有Controller、Service、Dao、View;SpringMVC执行详解
- 在SpringMVC框架启动之初,程序会对处理器映射器(HandlerMapping)的进行实例化,其中处理器映射器(HandlerMapping)中会有一个map的结构类型.其中map中的key存储的是你要拦截请求路径,value存储的是你要具体要执行的请求方法.
所以在SpringMVC框架启动之初,处理器映射器(HandlerMapping)会把所有请求的注解,和他标识的相关方法进行统一的记录. - 如果有用户发来请求,首先会被前端控制器(DispatcherServlet所拦截,前端控制器(DispatcherServlet)收到请求后调用处理器映射器(HandlerMapping),通过相关路径匹配,找到具体的Controller(可以根据xml配),并将Controller返回给DispatcherServlet;
- 前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)。处理器适配器根据你标识的注解,调用相对应的handler处理器,由这个handler处理器来做具体的调用.Controller;(Controller–>service --> Dao --> 数据库) 最后将controller执行的结果(ModelAndView)对象返回给前端控制器(DispatcherServlet);
- 前端控制器(DispatcherServlet)将执行的结果(ModelAndView)传给视图解析器(ViewReslover)视图解析器(ViewReslover)根据View(逻辑视图名)解析后返回具体JSP页面
- 前端控制器(DispatcherServlet)根据Model对View进行渲染(即将模型数据填充至视图中); 前端控制器(DispatcherServlet)将填充了数据的网页响应给用户。
Spring MVC中的拦截器
Spring MVC中的拦截器基于回调机制,可以在目标方法执行之前,先进行业务检测,满足条件则放行,不满足条件则进行拦截,拦截器原理分析如下图所示:
SpringMVC拦截器工作原理
HandlerInterceptor案例
HandlerInterceptor 拦截器
@Component //spring容器管理对象 public class UserInterceptor implements HandlerInterceptor { @Autowired private JedisCluster jedisCluster; //Spring版本升级 4 必须实现所有的方法 spring 5 只需要重写指定的方法即可. /** * 需求: 拦截/cart开头的所有的请求进行拦截.,并且校验用户是否登录..... * 拦截器选择: preHandler * 如何判断用户是否登录: 1.检查cookie信息 2.检查Redis中是否有记录. * true : 请求应该放行 * false: 请求应该拦截 则配合重定向的语法实现页面跳转到登录页面 使得程序流转起来 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //1.判断用户是否登录 检查cookie是否有值 String ticket = CookieUtil.getCookieValue(request,"JT_TICKET"); //2.校验ticket if(!StringUtils.isEmpty(ticket)){ //3.判断redis中是否有值. if(jedisCluster.exists(ticket)){ //4.动态获取json信息 String userJSON = jedisCluster.get(ticket); User user = ObjectMapperUtil.toObj(userJSON,User.class); request.setAttribute("JT_USER",user); return true; } } response.sendRedirect("/user/login.html"); return false; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { //销毁数据 request.removeAttribute("JT_USER"); } }
WebMvcConfigurer— springmvc 配置类
@Configuration public class MvcConfigurer implements WebMvcConfigurer{ //添加拦截器 @Autowired private UserInterceptor userInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(userInterceptor).addPathPatterns("/cart/**","/order/**"); } }
各种拦截器Filer
另:servlet回顾
Servlet本质
Servlet本质是一段运行在服务器端的Java程序,
和之前的Java程序不同的是,Servlet程序无法独立运行,需要将Servlet程序放在服务器中(比如tomcat服务器),由服务器调用才可以执行。
SpringMVC基于Servlet进行封装的框架
servlet的生命周期
1.加载和实例化
2.初始化
3.请求处理
4.服务终止Web服务器在与客户端交互时Servlet的工作过程是:
- 在客户端对web服务器发出请求
- web服务器接收到请求后将其发送给Servlet
- Servlet容器为此产生一个实例对象并调用ServletAPI中相应的方法来对客户端HTTP请求进行处理,然后将处理的响应结果返回给WEB服务器.
- web服务器将从Servlet实例对象中收到的响应结构发送回客户端.
当浏览器发请求访问服务器中的某一个Servlet时,服务器将会调用Servlet中的service方法来处理请求。在调用service方法之前会创建出request和response对象。
request和response
其中request对象中封装了浏览器发送给服务器的请求信息(请求行、请求头、请求实体等),
response对象中将会封装服务器要发送给浏览器的响应信息(状态行、响应头、响应实体),在service方法执行完后,服务器再将response中的数据取出,按照HTTP协议的格式发送给浏览器。每次浏览器访问服务器,服务器在调用service方法处理请求之前都会创建request和response对象。(即,服务器每次处理请求都会创建request和response对象)
在请求处理完,响应结束时,服务器会销毁request和response对象。
- 在SpringMVC框架启动之初,程序会对处理器映射器(HandlerMapping)的进行实例化,其中处理器映射器(HandlerMapping)中会有一个map的结构类型.其中map中的key存储的是你要拦截请求路径,value存储的是你要具体要执行的请求方法.
-
egg-socket.io 向指定客户端发送消息
2020-06-25 18:46:08将消息发送到指定客户端的几种方式 1. 广播 (不可取) 2. generateId() 3. 保存用户id和socket.id的映射关系 -
nodejs使用socket.io向指定客户端发送消息
2018-04-10 15:49:00客户端与服务器建立链接会触发connection事件 io.on("connection",function(socket){ //其他操作 }); 参数socket为服务器与客户端建立连接的socket端口对象,其有一个名为id的属性,该属性可以识别指定... -
C#利用Socket实现客户端通信(包含:服务器和客户端通信,客户端通过服务器和客户端通信)
2020-07-21 13:39:06服务端能向单个客户发送消息,支持群发消息给所有客户端; 通信的双方具备异常响应功能,包括对方异常退出的处理。如果客户端退出,服务器有响应;反之亦然。 客户端之间直接通信,C与C之间直接通信(不是... -
Netty实现长连接,客户端随时发送消息给服务端,可在任意代码位置发送消息给服务端
2021-12-23 11:39:54测试客户端发送消息到服务器端 1. 可以实现长连接,心跳机制每隔N秒客户端给服务器发送一条消息,代表客户端还存活。 2. 可以实现在随意代码位置按照用户id标识,发送消息给服务端。 pom依赖 <... -
使用TCP协议实现客户端向服务器发送图片
2017-08-18 19:40:56使用TCP协议实现客户端向服务器发送图片 -
java TCP协议--客户端和服务器互相发送和接收信息
2019-09-16 20:18:31今天做一个客户端和服务器,客户端可以发送和接收信息,服务器也可以同时发送信息和接收信息 直接上代码 package Test; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.... -
QT tcp服务端一对多,实现给多个客户端发送文件
2019-10-03 15:38:54用途:本来是用于给单片机收发消息的,只做了服务端,客户端是用别的网络调试助手测试。...给所有客户端发送文件,给单独选中的客户端发送文件(下拉框选择) 接收客户端发过来的指令(分别有进度条,下面... -
深入理解TCP 服务器与客户端
2019-08-24 09:33:00"Python学习开发",一个值得加星标的公众号。正文共:9239 字 6 图预计阅读时间:24 分钟原始链接:https://ciphersaw.github.io/2... -
服务端向客户端主动发送消息
2018-07-16 14:33:15通常情况下,无论是web浏览器还是移动app,我们与服务器之间的交互都是主动的,客户端向服务器端发出请求,然后服务器端返回数据给客户端,客户端浏览器再将信息呈现,客户端与服务端对应的模式是: 客户端请求--... -
socket 服务器向指定的客户端发消息
2017-05-28 12:05:36当多个客户端连接服务器时,服务器如何给指定的客户端发送消息.二.解决方案核心思想: 在服务器端,需保存不同客户端的socket列表及客户端相关信息. socket含有发送方和接收方的ip和端口号,所以通过socket就能向指定... -
Java Socket TCP 通信,实现聊天室,服务器端指定客户端发送消息
2018-03-07 14:32:21参考地址:Java多线程机交互额,原代码在客户端显示谁谁谁发送消息有个bug。。。算了,直接上代码吧!服务器端:package testTCP; import java.net.*; import java.util.ArrayList; import java.util.List; ... -
Nodejs socket.io 实现私聊:如何给指定客户端发送消息,不是群广播
2016-11-20 08:40:50Nodejs socket.io 实现私聊:如何给指定客户端发送消息,而不是群广播。 想法可以参考这个: 可以在io.sockets.on('connection', function (socket) {});中,保存这个socket对象,当要发送消息给这个客户端时,... -
RED5流媒体服务器作为客户端转发流至另一个RED5服务器
2016-08-31 16:38:47RED5流媒体服务器,是Java开源的实现RTMP协议的服务器。有关RTMP协议,网上有很多的介绍。现在着重介绍一下,客户端连接RED5服务器的开发流程。 RED5有一个client包red-client.jar实现了对客户端的封装,可以用来... -
socket.io 客户端与服务器应用
2020-09-27 15:25:40客户端应用 这里主要讲vue的应用 1、npm安装vue-socket.io 2、main.js里引入 import VueSocketIO from 'vue-socket.io' Vue.use(new VueSocketIO({ debug: true, connection: process.env.NODE_ENV === '... -
netty搭建socket服务端,接收客户端数据,主动发送数据给客户端
2019-03-22 22:19:34以前项目中用到的netty服务端,现分享出来;...map的key为客户端发送过来报文中的id(这里你也可以使用ctx.channel().id()相关业务自己实现); 1.netty版本4.1.25 <!-- https://mvnrepository.com/artifact... -
Android简单实现Socket通信,客户端连接服务器后,服务器向客户端发送文字数据
2015-12-29 11:55:11案例实现的是简单的Socket通信,当客户端(Android客户端)连接到指定服务器以后,服务器向客户端发送一句话文字信息(你可以拓展其它的了)先看一下服务端程序的实现吧Server.javaimport java.io.IOException;... -
java实现服务器与客户端之间的TCP通信
2020-03-24 10:22:47服务器端: TCPServer.java package com.zhanshen.demo; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; /** *... -
linux远程开发——网络通信(客户端与服务器建立连接)
2022-03-26 20:14:47本文介绍网络编程的基础知识,使用 Visual Studio 2019 在 linux 本地搭建一个服务器,将客户端与本地服务器连接起来,通过客户端向服务器发送信息,测试服务端能否收到信息。 -
服务器主动推送消息数据给客户端
2019-02-11 15:17:14这个问题第一次是我在实现一个导师的方案的时候所发现的,一开始我需要实现服务器与客户端的密钥协商和数据传递,服务器需要主动分发(推送)密钥给客户端,因为以前没有做过相关编码,后来只能想到用反向连接,也... -
java实现服务器和客户端之间的文件传输
2018-12-08 19:04:53一、客户端发文件:首先建立和服务器的连接,然后我们通过IO流来实现数据的传输,步骤: 1、通过服务器的IP地址和端口号实现和服务器的连接(这里不要忘记先开服务器哦) 2、获取本地的文件的地址,建立java和文件... -
客户端到服务器端的通信过程及原理
2018-01-22 00:52:27现在结和我所学,我想总结一下客户端到服务器端的通信过程。只有明白了原理,我们才会明白当我们程序开发过程中错误的问题会出现在那,才会更好的解决问题。 我们首先要了解一个概念性的词汇:Socket socket的... -
TCP编程例三:从客户端发送文件给服务器端,服务器端保存到本地,并返回“发送成功”给客户端。
2015-05-08 14:23:52从客户端发送文件给服务器端,服务器端保存到本地,并返回“发送成功”给客户端。 -
node如何使用socket.io向指定客户端发送消息
2017-08-13 18:01:26在node使用socket.io进行websocket通信时,会遇到一个问题 ——服务器如何向指定客户端发送消息,只会群发多么无聊对吧。 我们知道,客户端与服务器建立链接会触发connection事件 io.on("connection",... -
WebSocket介绍和使用nodejs+socket.io搭建服务器和客户端
2018-05-30 10:29:31它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。 ——百度百科 目的:即时通讯,替代轮询 网站上的即时通讯是很常见的,比如网页的QQ,聊天系统等。按照以往的技术能力... -
(内网穿透)netty做通信,客户端发送请求,并等待服务器回应信息
2019-05-11 11:51:08《一步一步实现神卓内网穿透功能,netty通信基础》之客户端发送信息给服务器,一直等待服务器的回应,服务器收到回应后返回信息给服务端,客户端收到回应,等待结束,核心重点是CountDownLatch类的使用。 ...