socket

SOCKET:SO_LINGER 选项

烂漫一生 提交于 2020-03-29 07:41:16
  好多次接触到SO_LINGER选项,但总是忘了这是干什么用的。现在整理一下,我才明白这个参数是用来设定“ SOCKET在CLOSE时候是否等待缓冲区发送完成 ”这个特性的。下面是一些详细的说明。 setsockopt 设置 SO_LINGER 选项   此选项指定函数close对面向连接的协议如何操作(如TCP)。内核缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方。 SO_LINGER选项用来改变此缺省设置。使用如下结构: struct linger { int l_onoff; /* 0 = off, nozero = on */ int l_linger; /* linger time */ }; 有下列三种情况: 1、 设置 l_onoff为0,则该选项关闭,l_linger的值被忽略,等于内核缺省情况,close调用会立即返回给调用者,如果可能将会传输任何未发送的数据; 2、 设置 l_onoff为非0,l_linger为0,则套接口关闭时TCP夭折连接,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态; 3、 设置 l_onoff 为非0,l_linger为非0,当套接口关闭时内核将拖延一段时间(由l_linger决定)

java socket编程-入门demo

安稳与你 提交于 2020-03-28 23:27:17
1、实现:实现服务端与客户端一对多的关系;服务端关闭则客户端等待服务端启动后重连,客户端关闭则服务端关闭与服务端的socket连接,如果所有客户端关闭,则服务端等待客户端连接。 实现客户端向服务端单向发送数据(服务端向客户端发送数据同理)。 2、服务端: A、服务器端创建ServerSocket,循环调用accept()等待客户端连接 B、客户端创建一个socket并请求和服务器端连接 C、服务器端接受客户端请求,创建socket与该客户建立专线连接 D、建立连接的两个socket在一个单独的线程上对话 E、服务器端继续等待新的连接 代码: import java.io.IOException; import java.io.ObjectInputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; public class SocketServer { private static ServerSocket serverSocket = null; private

No.27网络基础

穿精又带淫゛_ 提交于 2020-03-28 11:29:35
No.27 今日概要 网络基础 内容回顾 1.re模块 findall 找到所有符合规则的项,返回一个列表。 search 找到第一个符合规则的项,返回一个对象。 match 从头开始找到第一个符合规则的项,返回一个对象。 finditer 找到所有符合规则的项,返回一个迭代器。 compile 预编译一个正则规则,节省多次使用同一个正则规则的编译时间。 sub 根据正则规则替换,默认替换所有,可以使用替换深度参数。 subn 根据正则规则替换,返回一个元组。 split 根据正则规则切割,返回一个列表,默认不保留切掉的内容。 2.分组 分组命名 (?P<组名>正则) 引用分组 (?P=组名) findall和分组 优先显示分组中的内容 (?:)取消这个分组的优先 split和分组 split会保留正则中分组内匹配到的内容 search和分组 search取分组中的内容 通过索引取 obj.group(1) 通过组名取 obj.group('组名') 3.补充 正则基本写法 r''元字符 量词 惰性符号'' [ ] [^] 带有特殊意义的元字符到字符组内大部分都会取消它的特殊意义 会取消 [ () + * .] [ - ] - 的位置决定了它的意义,写在字符组的 第一个位置/最后一个位置 就表示一个普通横杠,写在字符组其它任何位置都表示一个范围。 4.习题 #1 找出<h1

WebSocket和WebRtc的一些心得

北城余情 提交于 2020-03-28 04:29:33
一、基础 1、HTTP协议是无状态的,服务器只会响应来自客户端的请求,但是它与客户端之间不具备持续连接;且只能从客户端主动请求服务端,服务端不能主动通知客户端。 对于实时通信系统(聊天室或监控系统)这样显然是不合理的。传统的方法有:长轮询(客户端每隔很短的时间,都对服务器发出请求,当时间足够小就能实现实时的效果)、长连接(客户端只请求一次,但是服务器会将连接保持,当有数据时就返回结果给客户端)。这两种方式,都对客户端和服务器都造成了大量的性能浪费,于是WebSocket应运而生。WebSocket协议能够让浏览器和服务器全双工实时通信,互相的,服务器也能主动通知客户端。 2、 WebSocket的原理非常的简单:利用HTTP请求产生握手,HTTP头部中含有WebSocket协议的请求,所以握手之后,二者转用TCP协议进行交流。 Socket.IO是业界良心,新手福音。它屏蔽了所有底层细节,让顶层调用非常简单。并且还为不支持WebSocket协议的浏览器,提供了长轮询的透明模拟机制。 二、实现 1、socket.emit(action,arg1,arg2); 表示发送了一个action命令,还有两个数据,在另一端接收时,可以这么写: socket.on('action',function(arg1,arg2){...}); 2、io.sockets.emit 信息传输对象为所有

socket编程的select模型

爷,独闯天下 提交于 2020-03-28 01:56:57
在掌握了socket相关的一些函数后,套接字编程还是比较简单的,日常工作中碰到很多的问题就是客户端/服务器模型中,如何让服务端在同一时间高效的处理多个客户端的连接,我们的处理办法可能会是在服务端不停的监听客户端的请求,有新的请求到达时,开辟一个新的线程去和该客户端进行后续处理,但是这样针对每一个客户端都需要去开辟一个新的线程,效率必定底下。 其实,socket编程提供了很多的模型来处理这种情形,我们只要按照模型去实现我们的代码就可以解决这个问题。主要有select模型和重叠I/o模型,以及完成端口模型。这次,我们主要介绍下select模型,该模型又分为普通select模型,wsaasyncselect模型,wsaeventselect模型。我们将通过样例代码的方式逐一介绍。 一、select模型 使用该模型时,在服务端我们可以开辟两个线程,一个线程用来监听客户端的连接 请求,另一个用来处理客户端的请求。主要用到的函数为select函数。如: 全局变量: fd_set g_fdClientSock; 线程1处理函数: SOCKET listenSock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(7788);

Java 网络编程

烂漫一生 提交于 2020-03-27 10:18:56
一:OSI模型 Open System Interconnection 开放系统互联 二:TCP/IP分层模型 TCP代表传输控制协议:Transfer Control Protocol 允许两个程序之前进行可靠的通讯 UDP代表用户报文协议:User Datagram Protocol 允许两个程序之前进行不可靠的通讯 三 客户端 和 服务器 四:套接字 定义:Socket(套接字)是一种抽象层,应用程序通过它来发送和接收数据 五:InetAddress类代表IP地址,没有构造器但是有多个方法,查询API文档。 六:TCP套接字编程 服务器: –1.利用ServerSocket建立对服务端某个端口的监听。 如:ServerSocket server = new ServerSocket(8000); –2.利用accept方法创建服务端Socket 如:Socket socket = server.accept() –3.利用已建立的socket创建输入输出流 如:BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream())); –4.关闭输入输出流,关闭socket,关闭server 如: br.close(); pw.close(); socket.close();

