网络编程简单总结

前言

Alt text
在java网络编程中最主要的是tcp/ip协议,这个协议也是Internet最基本的协议,而其就是由网络层的ip协议和传输层的tcp协议组成,同时由于分层的思想,也就是每一层只能与它下面的层打交道,也就是说,应用层只跟传输层打交道,传输层只跟网络层打交道

ip协议

Alt text
关于底层协议的具体过程是在太复杂了,当初学习计算机网络的时候也是被各种细节弄得云里雾里的,总之ip层就是唯一确定了一台机器,就像我们住的房间地址一样,唯一确定了我们的住处
这里需要注意的是,ip地址由四位字节组成,每个字节由8位二进制组成,同时有a,b,c三类地址,如图由网络号和主机号组成,当然这是公网,如果是局域网的话,就需要配网关和子网掩码了,如192.168.1.1和255.255.0.0那么255.255就是确定了ip地址哪几位字节是网络号,如192.168就是网络号,当然其配置各种内网ip是很复杂的,具体参考计算机网络

TCP与UDP协议

tcp协议

它是专门设计用于在不可靠的因特网上提供端到端的字节流通信的协议,它是一种面向连接的协议,它连接的是字节流。
这里面有几个注意的地方:
可靠性:就是建立三次握手过程,就是说,我把信息传给你,等待,收到回复后,在确认。。最后在发送消息,它保证了数据一定发送给了对方,所以是一种可靠传输,但是遇到阻塞效率会很低
端口:ip地址唯一确定了这台机器,相当于一个房子,但是你消息总不能发给整个电脑吧,比如qq,而端口就相当于一间房间,具体发给那个,比如送到qq这间房间

端口分类

有65536个端口 0号是保留端口
1-1024是固定端口
又叫有名端口,即被某些程序固定使用,一般程序员不使用。
22:SSH远程登录协议 23:telnet使用 21:ftp使用
25:smtp服务使用 80:iis使用 7:echo服务
1025-65535是动态端口
这些端口,程序员可以使用
端口(port)–注意事项
1、在计算机(尤其是做服务器)要尽可能的少开端口;
2、一个端口只能被一个程序监听;
3、如果使用netstat -an可以查看本机有哪些端口在监听

UDP协议
UDP向应用程序提供了一种发送封装的原始IP数据报的方法,并且发送时无需建立连接,是一种不可靠的连接。
简单来说,就是只发一次数据,不管对方有没有接收到都不会再发了,但是有时候效率会很高,像网络拥堵时

url
统一资源定义符也被称为网页地址。Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是Internet上的站点,简单地说,URL就是Web地址,俗称“网址”,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法,如:
http://www.sina.com:8080/index.html
1、协议;2、ip地址(32位);3、端口号(16位)0-65535;4、资源名称。

单工、半双工和全双工
如果甲可以向乙发送数据,但是乙不能向甲发送数据,这样的通信就是单工通信(Simplex Communication)。
单工数据传输只支持数据在一个方向上传输,就和传呼机一样。
半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信,就和对讲机(步话机)一样;
全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力,就和电话一样

Socket编程

Alt text
如模拟的客户端与服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class MyServer {
public static void main(String[] args) {
new MyServer();
}
public MyServer(){
try {
//在9999号端口上监听
ServerSocket ss=new ServerSocket(9999);
System.out.println("9999端口监听...");
//等待某个客户端来连接,该函数会返回一个Socket连接
Socket s=ss.accept();
//要读取s中传递的数据
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
String info=br.readLine();
System.out.println("服务器接收到:\t"+info);
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
pw.println("我是服务器,已收到你发送的信息!");
} catch (Exception e) {
// TODO: handle exception
}
}
}
public class MyClient {
public static void main(String[] args) {
new MyClient();
}
public MyClient(){
try {
//Socket()就是去连接某个服务器端 127.0.0.1表示服务器的ip
//9999是服务器的端口号
Socket s=new Socket("127.0.0.1",9999);
//如果s连接成功,就可以发送数据到服务器端
//我们通过pw向s写数据,true表示即时刷新
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
pw.println("你好吗?我是客户端");
//要读取s中传递的数据
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
String info=br.readLine();
System.out.println("接收到服务器:\t"+info);
}catch (Exception e) {
// TODO: handle exception
}
}
}

这里需要注意的几个地方,必须是服务端先开启,然后accept()等待客户端,没有客户端连接,它将处于阻塞状态,一旦有了客户端它将回应,其次这是理由tcp实现的,UDP实现用java提供的另外类,最后这里有一个问题,就是只能接受一次,需要改进,也就是不断循环接收客户端连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
try {
//在9999号端口上监听
ServerSocket ss=new ServerSocket(9999);
//等待客户端连接,该函数会返回一个Socket连接
Socket s=ss.accept();
//要读取s中传递的数据
isr=new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);
pw=new PrintWriter(s.getOutputStream(),true);
//接收从控制台输入的信息
isr2=new InputStreamReader(System.in);
br2=new BufferedReader(isr2);
while(true){
//接收客户端信息
String infoFromClient=br.readLine();
System.out.println("服务器接收到:\t"+infoFromClient);
//接收从控制台输入的信息
System.out.println("请输入要发送到客户端的信息:");
String response=br2.readLine();
//服务器从控制台上接收bye服务器端退出
if(response.equals("bye")){
System.out.println("退出对话");
s.close();
break;
}
//把从控制台输入的信息,回送给客户端
pw.println(response);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(br2!=null) br2.close();
if(isr2!=null) isr2.close();
if(pw!=null) pw.close();
if(br!=null) br.close();
if(isr!=null) isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}

最后当然网络编程中也就是流的数据传送的应用,也不得不说网络底层协议其实很复杂的,只有当我们有精力了,再去细细研究它,才会有更多的收获

热评文章