socket

多个客户端如何同时连接到服务器上的一个端口,比如80?(译)

廉价感情. 提交于 2020-01-30 07:15:27
多个客户端如何同时连接到服务器上的一个端口,比如80?(译) 原文: How do multiple clients connect simultaneously to one port, say 80, on a server? [duplicate] 平时我们使用ServerSocket指定了某个端口(例如8080),然后多个客户端连接上socket之后就都用这个8080端口和服务器端通讯。或者http服务器使用80端口也是和多个浏览器进行连接通讯。为什么可以这样呢?操作系统的进程在同个端口的多个连接是如何进行分辨的? 译文: 我们这里讲Socket连接: 1. 端口只是一个数字辨识,不是真正的物理端口; 2. 一个Socket连接的主键(即不同socket之间的区分)是由一个五元组{SRC-IP, SRC-PORT, DEST-IP, DEST-PORT, PROTOCOL}组成,即{源地址,源端口,目标地址,目标端口,协议}组成,那些说四元组不包含协议的说法是错误的。 3. 一个进程可以拥有多个socket连接。 例子一、两个客户端连接在同个服务器的同个端口80,即有两个socket连接: - socket1 {SRC-A, 100, DEST-X,80, TCP} - socket2{SRC-B, 100, DEST-X,80, TCP} 主机A和主机B的地址不同

轮询、长轮询、长连接、socket连接、WebSocket

六月ゝ 毕业季﹏ 提交于 2020-01-30 02:37:20
轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。   优点:后端程序编写比较容易。   缺点:请求中有大半是无用,浪费带宽和服务器资源。(而每一次的 HTTP 请求和应答都带有完整的 HTTP 头信息,这就增加了每次传输的数据量)   实例:适于小型应用。 长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接(或到了设定的超时时间关闭连接),客户端处理完响应信息后再向服务器发送新的请求。   优点:在无消息的情况下不会频繁的请求,节省了网络流量,解决了服务端一直疲于接受请求的窘境   缺点:服务器hold连接会消耗资源,需要同时维护多个线程,服务器所能承载的TCP连接数是有上限的,这种轮询很容易把连接数顶满。   实例:WebQQ、Hi网页版、Facebook IM。 长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。   优点:消息即时到达,不发无用请求。   缺点:服务器维护一个长连接会增加开销。   实例:Gmail聊天 Flash Socket:在页面中内嵌入一个使用了Socket类的 Flash

轮询、长轮询、长连接、socket连接、WebSocket

拟墨画扇 提交于 2020-01-30 02:35:08
轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。   优点:后端程序编写比较容易。   缺点:请求中有大半是无用,浪费带宽和服务器资源。(而每一次的 HTTP 请求和应答都带有完整的 HTTP 头信息,这就增加了每次传输的数据量)   实例:适于小型应用。 长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接(或到了设定的超时时间关闭连接),客户端处理完响应信息后再向服务器发送新的请求。   优点:在无消息的情况下不会频繁的请求,节省了网络流量,解决了服务端一直疲于接受请求的窘境   缺点:服务器hold连接会消耗资源,需要同时维护多个线程,服务器所能承载的TCP连接数是有上限的,这种轮询很容易把连接数顶满。   实例:WebQQ、Hi网页版、Facebook IM。 长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。   优点:消息即时到达,不发无用请求。   缺点:服务器维护一个长连接会增加开销。   实例:Gmail聊天 Flash Socket:在页面中内嵌入一个使用了Socket类的 Flash

Java Socket模拟实时聊天系统