关于网络编程的总结

痞子三分冷 提交于 2020-03-27 06:41:07
网络编程的知识结构图 socket编程   网络编程,主要是指基于TCP的网络通信编程,使用Socket类实现,也称为socket编程   socket编程模型中有服务器端和客户端,服务器端使用ServerSocket创建,一般有固定的IP地址和端口号,方便向外界提供服务。客户端可以有多个,并且使用Socket主动连接服务器。连接后,服务器端也创建一个Socket对象表示这次连接 编程步骤 : 服务器端: 1 创建服务器对象ServerSocket 2 等待客户端的连接请求,收到请求后即返回表示这次连接的Socket对象 3 开启新的线程专门处理这个连接 4 获得连接的输入输出流,并按照一定的规则进行数据交换 5 关闭连接(关闭连接时会自动关闭IO流) 客户端: 1 创建Socket对象,即向服务器申请连接 2 获得连接的输入输出流,并按照一定的规则进行数据交换 3 最后关闭连接(关闭连接时会自动关闭IO流) 平时编程时一般都是基于应用层协议,比如HTTP,直接进行socket编程的并不多。 /* * 把从客户端读取到的一行数据的字符进行翻转,然后发送给客户端 * 当读取到over时,连接断开 */ public class Server2 { public static void main(String[] args) { try { ServerSocket server =

PHP快速检测死链接

邮差的信 提交于 2020-03-26 18:11:24
3 月,跳不动了?>>> 检测死链接的原理是发起一个http请求,然后分析返回的状态码,如果是200,就说明链接可用,如果是404或者50x等等,就说明是死链接。 很容易想到用curl去完成这个任务,我今天分享一个不依赖curl并且更加高效的方法:使用socket。 步骤: 1、使用socket建立一个TCP连接: $socket = fsockopen('ssl://www.baidu.com', 443, $errorno, $erromsg, 5); if (empty($socket)) throw new \RuntimeException('连接服务器失败'); //因为baidu.com是https协议,所以需要加上ssl://前缀,端口使用443 //若你需要检测的网站是http协议,那么就去掉前缀,端口使用80 $socket = fsockopen('www.test.com', 80, $errorno, $erromsg, 5); 2、发起一个http请求: // 检测链接为:https://www.baidu.com/img/bd_logo1.png?where=super $request = "GET /img/bd_logo1.png?where=super HTTP/1.1\r\n\r\n"; fwrite($socket, $request);

socket通信基础内容

亡梦爱人 提交于 2020-03-26 16:55:37
对 TCP/IP、 UDP、 Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问: 1. 什么是 TCP/IP、 UDP? 2. Socket在哪里呢? 3. Socket是什么呢? 4. 你会使用它们吗? 什么是 TCP/IP 、 UDP ? TCP/IP( Transmission Control Protocol/Internet Protocol)即传输控制协议 /网间协议,是一个工业标准的协议集,它是为广域网( WANs)设计的。 UDP( User Data Protocol,用户数据报协议)是与 TCP相对应的协议。它是属于 TCP/IP协议族中的一种。 这里有一张图,表明了这些协议的关系。 图 1 TCP/IP协议族包括运输层、网络层、链路层。现在你知道 TCP/IP与 UDP的关系了吧。 Socket 在哪里呢? 在图 1中,我们没有看到 Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。 图 2 原来 Socket在这里。 Socket 是什么呢? Socket是应用层与 TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中, Socket其实就是一个门面模式,它把复杂的 TCP/IP协议族隐藏在 Socket接口后面,对用户来说,一组简单的接口就是全部,让 Socket去组织数据

Python基于TCP与UDP协议实现Socket通信

左心房为你撑大大i 提交于 2020-03-26 16:55:02
TCP协议 server.py from socket import socket tcp_server = socket() tcp_server.bind(('127.0.0.1', 9000)) tcp_server.listen() conn, addr = tcp_server.accept() msg = conn.recv(1024) print(msg) conn.send(b'hello from server') conn.close() tcp_server.close() client.py from socket import socket tcp_client = socket() tcp_client.connect(('127.0.0.1', 9000)) tcp_client.send(b'hello from client') msg = tcp_client.recv(1024) print(msg) tcp_client.close() UDP协议 server.py from socket import socket, SOCK_DGRAM udp_server = socket(type=SOCK_DGRAM) udp_server.bind(('127.0.0.1', 9000)) msg, client_addr = udp