网络编程

浅谈TCP/IP网络编程中socket的行为

冷暖自知 提交于 2020-01-02 20:43:14
我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止、重传和确认、滑动窗口和拥塞控制等等) 2. Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为。 3. 编写Performant, Scalable的服务器程序。包括多线程、IO Multiplexing、非阻塞、异步等各种技术。 关于TCP/IP协议,建议参考Richard Stevens的《TCP/IP Illustrated,vol1》(TCP/IP详解卷1)。 关于第二层面,依然建议Richard Stevens的《Unix network proggramming,vol1》(Unix网络编程卷1),这两本书公认是Unix网络编程的圣经。 至于第三个层面,UNP的书中有所提及,也有著名的 C10K问题 ,业界也有各种各样的框架和解决方案,本人才疏学浅,在这里就不一一敷述。 本文的重点在于第二个层面,主要总结一下Linux下TCP/IP网络编程中的read/write系统调用的行为,知识来源于自己网络编程的粗浅经验和对《Unix网络编程卷1》相关章节的总结。由于本人接触Linux下网络编程时间不长,错误和疏漏再所难免,望看官不吝赐教。 一. read/write的语义:为什么会阻塞?

Python 网络编程(一)

核能气质少年 提交于 2020-01-02 20:25:51
Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者。 socket和file的区别: file模块是针对某个指定文件进行【打开】【读写】【关闭】 socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】 socket服务端和客户端的网络请求应答过程如下图所示: 一、TCP socket编程 TCP 服务端 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import socket ip = '0.0.0.0' port = 8888 sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sk.bind((ip, port)) sk.listen( 5 ) while True : conn, addr = sk.accept() print ( "%s 已连接" % addr[ 0 ]) conn.sendall(bytes( "hello" , encoding = "utf-8" )) while True :

网络编程

假装没事ソ 提交于 2020-01-02 20:17:45
我们可以在我们的电脑上和别人聊天,可以在自己的电脑上向网盘中上传、下载内容。这些都是两个程序在通信。由于在不同机器上的程序需要通信,才产生了网络 什么是网络编程呢? 网络编程呢就是通过网络让不同计算机上运行的程序可以进行通信。 计算机网络 1.局域网 局域网是指在某一区域内由多台计算机互联成的计算机 组。 2、广域网 广域网是一种跨越大的、地域性的计算机网络的集合。通 常跨越省、市,甚至一个国家。广域网包括大大小小不同的子网,子网可以是局域网,也可 以是小型的广域网。 单播:主机之间一对一的通信 广播:“一对多” 组播:“一对一组”,加入一个组之后,同一组内主机都可以收到这一个包 来源: CSDN 作者: 一口吃掉大胖子 链接: https://blog.csdn.net/blackdevil_/article/details/103809490

Python网络编程学习笔记(一)——UDP

烂漫一生 提交于 2020-01-02 03:11:57
代码清单2-1 使用自环接口的UDP服务器和客户端 import argparse, socket from datetime import datetime MAX_BYTES = 65535 def server(port): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(('127.0.0.1', port)) print('Listening at {}'.format(sock.getsockname())) while True: data, address = sock.recvfrom(MAX_BYTES) text = data.decode('ascii') print('The client at {} says {!r}'.format(address, text)) text = 'Your data was {} bytes long'.format(len(data)) data = text.encode('ascii') sock.sendto(data, address) def client(port): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) text = 'The time is {}

网络编程: 基于UDP协议的socket