南笙酒味 提交于 2020-01-30 01:20:51
客户端和服务端都分别需要两个线程,一个用来进行消息发送,一个用来进行消息接受。 客户端: package com . jay . test ; import java . io . * ; import java . net . Socket ; import java . util . Scanner ; public class Client { private Socket socket ; //初始化,连接目的服务器的端口 public Client ( ) { try { socket = new Socket ( "localhost" , 13 ) ; } catch ( IOException e ) { e . printStackTrace ( ) ; } //启动接受信息的线程 GetMsgFromServer getMsgFromServer = new GetMsgFromServer ( socket ) ; new Thread ( getMsgFromServer ) . start ( ) ; } //发送信息的方法 public void start ( ) { Scanner scanner = new Scanner ( System . in ) ; try { PrintWriter printWriter = new

深挖NUMA

女生的网名这么多〃 提交于 2020-01-29 22:10:40
首先列出本站之前相关的几篇帖子: Linux的NUMA机制 NUMA对性能的影响 cgroup的cpuset问题 这次,就来深入了解下NUMA。 就如之前说的,在若干年前,对于x86架构的计算机,那时的内存控制器还没有整合进CPU,所有内存的访问都需要通过北桥芯片来完成。此时的内存访问如下图所示,被称为UMA( uniform memory access, 一致性内存访问 )。这样的访问对于软件层面来说非常容易实现:总线模型保证了所有的内存访问是一致的,不必考虑由不同内存地址之前的差异。 之后的x86平台经历了一场从“拼频率”到“拼核心数”的转变,越来越多的核心被尽可能地塞进了同一块芯片上,各个核心对于内存带宽的争抢访问成为了瓶颈;此时软件、OS方面对于SMP多核心CPU的支持也愈发成熟;再加上各种商业上的考量,x86平台也顺水推舟的搞了NUMA(Non- uniform memory access, 非一致性内存访问 )。 在这种架构之下,每个Socket都会有一个独立的内存控制器IMC( integrated memory controllers, 集成内存控制器 ),分属于不同的socket之内的IMC之间通过QPI link通讯。 然后就是进一步的架构演进,由于每个socket上都会有多个core进行内存访问

Redis事件

旧巷老猫 提交于 2020-01-29 17:01:51
redis文件事件 定义:redis服务器通过套接字socket与其他redis服务或者客户端进行通信,每次通信会产生文件事件而redis通过监听和处理这些事件来完成一系列网络通信操作。 实现:redis基于unix网络通信模型的I/O复用模型,一个线程监控多个套接字,当某个套接接收到信息,由事件分发器将其分发到对应的事件处理器中去处理。 不排除多个套接字同时触发事件,此时redis会将这些事件通过一个队列排队由主线程一个一个处理。 tips:如果一个套接字既可读又可写,且同时触发了这两个事件,那么会优先处理读,再处理写。 文件事件的处理器: 连接应答处理器 命令请求处理器 命令回复处理器 一次完整的客户端与服务端连接示例: redis服务端启动状态,监听socket AE_READABLE事件,该事件所对应的处理器为连接应答处理器,如果这时有一个客户端向服务器发起连接,会触发AE_READABEL事件,触发连接应答处理器执行,处理器会对client的连接请求进行应答然后创建client socket,包括client的状态,将client socket 的AE_READABLE事件与命令请求处理器相关联,使client可以向server发送命令请求,之后client向server发送命令请求,触发AE_READABLE事件,引发命令请求处理器执行,读取命令内容然后交给相关程序执行

Java - 网络编程完全总结

雨燕双飞 提交于 2020-01-29 05:37:33
本文主要是自己在网络编程方面的学习总结,先主要介绍计算机网络方面的相关内容,包括计算机网络基础,OSI参考模型,TCP/IP协议簇,常见的网络协议等等,在此基础上,介绍Java中的网络编程。 一、概述 二、计算机网络 1.网络协议 2.网络体系结构 三、OSI参考模型 四、TCP/IP参考模型 五、常见网络协议 1.TCP协议 2.UDP协议 3.HTTP协议 六、计网常见问题 七、Java网络编程 一、概述 计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统。网络编程就就是编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输。Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程。下面先对网络编程的一些基础知识进行介绍,最后给出使用Java语言进行网络编程的实例。 二、计算机网络 计算机网络20世纪60年代出现,经历了20世纪70年代、80年代和90年代的发展,进入21世纪后,计算机网络已经成为信息社会的基础设施,深入到人类社会的方方面面,与人们的工作、学习和生活息息相关。 网络协议 如同人与人之间相互交流是需要遵循一定的规矩一样,计算机之间能够进行相互通信是因为它们都共同遵守一定的规则,即网络协议。 网络体系结构 计算机网络是个复杂的系统,按照人们解决复杂问题的方法

BIO,NIO与AIO的区别

空扰寡人 提交于 2020-01-29 04:21:15
Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持I/O属于底层操作,需要操作系统支持,并发也需要操作系统的支持,所以性能方面不同操作系统差异会比较明显。另外NIO的非阻塞,需要一直轮询,也是一个比较耗资源的。所以出现AIO 背景: 省分短信发送每天都差不多要1000W条上下,遇到特殊节假日和政府通告时量会更大!boss系统中存放的是短信发送内容,而真正完成发送短信指令动作是的华为方做的短厅,这么大的通信量选择了netty来完成数据传输并自定义了一套基于netty的SGIP协议进行通信; 省分boss系统—>短信营业厅(); 基本知识 2.1 TCP/IP网络协议 网上很多有关这个协议的解释,自行google,下面是简单的理解记忆: tcp/ip的3次握手,

Tomcat源码分析(一)

こ雲淡風輕ζ 提交于 2020-01-29 04:09:56
这段时间简单的看了一下Tomcat的源码,在这里做个笔记! 1. tomcat 架构图 Catalina : tomcat的顶级容器,main()方法中就是通过,创建Catalina 对象实例,来启动或者关闭 tomcat; Server : 是管理tomcat所有组件的容器,包含一个或多个的service; Service : Service是包含Connector和Container的集合,Service用适当的Connector接收用户的请求,再发给相应的Container来处理; Connector: 主要功能是 ◇socket的接收 ◇根据协议类型处理socket ◇封装相应的request和response,交给Container; Container: Engine容器接收来自Connector的请求,并且通过Pipeline依次传递给子容器的Pipeline; Engine : 在Engine的Pipeline中的Valve的invoke方法中,根据request.getHost()来定位下一个host; Host : 一个Web服务器虚拟机,管理着具体的 web application; Context : 就是我们所部属的具体Web应用的上下文,每个请求都是在具体的上下文中处理; Wrapper :对应着Web的每一个 Servlet; 接下来

组播

天大地大妈咪最大 提交于 2020-01-29 01:06:05
组播 单播只能发给一个接收方,广播发给所有主机,但过多的广播会大量占用网络带宽,造成网络风暴,影响通信。 组播(多播)为折中方式,只有加入某个多播组的主机才能收到数据。 组播的IP地址:224.0.0.1 ~ 239.255.255.254(中间除去广播地址) 组播的发送 1)创建UDP套接字 2)指定目标地址与端口 3)发送数据包 1 /*udp demo */ 2 3 /* usage: 4 * ./client serv_ip serv_port 5 */ 6 #include "net.h" 7 void usage (char *s) 8 { 9 printf ("\nThis is multicast demo!\n"); 10 printf ("\nUsage:\n\t %s serv_ip serv_port", s); 11 printf ("\n\t serv_ip: udp server ip address(between 224~239 segment)"); 12 printf ("\n\t serv_port: udp server port(serv_port > 5000)\n\n"); 13 } 14 15 int main (int argc, char *argv[]) 16 { 17 int fd = -1; 18 int port =