socket

python问题:TypeError: a bytes-like object is required, not 'str'

主宰稳场 提交于 2020-02-07 06:54:37
源程序: import socket target_host = "www.baidu.com" # 127.0.0.1 target_port = 80 # 建立一个socket对象 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 创建TCP连接 # 连接客户端 client.connect((target_host,target_port)) client.send("GET / HTTP/1.1\r\nHost: baidu.com\r\n\r\n") 错误背景:程序想创建一个TCP连接,在发送数据的时候报错,表明send函数需要传byte类型值。 类型错误: TypeError: a bytes-like object is required, not 'str' 解决方法: 1、在数据前面加b,强制转换 client.send(b"GET / HTTP/1.1\r\nHost: baidu.com\r\n\r\n") 2、发送数据的时候进行编码 client.send(("GET / HTTP/1.1\r\nHost: baidu.com\r\n\r\n").encode()) 这里我看了一篇前人MrYx的文章,说的很好 http://blog.csdn.net/yexiaohhjk/article

netty权威指南学习笔记一——NIO入门(4)AIO

本秂侑毒 提交于 2020-02-07 03:50:16
  NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供以下两种方式获取操作结果。   1、通过java.util.concurrent.Future 类来表示异步操作的结果;   2、在执行异步操作的时候传入一个java.io.channels。   ComplementHandler接口的实现类作为操作完成的回调。   NIO2.0的异步套接字通道是真正的异步非阻塞I/O, 它不需要通过多路复用器(Selector)对注册的通道进行轮询操作即可实现异步读写 ,从而简化了NIO编程模型。   改造后的代码 server端代码:    1 package com.example.biodemo; 2 3 4 import java.io.*; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 public class TimeServer { 9 public static void main(String[] args) throws IOException { 10 int port = 8092; 11 if (args != null && args.length > 0) { 12 try { 13 port = Integer.valueOf(args[0

网络编程 OSI七层协议

一笑奈何 提交于 2020-02-07 03:03:36
一.网络编程   1、软件开发架构   c/s架构     c:客户端(client)     s:服务端(service) 对外一直提供服务,稳定运行   b/s架构     b:浏览器(browser)     s:服务器(service) 手机端:好像C/S架构比较火,其实不然,微信小程序,支付宝第三方接口      统一接口! pc端:b/s比较火      本质:b/s其实也是c/s   2、学习网络编程能做什么?   网络编程 >>> 开发cs架构的软件   并发编程,前端,数据库,框架 >>> 开发bs架构的软件 3. 如何实现远程沟通交流?   电话插电话线   电脑插网线   笔记本电脑无线网卡   要想实现远程通信,第一个需要具备的条件就是:物理连接介质 不同国家的人交流需要有一个公共的语言作为媒介 >>> 英文 计算机于计算机要想实现远程通信,光有物理连接介质是不够, 他们也需要一个共同的标准 >>> 协议 二.OSI七层协议(模型)   互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层   每层都运行特定的协议,越往上越靠近用户,越往下越靠近硬件      每层运行常见物理设备 1、物理连接层:   实现计算机之间物理连接,传输的数据都是01010的二进制   电信号工作原理:电只有高低电平 2、数据链路层(" 以太网协议

Netty权威指南之伪异步I/O编程

微笑、不失礼 提交于 2020-02-07 02:29:44
为了解决同步阻塞I/O一个链路需要一个线程处理问题,对BIO模型做了优化——后端通过一个线程池处理多个客户端的请求接入,设置线程最大值,防止线程并发接入导致的线程耗尽。 当有新的客户端接入时,将客户端Socket封装成一个Task(该任务实现java.lang.Runnable接口)投递到后端的线程池中进行处理,JDK的线程池维护一个消息队列和N个活跃线程,对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此资源占用是可控的,无论多少客户端并发访问都不会导致资源耗尽和宕机。 伪异步I/O通信框架采用了线程池实现,避免了每次请求创建一个独立的线程造成的资源耗尽问题,底层通信依然采用BIO同步阻塞模型,无法从根本上解决问题。当对方发送请求或者应答消息比较缓慢(如数据大),或者网路传输较慢时(网速差)读取输入流一方的通信线程将被长时间阻塞,阻塞期间,其他接入消息只能在消息队列中排队。阻塞结束情况:1)有数据可读,2)可用数据已经读取完毕,3)发生空指针或IO异常 package com.hjp.netty.pseudoasynio; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util

osi七层协议

旧城冷巷雨未停 提交于 2020-02-07 00:59:29
osi七层协议 互联网的本质就是一系列的网络协议,这个协议就叫OSI协议(一系列协议),按照功能不同,分工不同,人为的分层七层。 物理层 功能:主要是基于电器特性发送高低电压(点信号),高电压对应数字1,低电压对应数字0。 作用:连接计算机,传输电信号 中间的物理链接可以是光缆,电缆,双绞线,无线电波。中间传的是电信号,即0110...这些二进制。 数据链路层 由来:单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思 功能:定义了电信号的分组方式 以太网协议 早期的时候,数据链路层就是来对电信号来做分组的。以前每个公司都有自己的分组方式,后来形成了统一的标准,即以太网协议ethernet。ethernet规定:一组电信号构成一个数据报,叫做'帧',每一数据帧分成:报头head和数据data两部分 head包含:(固定18个字节) 发送者/源地址,6个字节 接收者/目标地址,6个字节 数据类型,6个字节 data包含:(最短46字节,最长1500字节) Mac地址 head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即Mac地址。 广播地址 局域网内通过交换机将信息发送给所有计算机,然后通过匹配Mac地址来做出响应。 网络层 引入一套新的地址用来区分不同的广播域/子网

(07)Kafka核心配置详解

若如初见. 提交于 2020-02-06 17:10:32
broker.id =0 #每一个broker在集群中的唯一表示,要求是正数。当该服务器的IP地址发生改变时,broker.id没有变化,则不会影响consumers的消息情况 log.dirs=/data/kafka-logs #kafka数据的存放地址,多个地址的话用逗号分割/data/kafka-logs-1,/data/kafka-logs-2 port =9092 #broker server服务端口 message.max.bytes =6525000 #表示消息体的最大大小,单位是字节 num.network.threads =4 #broker处理消息的最大线程数,一般情况下不需要去修改 num.io.threads =8 #broker处理磁盘IO的线程数,数值应该大于你的硬盘数 background.threads =4 #一些后台任务处理的线程数,例如过期消息文件的删除等,一般情况下不需要去做修改 queued.max.requests =500 #等待IO线程处理的请求队列最大数,若是等待IO的请求超过这个数值,那么会停止接受外部消息,应该是一种自我保护机制。 host.name #broker的主机地址,若是设置了,那么会绑定到这个地址上,若是没有,会绑定到所有的接口上,并将其中之一发送到ZK,一般不设置 socket.send.buffer.bytes

socket实时推送数据,并接收请求处理

陌路散爱 提交于 2020-02-06 10:54:10
前言 因项目要求,需要定时推送数据给硬件后台,然后根据后台不定时请求,做出响应。写了一个socket传输数据,传输的时候可以正常传输,但是到接收后台请求,处理请求的时候会一直监听,影响传输的效率,所以在基础上做了一些简单的修改,把传输和接收分开,同时进行。 正文 文中有socket服务端使用和简单的客户端测试代码,可以根据不同的项目需求做出修改。文中使用了两个线程来让传输和接收互不干扰,并且接收的时候没有用BufferedReader的readLine()方法,readLine()方法接收方便,但是客户端不确定何时发送请求,导致会一直监听,影响性能,而且比较确定客户端会发送的数据长度,所以最后选择了InputStream直接读取byte数组。 新建socket服务端传输数据 public class StatusSocket extends Thread{ private static Logger log = LoggerFactory.getLogger(StatusSocket.class); private static int PORT = Integer.valueOf(ConfigVariable.STATUS_PORT); @Override public void run() { try { ServerSocket serverSocket =

socket那些事

放肆的年华 提交于 2020-02-06 04:42:54
数据发到网络环境通常通过交换机,再由交换机转发至路由器 但凡提到套接字,必定有两端:数据的发送端和接收端, ip地址在网络环境中可以唯一的表示一台主机,ip+端口号可以在网络环境中唯一标识一个进程。 socket通信原理: 套接字是linux操作系统中的一种文件类型----伪文件 linux中有7种文件类型:其中普通文件,目录文件,软链接三种文件类型占用内存,字符设备,块设备,管道,套接字 管道,fd[0]读端,fd[1]写端,半双工,如同对讲机 socket乃是双向全双工,一个文件描述符,两个缓冲区(一个读,一个写) 对于数字8910.67 低地址存高位----大端法按照内存地址顺序由近及远依次存入8,9,1,0,.6.7 低地址存低位----小端法(与上边相反)x86就是如此,小端法存储,源于windows基于Intel x86平台 理论上是这样,不同操作系统可能不尽相同。 网络数据流采用了大端字节序,操作系统采用了小端法存储,这样一来网卡发送的数据字节序发生了变化,这样一来,接收端在解包的过程中无法正确解析IP地址等关键信息,这就需要能转换网络字节序和主机字节序的系列函数 uint32_t htonl(uint32_t hostlong) uint16_t htons(uint16_t hostshort) uint32_t ntohl(uint32_t netlong)

Java第十八章-网络通信

萝らか妹 提交于 2020-02-06 04:19:33
绪论 通过计算机网络,相互连接的计算机彼此之间可以进行数据交流,如要编写网络应用程序,首先要明确这些应用程序所使用的网络协议。 局域网与因特网 //服务器是指提供信息的计算机或是应用程序 //客户机是指请求信息的计算机或是程序 //局域网(LAN)是指一群通过一定形式连接起来的计算机 //有LAN延伸到更大的范围,称为广域网(WAN) //我们熟知的因特网,有无数的LAN和WAN组成 网络协议 IP协议 //因特网采用的时TCP/IP协议,因特网上有数千上万个主机,每一个主机分配一个地址即为IP地址。目前IP地址由四个字节组成即32位二进制数称为IPv4,通常取每个字节的十进制数且每个字节有一个点做分隔符,例如:192.168.1.1 //TCP/IP模式是一种层次结构共分为4层。应用层、传输层、互联网层、网络层,各层功能有一定的独立性。 TCP与UDP协议 //TCP:传输控制协议 //UDP:用户数据报协议 //TCP协议时一种以固接连接为基础的协议,可以保证数据准确达到,而且抵达的数据排列顺序与输送时相同,应用一些可靠性要求比较高的场所 //UDP协议无连接通信协议,不保证数据的可靠性。而且无法保证顺序,应用一些数据准确性要求不是很高的场所。 端口和套接字 //一班而言,一台计算机只有单一的连接到网络的物理连接,所有的数据都通过此连接对内外送达指定的计算机,这就是端口

网络编程--Java网络编程入门

人走茶凉 提交于 2020-02-06 03:04:12
Java 网络编程入门 服务器与客户程序只需关心发送什么样的数据给对方,而不必考虑如何把这些数据传输给对方,传输数据的任务由计算机网络完成。 两个进程顺利通信的前提条件是它们所在的主机都连接到了计算机网络上。 网络协议是网络中主机之间通信的语言。 不同网络之间的互联靠网络上的标准语言—— TCP/IP 协议。 OSI 参考模型把网络分为 7 层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。不同主机之间的相同层称为对等层。 物理层:为上一层提供物理连接,以及规定通信节点之间的机械和电气特性。数据作为原始的比特 (bit) 流传输。 数据链路层:数据链路层负责在两个相邻节点间的线路上,无差错地传送以帧为单位的数据。典型设备是交换机。 网络层:选择合适的网间路由和交换节点,确保数据及时传送到目标主机。典型设备是路由器。 传输层:根据通信子网的特性最佳地利用网络资源,为两个端系统的会话层提供建立、维护和取消传输连接的功能,以可靠方式或不可靠方式传输数据。信息的传送单位是报文。 会话层:管理进程间的会话过程,即负责建立、管理、终止进程间的会话。数据传送单位是报文。 表示层:对上层数据进行转换,以保证一个主机的应用层的数据可以被另一个主机的应用层理解。数据传送单位是报文。 应用层:确定进程间通信的实际用途,以满足用户实际需求。