南笙酒味 提交于 2020-01-01 19:57:05
udp是无链接的,启动服务之后可以直接接受消息 , 不需要提前建立链接 UDP协议的通信优势: 允许一个服务器同时和多个客户端通信, TCP不行 服务端 import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1', 8888)) while 1: # 接收 msg_r, addr = sk.recvfrom(1024) str_msg = msg_r.decode('utf-8') if str_msg == 'q': continue else: # 用':'分割字符串一次 变成列表 lis = str_msg.split(':', 1) # 姓名 na = lis[0].strip() # 信息 info = lis[1].strip() print('\033[1;37;40m' + na + ':\033[0m' + info) # 发送 msg_s = input('我:') if msg_s != 'q': sk.sendto(msg_s.encode('utf-8'), addr) else: sk.sendto(msg_s.encode('utf-8'), addr) break sk.close() 客户端 import socket name = input(

JAVA学习的一些重点

半腔热情 提交于 2020-01-01 09:11:54
1. Java语言基础 谈到Java语言基础学习的书籍,大家肯定会推荐Bruce Eckel的《Thinking in Java》。它是一本写的相当深刻的技术书籍,Java语言基础部分基本没有其它任何一本书可以超越它。该书的作者Bruce Eckel在网络上被称为天才的投机者,作者的《Thinking in C++》在1995年曾获SoftwareDevelopment Jolt Award最佳书籍大奖,《Thinking in Java》被评为1999年Java World“最爱读者欢迎图书”,并且赢得了编辑首选图书奖。作者从1986年至今,已经发表了超过150篇计算机技术文章,出版了6本书(其中4本是关于C++的),并且在全世界做了数百次演讲。他是《Thinking in Java》、《Thinking in C++》、《C++ Inside & Out》《Using C++》和《Thinking in Patterns》的作者,同时还是《Black Belt C++》文集的编辑。他的书被读者称为“最好的Java参考书……绝对让人震惊”;“购买Java参考书最明智的选择”;“我见过的最棒的编程指南”。作者的非凡才华,极其跨越语言的能力,使作者被选为Java发展10年间与Java关系最密切的10个人物之一。 《Thinking in Java》讲述了Java语言的方方面面

网络编程

若如初见. 提交于 2020-01-01 02:24:29
20145217 《Java程序设计》第八周学习总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴。在发送和接收数据时,大部分的程序设计语言都设计了专门的API实现这些功能,程序员只需要调用即可。 网络编程就是两个或多个设备之间的数据交换,其实更具体的说,网络编程就是两个或多个程序之间的数据交换,和普通的单机程序相比,网络程序最大的不同就是需要交换数据的程序运行在不同的计算机上,这样就造成了数据交换的复杂。虽然通过IP地址和端口可以找到网络上运行的一个程序,但是如果需要进行网络编程,则还需要了解网络通讯的过程。 网络通讯方式: 在现有的网络中,网络通讯的方式主要有两种: 1、 TCP(传输控制协议)方式 2、 UDP(用户数据报协议)方式 这两种传输方式都是实际的网络编程中进行使用,重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则都通过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。 网络编程步骤: 1、 建立网络连接 客户端网络编程的第一步都是建立网络连接。在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。 2、 交换数据 连接建立以后

网络编程是什么

自作多情 提交于 2020-01-01 02:21:32
对于初学者,或者没有接触过网络编程的程序员,会觉得网络编程涉及的知识很高深,很难,其实这是一种误解,当你的语法熟悉以后,其实基本的网络编程现在已经被实现的异常简单了。   网络编程是什么?   网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。   现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。   在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client),等待其他程序连接的程序被称作服务器(Server)。客户端程序可以在需要的时候启动,而服务器为了能够时刻相应连接,则需要一直启动。例如以打电话为例,首先拨号的人类似于客户端,接听电话的人必须保持电话畅通类似于服务器。   连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。   在一些程序中,程序既有客户端功能也有服务器端功能,最常见的软件就是BT、emule这类软件了。   下面来谈一下如何建立连接以及如何发送数据。   IP地址和域名   在现实生活中,如果要打电话则需要知道对应人的电话号码,如果要寄信则需要知道收信人的地址。在网络中也是这样,需要知道一个设备的位置

网络编程的概念

浪尽此生 提交于 2020-01-01 02:20:39
对于初学者,或者没有接触过网络编程的程序员,会觉得网络编程涉及的知识很高深,很难,其实这是一种误解,当你的语法熟悉以后,其实基本的网络编程现在已经被实现的异常简单了。   网络编程是什么?   网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。   现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。   在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client),等待其他程序连接的程序被称作 服务器 (Server)。客户端程序可以在需要的时候启动,而服务器为了能够时刻相应连接,则需要一直启动。例如以打电话为例,首先拨号的人类似于客户端,接听电话的人必须保持电话畅通类似于服务器。   连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。   在一些程序中,程序既有客户端功能也有服务器端功能,最常见的软件就是BT、emule这类软件了。   下面来谈一下如何建立连接以及如何发送数据。   IP地址和域名   在现实生活中,如果要打电话则需要知道对应人的电话号码,如果要寄信则需要知道收信人的地址。在网络中也是这样,需要知道一个设备的位置

python网络编程实现服务器和应用后台交互

耗尽温柔 提交于 2019-12-28 11:19:07
python网络编程实现服务器和应用后台交互 多进程并发面向对象实现 #实现服务端和应用后台交互简易代码服务器代码 from socket import * from multiprocessing import Process import re HOST = '0.0.0.0' PORT = 8000 ADDR = ( HOST , PORT ) DEBUG = True class HTTPsever : def __init__ ( self ) : self . addr = ADDR self . sockfd = socket ( ) self . bind ( ) def bind ( self ) : self . sockfd . setsockopt ( SOL_SOCKET , SO_REUSEADDR , 1 ) #端口重用 self . sockfd . bind ( self . addr ) def start ( self ) : self . sockfd . listen ( 5 ) while True : try : connfd , addr = self . sockfd . accept ( ) #循环接收客户端的连接 print ( 'client from:' , addr ) except KeyboardInterrupt :