网络编程练习这些就ok
1,什么是C/S架构?
C指的是client(客户端软件),S指的是Server(服务端软件)
一个C/S架构就是,实现服务端软件与客户端软件基于网络通信。 互联网中处处是C/S架构
如12306网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种)
腾讯作为服务端为你提供视频,你得下个腾讯视频客户端才能看它的视频) C/S架构与socket的关系:
我们学习socket就是为了完成C/S架构的开发
2,互联网协议是什么?分别介绍五层协议中每一层的功能?
英语成为世界上所有人通信的统一标准,计算机之间的通信也应该有一个像英语一样的通信标准,
这个标准称之为互联网协议, 可以很明确地说:互联网协议就是计算机界的英语,网络就是物理链接
介质+互联网协议。 我们需要做的是,让全世界的计算机都学会互联网协议,这样任意一台计算机在
发消息时都严格按照协议规定的格式去组织数据,接收方就可以按照相同的协议解析出结果了,这就
实现了全世界的计算机都能无障碍通信。 按照功能不同,人们将互联网协议分为osi七层或tcp/ip五
层或tcp/ip四层(我们只需要掌握tcp/ip五层协议即可),这种分层就好比是学习英语的几个阶段,
每个阶段应该掌握专门的技能或者说完成特定的任务,比如:1、学音标 2、学单词 3、学语法 4、写作文
简单说,计算机之间的通信标准,就称为互联网协议
按照功能不同,人们将互联网协议分为osi七层或tcp/ip五层或tcp/ip四层
tcp/ip四层:应用层,传输层,网络层,网络接口层
tcp/ip五层:应用层,传输层,网络层,数据链路层,物理层
osi七层:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
3,基于tcp协议通信,为何建立链接需要三次握手,而断开链接却需要四次挥手
为什么要三次挥手? 在只有两次“握手”的情形下,假设Client想跟Server建立连接,但是却因为中途连接请求的
数据报丢失了,故Client端不得不重新发送一遍;这个时候Server端仅收到一个连接请求,因此
可以正常的建立连接。但是,有时候Client端重新发送请求不是因为数据报丢失了,而是有可能
数据传输过程因为网络并发量很大在某结点被阻塞了,这种情形下Server端将先后收到2次请求,
并持续等待两个Client请求向他发送数据...问题就在这里,Cient端实际上只有一次请求,而
Server端却有2个响应,极端的情况可能由于Client端多次重新发送请求数据而导致Server端
最后建立了N多个响应在等待,因而造成极大的资源浪费!所以,“三次握手”很有必要! 为什么要四次挥手? 试想一下,假如现在你是客户端你想断开跟Server的所有连接该怎么做?
第一步,你自己先停止向Server端发送数据,并等待Server的回复。但事情还没有完,
虽然你自身不往Server发送数据了,但是因为你们之前已经建立好平等的连接了,
所以此时他也有主动权向你发送数据;故Server端还得终止主动向你发送数据,
并等待你的确认。其实,说白了就是保证双方的一个合约的完整执行!
三次握手:client发送请求建立通道;server收到请求并同意,同时也发送请求建通道;client收到请求并同意,建立完成
四次挥手:client发送请求断开通道;server收到请求并同意,同时还回复client上一条消息;server也发送请求断开通道;client受到消息结束
为什么TCP协议终止链接要四次? 1、当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口(当然确认信号还是可以发),
就会发FIN给主机B。 2、主机B收到A发送的FIN,表示收到了,就会发送ACK回复。 3、但这是B可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,
而是等到B数据发送完了,才会发送FIN给主机A。 4、A收到B发来的FIN,知道B的数据也发送完了,回复ACK, A等待2MSL以后,没有收到B传来的
任何消息,知道B已经收到自己的ACK了,A就关闭链接,B也关闭链接了。
4,为何基于tcp协议的通信比基于udp协议的通信更可靠?
tcp:可靠 对方给了确认收到信息,才发下一个,如果没收到确认信息就重发
udp:不可靠 一直发数据,不需要对方回应
(1)UDP:user datagram protocol(用户数据报协议)
特点:
——1:面向无连接:传输数据之前源端和目的端不需要建立连接
——2:每个数据报的大小都限制在64k(8个字节)以内
——3:面向报文的不可靠协议(即发出去的数据不一定会接收到)
——4:传输速率快,效率高
——5:现实生活实例:邮局寄件,实时在线聊天,视频协议等等
(2)TCP:transmission control protocol(传输控制协议)
特点:
——1:面向连接:传输数据之前需要建立连接
——2:在连接过程中进行大量的数据传输
——3:通过“三次握手”的方式完成连接,是安全可靠的协议
——4:传输效率低,速度慢
5,流式协议指的是什么协议,数据报协议指的是什么协议?
TCP协议,可靠传输
数据报协议: UDP协议,不可传输
也就是TCP和UDP的区别:
TCP是面向连接的,可靠的字节流服务
UDP是面向无连接的数据报服务
6,什么是socket?简述基于tcp协议的套接字通信流程流式协议:
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,
Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,
对用户来说,一组简单的接口就是全部。 服务端:创建socket对象,绑定ip端口bind(), 设置最大链接数listen(), accept()与客户端
的connect()创建双向管道, send(), recv(),close() 客户端:创建socket对象,connect()与服务端accept()创建双向管道 , send(), recv(),close()
7,什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?
粘包:数据粘在一起,主要因为:接收方不知道消息之间的界限,不知道一次性提取
多少字节的数据造成的数据量比较小,时间间隔比较短,就合并成了一个包,
这是底层的一个优化算法(Nagle算法)
8,基于socket开发一个聊天程序,实现两端互相发送和接收消息
服务端:
# _*_ coding: utf-8 _*_
# 8,基于socket开发一个聊天程序,实现两端互相发送和接收消息
import socket
ip_port = ('127.0.0.1',8088)
link = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
link.bind(ip_port)
link.listen(5) print("等待数据连接:。。》》")
# 阻塞直到有连接为止,有了一个新连接进来后,就会为这个请求生成一个连接对象
conn, addr = link.accept() client_data = conn.recv(1024)
print("这是收到的消息:",client_data.decode('utf-8'))
conn.send(client_data.upper()) conn.close()
link.close()
客户端
# _*_ coding: utf-8 _*_
# 8,基于socket开发一个聊天程序,实现两端互相发送和接收消息/
import socket
ip_port = ('127.0.0.1',8088)
link = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
link.connect(ip_port) print("开始发送数据")
cmd = input("请输入:>>").strip()
link.send(cmd.encode('utf-8'))
data = link.recv(1028)
print(data) link.close()
9,基于tcp socket,开发简单的远程命令执行程序,允许用户执行命令,并返回结果
服务端:
# _*_ coding: utf-8 _*_
# 9,基于tcp socket,开发简单的远程命令执行程序,允许用户执行命令,并返回结果
import socket
import struct
import subprocess ip_port = ('127.0.0.1',9999)
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.bind(ip_port)
sk.listen(5)
while True: #连接循环
conn,addr = sk.accept()
print(conn,addr)
while True: #通信循环
client_data = conn.recv(1024)
#处理过程
res = subprocess.Popen(client_data.decode('utf-8'),shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout = res.stdout.read()
stderr = res.stderr.read()
# 先发报头(转成固定长度的bytes类型,那么怎么转呢?就用到了struct模块)
length = len(stdout)+len(stderr)
header = struct.pack('i',length)
conn.send(header)
conn.send(stderr)
conn.send(stdout)
conn.close()
sk.close() conn.close()
sk.close()
客户端
# _*_ coding: utf-8 _*_
# 9,基于tcp socket,开发简单的远程命令执行程序,允许用户执行命令,并返回结果
import socket
import struct ip_port = ('127.0.0.1',9999)
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.connect(ip_port)
while True:
cmd = input("请输入命令:>>").strip()
if not cmd:continue
sk.send(cmd.encode('utf-8'))
header_struct = sk.recv(1024)
unpack_res = struct.unpack('i',header_struct)
total_size = unpack_res[0]
recv_size = 0
total_data = b''
while recv_size < total_size:
recv_data = sk.recv(1024)
recv_size += len(recv_data)
total_data += recv_data
print("返回的消息:%s"%total_data.decode('gbk'))
sk.close()
10,基于tcp协议编写简单FTP程序,实现上传、下载文件功能,并解决粘包问题
客户端
# _*_ coding: utf-8 _*_ import socket
import struct
import json
downlaod_dir = r'D:\文件传输\client\download' ip_port = ('127.0.0.1',8808)
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(ip_port)
while True:
cmd = input(">>>").strip() #get D:\文件传输\server\a.avi
if not cmd:continue
phone.send(cmd.encode('utf-8'))
#接受文件的内容,以写的方式打开一个新文件,接受服务端发来的文件内容,并写入客户端的新文件
#第一步,先收报头的长度,然后解包
obj = phone.recv(1024)
header_size = struct.unpack('i',obj)[0]
#第二部 再收报头
header_bytes = phone.recv(header_size) #第三部,从报头中解析除对真实数据的描述信息
header_json = header_bytes.decode('utf-8')
header_dic = json.loads(header_json)
'''
header_dic = {
'filename':filename, #a.avi
'md5':'dsdsd',
'file_size':os.path.getsize(filename)
}'''
print(header_dic)
total_size = header_dic['file_size']
filename = header_dic['filename'] #第四步,接受真实的数据
with open('%s/%s'%(downlaod_dir,filename),'wb') as f:
recv_size = 0
# recv_data = b''
while recv_size <total_size:
res = phone.recv(1024)
# recv_data += res
f.write(res)
recv_size += len(res)
print("总大小: %s \n已经下载大小 :%s"%(total_size,recv_size)) # print(recv_data.decode('utf-8'))
phone.close()
服务端
# _*_ coding: utf-8 _*_
import subprocess
import socket
import struct
import json
import os
share_dir =r'/文件传输/server/share' phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip_port = ('127.0.0.1',8808)
phone.bind(ip_port)
phone.listen(5)
print("starting....")
while True: #链接循环
conn,client_addr = phone.accept()
print(client_addr)
while True: #通信循环
try:
#收命令
res = conn.recv(1024) #b'get a.txt'
if not res :continue
#解析命令,提取相应的参数
cmds = res.decode('utf-8').split()
filename = cmds[1]
#以读的方式打开文件,读取文件内容发送给客户端
# with open(filename,'rb') as f:
# conn.s
#制定固定长度的报头
header_dic = {
'filename':filename, #a.avi
'md5':'dsdsd',
'file_size':os.path.getsize(r"%s/%s"%(share_dir,filename))
}
header_json = json.dumps(header_dic)
header_bytes = header_json.encode('utf-8')
#先发送报头的长度
conn.send(struct.pack('i',len(header_bytes)))
#再发报头
conn.send(header_bytes)
#再发真实的数据
with open('%s/%s'%(share_dir,filename),'rb') as f:
# conn.send(f.read())
for line in f:
conn.send(line) except ConnectionResetError:
break
conn.close()
phone.close()
函数版本服务端
# _*_ coding: utf-8 _*_
import socket
import os
import struct
import pickle dirname = os.path.dirname(os.path.abspath(__file__))
filepath = os.path.join(dirname, 'share') def get(cmds,conn):
filename = cmds[1]
file_path = os.path.join(filepath, filename)
if os.path.isfile(file_path):
header = {
'filename': filename,
'md5': 'xxxxxx',
'file_size': os.path.getsize(file_path)
}
header_bytes = pickle.dumps(header)
conn.send(struct.pack('i', len(header_bytes)))
conn.send(header_bytes) with open(file_path, 'rb') as f:
for line in f:
conn.send(line)
else:
conn.send(struct.pack('i', 0)) def put(cmds,conn):
pass def run():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 8080))
server.listen(5)
print('starting...')
while True:
conn, client_addr = server.accept()
print(client_addr)
while True:
try:
res = conn.recv(1024)
if not res: continue
cmds = res.decode('utf-8').split()
if cmds[0] == 'get':
get(cmds,conn)
elif cmds[0] == 'put':
put(cmds,conn)
except ConnectionResetError:
break
conn.close() server.close() if __name__ == '__main__':
run()
函数版本客户端
# _*_ coding: utf-8 _*_
import socket
import struct
import pickle
import os dirname = os.path.dirname(os.path.abspath(__file__))
filepath = os.path.join(dirname,'download') def get(client):
obj = client.recv(4)
header_size = struct.unpack('i', obj)[0]
if header_size == 0:
print('文件不存在')
else:
header_types = client.recv(header_size)
header_dic = pickle.loads(header_types)
print(header_dic)
file_size = header_dic['file_size']
filename = header_dic['filename'] with open('%s/%s' % (filepath, filename), 'wb') as f:
recv_size = 0
while recv_size < file_size:
res = client.recv(1024)
f.write(res)
recv_size += len(res)
print('总大小:%s 已下载:%s' % (file_size, recv_size)) def put():
pass def run():
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8080))
while True:
msg = input(">>>:").strip() # get a.txt
if not msg:continue
client.send(msg.encode('utf-8')) cmds = msg.split()
if cmds[0] == 'get':
get(client)
elif cmds[0] == 'put':
put() client.close() if __name__ == '__main__':
run()
面向对象版本服务端
# _*_ coding: utf-8 _*_
import socket
import os
import struct
import pickle class TCPServer:
address_family = socket.AF_INET
socket_type = socket.SOCK_STREAM
listen_count = 5
max_recv_bytes = 8192
coding = 'utf-8'
allow_reuse_address = False
# 下载的文件存放路径
down_filepath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'share')
# 上传的文件存放路径
upload_filepath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'upload') def __init__(self,server_address,bind_and_listen=True):
self.server_address = server_address
self.socket = socket.socket(self.address_family,self.socket_type) if bind_and_listen:
try:
self.server_bind()
self.server_listen()
except Exception:
self.server_close() def server_bind(self):
if self.allow_reuse_address:
self.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
self.socket.bind(self.server_address) def server_listen(self):
self.socket.listen(self.listen_count) def server_close(self):
self.socket.close() def server_accept(self):
return self.socket.accept() def conn_close(self,conn):
conn.close() def run(self):
print('starting...')
while True:
self.conn,self.client_addr = self.server_accept()
print(self.client_addr)
while True:
try:
res = self.conn.recv(self.max_recv_bytes)
if not res:continue
cmds = res.decode(self.coding).split()
if hasattr(self,cmds[0]):
func = getattr(self,cmds[0])
func(cmds)
except Exception:
break
self.conn_close(self.conn) def get(self,cmds):
""" 下载
1.找到下载的文件
2.发送 header_size
3.发送 header_bytes file_size
4.读文件 rb 发送 send(line)
5.若文件不存在,发送0 client提示:文件不存在
:param cmds: 下载的文件 eg:['get','a.txt']
:return:
"""
filename = cmds[1]
file_path = os.path.join(self.down_filepath, filename)
if os.path.isfile(file_path):
header = {
'filename': filename,
'md5': 'xxxxxx',
'file_size': os.path.getsize(file_path)
}
header_bytes = pickle.dumps(header)
self.conn.send(struct.pack('i', len(header_bytes)))
self.conn.send(header_bytes)
with open(file_path, 'rb') as f:
for line in f:
self.conn.send(line)
else:
self.conn.send(struct.pack('i', 0)) def put(self,cmds):
""" 上传
1.接收4个bytes 得到文件的 header_size
2.根据 header_size 得到 header_bytes header_dic
3.根据 header_dic 得到 file_size
3.以写的形式 打开文件 f.write()
:param cmds: 下载的文件 eg:['put','a.txt']
:return:
"""
obj = self.conn.recv(4)
header_size = struct.unpack('i', obj)[0]
header_bytes = self.conn.recv(header_size)
header_dic = pickle.loads(header_bytes)
print(header_dic)
file_size = header_dic['file_size']
filename = header_dic['filename'] with open('%s/%s' % (self.upload_filepath, filename), 'wb') as f:
recv_size = 0
while recv_size < file_size:
res = self.conn.recv(self.max_recv_bytes)
f.write(res)
recv_size += len(res) tcp_server = TCPServer(('127.0.0.1',8080))
tcp_server.run()
tcp_server.server_close() 服务端
面向对象版本客户端
# _*_ coding: utf-8 _*_
import socket
import struct
import pickle
import os class FTPClient:
address_family = socket.AF_INET
socket_type = socket.SOCK_STREAM
# 下载的文件存放路径
down_filepath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'download')
# 上传的文件存放路径
upload_filepath = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'share')
coding = 'utf-8'
max_recv_bytes = 8192 def __init__(self, server_address, connect=True):
self.server_address = server_address
self.socket = socket.socket(self.address_family, self.socket_type)
if connect:
try:
self.client_connect()
except Exception:
self.client_close() def client_connect(self):
self.socket.connect(self.server_address) def client_close(self):
self.socket.close() def run(self):
while True:
# get a.txt 下载 put a.txt 上传
msg = input(">>>:").strip()
if not msg: continue
self.socket.send(msg.encode(self.coding))
cmds = msg.split()
if hasattr(self,cmds[0]):
func = getattr(self,cmds[0])
func(cmds) def get(self, cmds):
""" 下载
1.得到 header_size
2.得到 header_types header_dic
3.得到 file_size file_name
4.以写的形式 打开文件
:param cmds: 下载的内容 eg: cmds = ['get','a.txt']
:return:
"""
obj = self.socket.recv(4)
header_size = struct.unpack('i', obj)[0]
if header_size == 0:
print('文件不存在')
else:
header_types = self.socket.recv(header_size)
header_dic = pickle.loads(header_types)
print(header_dic)
file_size = header_dic['file_size']
filename = header_dic['filename'] with open('%s/%s' % (self.down_filepath, filename), 'wb') as f:
recv_size = 0
while recv_size < file_size:
res = self.socket.recv(self.max_recv_bytes)
f.write(res)
recv_size += len(res)
print('总大小:%s 已下载:%s' % (file_size, recv_size))
else:
print('下载成功!') def put(self, cmds):
""" 上传
1.查看上传的文件是否存在
2.上传文件 header_size
3.上传文件 header_bytes
4.以读的形式 打开文件 send(line)
:param cmds: 上传的内容 eg: cmds = ['put','a.txt']
:return:
"""
filename = cmds[1]
file_path = os.path.join(self.upload_filepath, filename)
if os.path.isfile(file_path):
file_size = os.path.getsize(file_path)
header = {
'filename': os.path.basename(filename),
'md5': 'xxxxxx',
'file_size': file_size
}
header_bytes = pickle.dumps(header)
self.socket.send(struct.pack('i', len(header_bytes)))
self.socket.send(header_bytes) with open(file_path, 'rb') as f:
send_bytes = b''
for line in f:
self.socket.send(line)
send_bytes += line
print('总大小:%s 已上传:%s' % (file_size, len(send_bytes)))
else:
print('上传成功!')
else:
print('文件不存在') ftp_client = FTPClient(('127.0.0.1',8080))
ftp_client.run()
ftp_client.client_close() 客户端
11,基于udp协议编写程序,实现功能
服务端:
# _*_ coding: utf-8 _*_
import socket
ip_port = ('127.0.0.1',8808)
udp_server_client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_server_client.bind(ip_port)
while True:
conn,addr = udp_server_client.recvfrom(1024)
print(conn,addr) udp_server_client.sendto(conn.upper(),addr)
客户端:
# _*_ coding: utf-8 _*_
import socket
ip_port = ('127.0.0.1',8808)
udp_server_client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
cmd = input(">>>>").strip()
if not cmd:
continue
udp_server_client.sendto(cmd.encode('utf-8'),ip_port)
back_cmd,addr = udp_server_client.recvfrom(1024)
print(back_cmd.decode('utf-8'))
UDP不会发生粘包现象,下面举例说明
客户端
# _*_ coding: utf-8 _*_
import socket ip_port = ('127.0.0.1',8989)
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
client.sendto('hello'.encode('utf-8'),ip_port)
client.sendto('james'.encode('utf-8'),ip_port)
client.close()
服务端
# _*_ coding: utf-8 _*_
import socket ip_port = ('127.0.0.1',8989)
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind(ip_port)
res1 = server.recvfrom(5)
print("res1:",res1)
res2 = server.recvfrom(5)
print("res2:",res2)
server.close()
12,执行指定的命令,让客户端可以查看服务端的时间
13,执行指定的命令,让客户端可以与服务的的时间同步
服务端
# _*_ coding: utf-8 _*_
import socket
import subprocess
import time server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))
while True:
data, client_addr = server.recvfrom(1024)
print(data, client_addr)
obj = subprocess.Popen(data.decode('utf-8'),shell=True, # time 命令在windows 下不能用
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout = obj.stdout.read()
stderr = obj.stderr.read()
print(stdout+stderr)
server.sendto(stdout+stderr,client_addr)
if data.decode('utf-8') == 'time':
str_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
# str_time = '2017-01-01 00:00:00'
server.sendto(str_time.encode('gbk'), client_addr) server.close()
客户端
# _*_ coding: utf-8 _*_
import socket
import os
import time
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg = input('>>>:').strip()
client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
data,server_addr = client.recvfrom(1024)
print(data.decode('utf-8'),server_addr)
localtime = time.localtime()
os.system("date %d-%d-%d" % (localtime.tm_year, localtime.tm_mon, localtime.tm_mday)) # 设置日期
os.system("time %d:%d:%d.0" % (localtime.tm_hour, localtime.tm_min, localtime.tm_sec)) # 设置时间 client.close()
网络编程练习这些就ok的更多相关文章
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- python select网络编程详细介绍
刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- 猫哥网络编程系列:详解 BAT 面试题
从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...
- 浅谈C#网络编程(一)
阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...
- C++11网络编程
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...
- Java - 网络编程
Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh. 参考:
- Linux网络编程-IO复用技术
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- iOS网络编程
今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...
随机推荐
- Java并发编程:synchronized和锁优化
1. 使用方法 synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面: 确保线程互斥的访问代码块,同一时刻只有一个方法可以进入到临界区 保 ...
- Hibernat 原生SQL运行结果集处理方法
hibernate对原生SQL查询执行的控制是通过SQLQuery接口进行的. Session.createSQLQuery(); 使用list()方法可以把Session.createSQLQuer ...
- Xshell与虚拟机不能正常连接
1.发现Xshell与虚拟机下的两个CentOS都不能正常连接,在这些系统下采用ifconfig查询发现eth0都没有ip地址,进而想到可能是虚拟机的设置出了问题,后来又想到自己之前曾经尝试过设置VM ...
- Spring(一):eclipse上安装spring开发插件&下载Spring开发包
eclipse上安装spring开发插件 1)下载安装插件包:https://spring.io/tools/sts/all 由于我的eclipse版本是mars 4.5.2,因此我这里下载的插件包是 ...
- Java 局部变量、实例变量、类变量(静态变量)区别
1. 局部变量: 局部变量是类的方法中的变量: 2. 实例变量: 实例变量也是类中独立于方法之外的变量,不过没有static修饰,也叫 对象变量 3. 类变量(静态变量): 类变量是类中独立于方法之外 ...
- Visual Studio的一些快捷键
1)CTRL + W选择当前单词 2) Ctrl+F10: 运行到光标处 1.CTRL + SHIFT + B生成解决方案 2.CTRL + F7 生成编译 3. CTRL + O 打开文件 ...
- Python3NumPy——数组(2)之数学空间与NumPy空间
0 介绍 本文承接上一篇,文章采用新的阐述方式,将数学中的表达与NumPy中的函数关联起来. 采用这种方式,可以直接建立数学表达与计算系统的对应关系,更易理解. 由于博客编写时间有限,每次尝试一个知识 ...
- 自行实现高性能MVC WebAPI
wcf虽然功能多.扩展性强但是也面临配置忒多,而且restful的功能相当怪异,并且目前没法移植.asp.net core虽然支持webapi,但是功能也相对繁多.配置复杂.就没有一个能让码农们安安心 ...
- .NET CORE 2.0之 依赖注入在类中获取IHostingEnvironment,HttpContext
在.NET CORE 中,依赖注入非常常见, 在原先的 HttpContext中常用的server.Mappath已经么有了如下: HttpContext.Current.Server.MapPath ...
- Ubantu16.04系统优化
系统清理篇 系统更新 安装完系统之后,需要更新一些补丁.Ctrl+Alt+T调出终端,执行一下代码: sudo apt-get update sudo apt-get upgrade 卸载libreO ...