tcpip网络编程(tcpip网络编程 pdf)
网络编程和tcpip都要看吗
是。网络编程和tcpip是都要看的,网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用,tcpip是供已连接因特网的计算机进行通信的通信协议。
关于tcpip 网络编程中客户端和服务器的双向通信
服务器端与客户端都使用监听,客户端要与服务端通讯的时候,客户端会向服务端发送相关请求,并监听。服务端一直在监听,当收到请求后会返回相关信息给客户端。跟打电话是一样的。
C# TCPIP传送数据
端口号和ip地址自己改一下
using System.Net;
using System.Net.Sockets;
static void Main(string[] args)//服务器段
{
int port = 2000;
string host = "127.0.0.1";
/**/
///创建终结点(EndPoint)
IPAddress ip = IPAddress.Parse(host);//把ip地址字符串转换为IPAddress类型的实例
IPEndPoint ipe = new IPEndPoint(ip, port);//用指定的端口和ip初始化IPEndPoint类的新实例
/**/
///创建socket并开始监听
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个socket对像,如果用udp协议,则要用SocketType.Dgram类型的套接字
s.Bind(ipe);//绑定EndPoint对像(2000端口和ip地址)
s.Listen(0);//开始监听
Console.WriteLine("等待客户端连接");
/**/
///接受到client连接,为此连接建立新的socket,并接受信息
Socket temp = s.Accept();//为新建连接创建新的socket
Console.WriteLine("建立连接");
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
/**/
///给client端返回信息
Console.WriteLine("server get message:{0}", recvStr);//把客户端传来的信息显示出来
string sendStr = "ok!Client send message successful!";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
temp.Send(bs, bs.Length, 0);//返回信息给客户端
temp.Close();
s.Close();
Console.ReadLine();
}
static void Main(string[] args)//客户端
{
try
{
int port = 2000;
string host = "127.0.0.1";
/**/
///创建终结点EndPoint
IPAddress ip = IPAddress.Parse(host);
//IPAddress ipp = new IPAddress("127.0.0.1");
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndpoint实例
/**/
///创建socket并连接到服务器
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
Console.WriteLine("Conneting…");
c.Connect(ipe);//连接到服务器
/**/
///向服务器发送信息
string sendStr = "hello!This is a socket test";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);//把字符串编码为字节
Console.WriteLine("Send Message");
c.Send(bs, bs.Length, 0);//发送信息
/**/
///接受从服务器返回的信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
Console.WriteLine("client get message:{0}", recvStr);//显示服务器返回信息
/**/
///一定记着用完socket后要关闭
c.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("argumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException:{0}", e);
}
Console.WriteLine("Press Enter to Exit");
}
unix网络编程与tcpip详解看哪个
看《UNIX网络编程》。TCP/IP详解不错,它共有三卷,依次阅读循序渐进比较合理,容易掌握,第一卷是基础,第二卷是实现,第三卷是事务。另外以windows为基础的网络编程方面的书籍也可以看看。UNIX网络编程(UNP),有两卷,讲原理和实现。都是UNIX/.LINUX关于网络最经典的书籍之一,细细研究绝对有好处。
vue双向绑定数据改为静态数据
程序猿
vue中如何实现数据的双向绑定
??vue中如何实现数据的双向绑定
??vue中的指令
??????v-cloak:
??????v-model(表单元素设置了之后会忽略掉value,checked,selected)
??????v-text:代替 {{}} 渲染成文本(不会识别html标签)可以防止网速卡慢时{{}}出现在页面上
??????v-html:把html字符渲染成html
??????v-once:只绑定一次(不能写成v-once=”msg”)
??????v-bind:动态地绑定一个或多个特性
??????v-for:遍历数组、对象、字符串、数字
??????条件渲染:v-if v-else-if v-else与v-show
??????v-show
??????v-on:监听 DOM 事件(v-on:click可缩写为@click)
??????自定义指令
??vue中的修饰符
????表单修饰符
????事件修饰符
??表单元素双向数据绑定(双向同步)
????单选框
????复选框
????下拉框
??Vue中的Class样式与style样式动态绑定(动态的优先级高于原来的)
??根据hash实现单页面开发
vue中如何实现数据的双向绑定
实现视图变化数据跟着变:分两步,上面get中的为第二步(即再次读取的时候会调用get方法得到之前设置的值,以此来实现动态改变)
由于直接写obj.name = this.value;会导致循环调用set方法,所以要借助中间对象的形式把值赋给中间对象,获取obj.name的时候我们获取中间对象的最新值即可
复制代码
let obj = {name:'zhufeng',age:9};//数据
let temp = {name:"lily"};//借助中间对象
let input1 = document.getElementById("box2");//视图
//对某一个对象使用了Object.defineProperty方法之后就要写对应的get和set方法了,不然无法像操作普通对象一样访问或者设置它的属性
//此方法不兼容IE8及以下
Object.defineProperty(obj,"name",{
configurable:true,//属性是否可删除
writable:false,//属性是否可修改
enumerable:false,//属性是否可枚举
get(){//获取obj的属性名对应的属性值时会调用该方法
/*2*/ return temp['name'];
},
set(val){//设置obj的属性名对应的属性值时会调用此方法
//实现视图变化数据跟着变:分两步,上面get中的为第二步(即再次读取的时候会调用get方法得到之前设置的值,以此来实现动态改变)
//由于直接写obj.name = this.value;会导致循环调用set方法,所以要借助中间对象的形式把值赋给中间对象,获取obj.name的时候我们获取中间对象的最新值即可
/*1、*/ temp.name=val;
//实现数据变化视图改变
input1.value=val;
}
});
//为了初始化的时候让视图中(文本框中)有值:出现obj.name说明要访问这个属性就会用到defineProperty中的get方法
input1.value=obj.name;
//实现视图改变数据跟着改变
input1.addEventListener("input",function(){
obj.name = this.value;//当值变化时会调用set方法
},false);
复制代码
vue中的指令
dom元素的行间属性,vue提供了内置的指令,必须以v-开头,后面的值均为变量
v-cloak:
消除页面刚加载时会看到{{}}闪一下的效果,可加给最外层的根元素;
//需要添加对应的css样式
[v-cloak]{
display: none;
}
v-model(表单元素设置了之后会忽略掉value,checked,selected)
让表单元素和数据实现双向绑定(映射关系)
input type="text" v-model="msg"
v-text:代替 {{}} 渲染成文本(不会识别html标签)可以防止网速卡慢时{{}}出现在页面上
{{}} 中的值都会解析成文本内容;
{{msg}}等价于div v-text="msg"!--此处不能再写内容,防止出现闪的效果--/div
v-html:把html字符渲染成html
div v-html="msg"/div
v-once:只绑定一次(不能写成v-once=”msg”)
div v-once{{msg}}/div
v-bind:动态地绑定一个或多个特性
// 绑定一个属性
img v-bind:src="imageSrc"
//可缩写为如下形式,此时:src后面的值就可以是变量、表达式、赋值运算、计算、三元运算符(尽量少写逻辑运算)
img :src="imageSrc"//此时imageSrc就代表一个变量
v-for:遍历数组、对象、字符串、数字
解决了循环问题,更高效,会在原有的基础上进行修改,会复用原有的结构,不会修改所有DOM
复制代码
要循环创建哪一个标签就在那一个标签上加v-for,后面的循环最好用in,用of有时会报错循环数组或对象使用v-for指令
div v-for="(val,index) in msg"
{{val,index}}//msg为数组时,val为数组中的每一项,index为索引
/div
div v-for="(value,key,index) in msg"
{{key}}={{value}}{{index}};//msg为对象时,key为对象中的每个属性名,value为属性值,index为索引
/div
复制代码
条件渲染:v-if v-else-if v-else与v-show
v-if v-else-if v-else:条件满足才渲染v-if所在标签以及标签内的内容;(操作的是DOM结构)
设置条件判断的DOM元素必须是连续的
操作的是DOM元素
key 管理复用的元素 若不想复用DOM元素,只需要给相应的DOM元素增加不同的key值
支持 template 标签
频繁的显示和隐藏用v-if会很浪费性能(操作的是DOM结构),此时要用v-show(操作的是CSS样式)
div id="app"
button @click="flag=!flag"请点击/button
//template标签是vue提供给我们的没有任何实际意义,用来包裹元素用的(v-show不支持template标签)
template v-if="flag"
label登录/label
input type="text" key="1"//key 管理复用的元素 若不想复用DOM元素,只需要给相应的DOM元素增加不同的key值
/template
template v-else
label注册/label
input type="text" key="2"
/template
/div
let vm=new Vue({
el:'#app',
data:{
flag:true
}
});
v-show
条件满足才让v-show所在标签以及标签内的内容显示(操作的是元素的css样式),不支持 template 标签
input type="text" v-show="flag"//flag为true时,input框才显示
v-on:监听 DOM 事件(v-on:click可缩写为@click)
可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码(在 methods 对象中定义的方法,而且methods中的方法名不能和data中的变量名一样)
div v-on:click ="fn1('zhaosi,$event')"{{msg}}/div
div @click ="fn1('zhaosi,$event')"{{msg}}/div//上面的简写
方法后面可加()可不加。不加的话默认会传入事件对象e,
加()代表要传参数,如果要用事件对象,则需要传$event
自定义指令
可通过在vue实例的directives:{}属性中赋予自定义指令意义
复制代码
div id="app"
button v-color="flag"变色/button
/div
let vm=new Vue({
el:'#app',
data:{
flag:true
},
directives:{//在这里赋予对应自定义指令意义
//可直接写对应的指令不用写v-
color(el,val){
//el和val都是默认给的:el指的是指令所绑定的DOM元素,val是一个对象,里面存储的是有关指令的信息,可用val.value获取到指令绑定的变量(或者表达式)所代表的值,这里就是flag所代表的值 'red'
el.style.background=val.value;
}
}
});
复制代码
vue中的修饰符
表单修饰符
v-model.number:将用户的输入值转为数值类型
v-model.lazy:在表单触发change事件时更新数据,而非触发input事件时更新数据
v-model.trim:自动过滤用户输入的首尾空白字符
事件修饰符
@click.stop:阻止点击事件的传播(往上传播和往下传播都会被阻止)
@submit.prevent:阻止点击提交按钮时的默认行为(阻止事件的默认行为)
@click.capture:点击的时候让事件在捕获阶段执行;
@click.once:只在第一次点击的时候让绑定的事件执行;
@click.self:只有点击的事件源是自己的时候触发事件;(判断事件源)
表单元素双向数据绑定(双向同步)
使用v-model属性可让input中的内容和数据实现双向同步,但是使用了v-model属性之后,input的value、checked、select属性都会失效
复制代码
div id="app"
input type="text" v-model="msg"
/div
script src="vue.js"/script
script
let vm=new Vue({
el:'#app',//vue的属性和方法对哪个DOM根元素起作用(对它的后代元素也起作用)
//数据
如果data中属性的值是一个数组,如果想改变数组中内容,只能使用原生的会修改原数组的方法进行修改,普通的 数组[索引]=值 不行;
data:{//写在data中的属性都会挂载到当前实例上
msg:'zhufeng'
}
});
console.log(vm.msg);//'zhufeng'
/script
复制代码
单选框
对于单选框和复选框来说,加了v-mdel属性后,初始设置的value属性不会失效;
复制代码
div id="app"
input type="radio" v-model="msg" value="男"男
input type="radio" v-model="msg" value="女"女
{{msg}}
/div
let app3=new Vue({
el:'#app',
data:{
msg:'男'//默认选中的项,值与value的值对应,点击女的时候msg就会动态改为女
}
});
复制代码
复选框
单个复选框:
复制代码
div id="app"
//复选框中加了v-model后value依然可用
input type="checkbox" v-model="msg"
/div
let app3=new Vue({
el:'#app',
data:{
//如果是复选框且只有一个的时候,会把msg的值转化为布尔值,如果为true,代表选中
msg:false//为false时代表默认不选中
}
});
复制代码
多个复选框,需要绑定到同一个数组,而且要给input设置初始value值,为了在后面选中的时候获取到对应的选中框的值
复制代码
div id="app"
//复选框中加了v-model后value依然可用
input type="checkbox" v-model="msg" value="吃饭"吃饭
input type="checkbox" v-model="msg" value="睡觉"睡觉
input type="checkbox" v-model="msg" value="敲代码"敲代码
{{msg}}
/div
new Vue({
el: '#app',
data: {
msg: [] //此处的msg需要是一个数组
}
})
复制代码
下拉框
复制代码
div id="app"
//加了multiple后就变为多选框,用ctrl+左键点击多选,msg也要换为一个数组
select v-model="msg" multiple
//加了disabled时候用户就不能选中此项了
//option中的value是给写代码的人看的
option value="0" disabled请选择地区/option
option value="1"北京/option
option value="2"上海/option
option value="3"浙江/option
/select
{{msg}}//如果option的value属性不写,则取的是option中的内容
/div
let app3=new Vue({
el:'#app',
data:{
msg:'0'//默认选中的某一项,值与每一个option的value值对应
}
});
复制代码
Vue中的Class样式与style样式动态绑定(动态的优先级高于原来的)
:class=”{}”或者:class=”[]:
通过:class=”{}”或者:class=”[]来动态的绑定class样式,与原来的class样式不冲突。
有两种方式:
1、对象的方式绑定
2、数组的方式绑定
复制代码
div id="app"
!--以对象的方式动态绑定class样式:当flag为true时,z样式生效。y样式不生效--
div class="x" :class="{z:flag,y:false}"我的世界/div
!--以数组的方式动态绑定class样式:y,z两个样式都会生效--
div class="x" :class="[y,z]"我的世界/div
/div
let vm=new Vue({
el:'#app',
data:{
flag:true
}
});
复制代码
:style=”{}”或者:style=”[]”:绑定行内的样式
通过上述的方式来动态绑定行内的样式
复制代码
div id="app"
//第一种是对象的方式
div :style="{backgroundColor:'red',color:'pink'}"我是谁/div
//第二种是数组的方式
div :style="[str1,str2]"我的世界/div
/div
let vm=new Vue({
el:'#app',
data:{
str1:{backgroundColor:'blue'},
str2:{color:'yellow'}
}
});
复制代码
根据hash实现单页面开发
通过hash记录跳转的路径(可以产生历史管理)
浏览器自带的历史管理方法history(history.pushState(),push到哪里就跳转到哪里),可能会导致404错误(因为用户可能会随意输入路径)
开发时使用hash的方式,上线的时候使用history的方式
[使用hash存储]
//存储:存储的时候要把存储的对象转换成字符串
localStorage.setItem('todo',JSON.stringify(obj));
//获取:获取的时候要把字符串转换成对象
JSON.parse(localStorage.getItem('todo'));
原文地址:
推荐文章
ASP.NET Core 使用 Hangfire 定时任务
在.NET Core 中实现健康检查
c# aspose操作word文档
图片字节流和字符串互转,读存图片。
Go项目开源规范
flex布局实例demo全解
mathcurve.com
unity模型切割
【基础】为何odd negative scaling会导致Unity动态合批失败?
MySQL 有关用户密码
【Redis】info 命令详解
frida hook so文件
python 常见算法面试题
助教工作总结
第十六周助教总结
1015 Reversible Primes (20 分)
1014 Waiting in Line (30 分)
GitLab: Author ‘xxx‘ is not a member of team
关于python的算法程序,如何做成分布式处理,并解决环境的冲突等问题的记录
鲲鹏arm架构编译mysql
用java的眼光看js的oop
SpringBoot YAML文件特殊类型配置
【框架】一种通知到多线程框架
【网络基础】数据包生命
【网络编程】TCPIP-小笔记集合
【网络编程】TCPIP-8-套接字的多种选项
【网络编程】TCPIP-7-域名与网络地址
【网络编程】TCPIP-6-TCP的半关闭
Web应用安全防护-WAF
漫画 | 这样的程序员男友,让我分分钟想剖腹自尽!
Copyright 2008-2020 ?晋ICP备16003840号-1
本人想自学网络编程,现在手里有两本书一本是TCPIP协议卷二,一本是UNIX网络编程,我应该先看哪本会好一些?
你好!
最好先把linux熟悉了,然后看TCPIP协议卷,了解TCP/IP协议,然后看Unix网络编程,可以相辅相成看.
打字不易,采纳哦!