网络编程

软件架构:

CS架构:客户端-服务器

BS架构:浏览器-服务器

不过现在的很多软件都是一种混合开发,就是将CS架构和BS架构融合起来。

网络编程三要素

如何准确定位一台或多态主机:使用IP地址

如何定位主机上的特定的应用:使用端口号

如何可靠、高效地进行数据传输:规范通信协议

IP地址

IP地址:网络中的一台计算机设备做唯一编号

IP地址分类:

分类方式一:

IPv4:占用4个字节,表示为a.b.c.d的形式,以点分十进制表示

IPv6:占用16个字节

分类方式二:

公网地址(万维网使用)和私网地址(局域网使用)192.168.开头的就是私有地址

本地回路地址:127.0.0.1

域名:便捷地记录ip地址

www.baidu.com kuoz.top

域名使用中通过DNS解析成IP再进行访问的

端口号

端口号可以唯一标识主机中的进程

不同的进程分配不同的端口号

范围:0~65535

网络通信协议

OSI模型:过于理想化,没能实现

TCP/IP:分为应用层、传输层、网络层、物理+数据链路层

InetAddress类

InetAddress类的一个实例就代表一个具体的ip地址

实例化方式:

InetAddress getByName(String host)

InetAddress getLocalHost()

TCP协议和UDP协议

计算机网络的重要重要指示,在此处简要了解。

TCP的Socket网络编程

网络上具有唯一标识的IP地址和端口号的组合,唯一可识别的标识符套接字(Socket)

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
@Test
public void client() throws IOException {
//创建Socket实例
int port = 8888;
InetAddress address = InetAddress.getByName("10.10.208.62");
Socket socket = new Socket(address, port);
//通过Socket创建输出流
OutputStream os = socket.getOutputStream();
//发送数据
os.write("嗨嗨嗨, 服务器我来辣!".getBytes());
//关闭Socket及相关流
os.close();
socket.close();
}
@Test
public void server() throws IOException {
//创建serverSocket实例
int port = 8888;
ServerSocket serverSocket = new ServerSocket(port);
//接收来自于客户端的Socket
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功,等待接收数据...");
System.out.println("收到了来自"+socket.getInetAddress().getHostAddress()+"的连接");
//通过Socket创建输入流
InputStream is = socket.getInputStream();
//读写过程
byte[] buffer = new byte[5];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len;
while((len = is.read(buffer)) != -1) {
//当byte太小时,这里中文会因为中间被截断而出乱码,通过baos来解决
//String message = new String(buffer, 0, len);
//解决方法
baos.write(buffer, 0, len);
}
System.out.print(baos.toString());
System.out.print("\n接收完毕");
//关闭Socket和相关流
is.close();
socket.close();
}

当客户端需要接收服务器发送的回复信息时出现的死锁问题:

客户端向服务器发送数据后,服务器向客户端回复信息,客户端接收服务器的接受信息。

如果直接在客户端创建输入流并打印出来,而不进行操作,那么服务器端会因为认为Socket没有终止发送信息而不回复回复信息,客户端没有接收到数据,那么也不会关闭Socket,这样就相互锁在了一起。

解决方法是在客户端发送数据后socket.shutdownOutput();来表示已经发送完毕。

UDP网络编程

TCP有三次握手,建立连接,是可靠的

UDP不需要建立连接,是不可靠的

URL编程

URL(Uniform Resource Locator):统一资源定位符

一个具体的URL就对应着互联网上某一资源的地址

URL的格式:

http:// 127.0.0.1:8080/…?name=Tom

应用层协议 ip地址 端口号 资源地址 参数列表

URL类

Java中提供了URL类来进行URL的相关操作

常见的方法:

1
2
3
4
5
6
7
8
9
10
//获取相应的url值
public String getProtocol();
public String getHost();
public String getPort();
public String getPath();
public String getFile();
public String getQuery();
//建立与服务器的连接
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection;
//通过connection创建输入流并进行相应的读写......