一、网络协议和网络三要素
1.1通讯协议有很多目前最广泛的为tcp/ip协议。
TCP协议:是面向连接的通讯协议,需要经历三次握手确认连接后才传输数据,这样保证了数据的可靠安全性。
特点:
-
需要建立链接;
-
当链接后,传输数据不限制数据的大小;
-
安全可靠
-
传输效率低,每次要传输前都要三次握手链接成功后才能传输
UDP协议:是无连接的通讯协议,不需要建立连接直接发送数据,每个数据报的大小被限制在64K,不安全、不可靠但是效率高
特点:
-
不需要建立连接
-
每次数据传输大小有有限制(64K以内)
-
不安全,不可靠
-
传输效率快
1.2.网络三要素:协议、 IP地址和端口
目前大部分都是IPV4的IP地址,还有IPV6的新IP地址。
ipconfig 命令 查看本地电脑的IP
二、TCP通讯
2.1Socket类和ServerSocket类
Socket类是创建一个流套接字并将其连接到指定主机上的指定端口号
Socket socket=new Socket(ip,端口);
ip为服务端的地址,端口为服务端的端口
Socket常用的方法:
InputStream getInputStream();获得字节输入流对象,用来获取服务端发送的数据
OutputStream getOutputStream(); 获得字节输出流对象,用来给服务端发送数据
void shutdownOutput():禁用此套接字的输出流,任何先前写出的数据将被发送,随后终止输出流。
void close():关闭此套接字。 释放Socket网络资源
注:在客户端发送完消息后,一定要执行shutdownOutput()方法,否则服务端会处于一直reading中阻塞。
2.2编写简易的客户端和服务端
客户端代码:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class ClientMode {
public static void main(String[] args) throws IOException {
//1.创建客户端对象,指定服务端IP和端口
Socket socket = new Socket("127.0.0.1", 6666);
//2.获取网络输出流,发送数据
OutputStream outputStream = socket.getOutputStream();
//3.发送数据,字节流转换为字符流
outputStream.write("你好!我是狗子,晚上一起学java...".getBytes());
//4.发送完毕内容后,要告知对方(要不对方在一直等待中...)
socket.shutdownOutput();
//5.获取网络输入流,接收对方返回信息
InputStream inputStream = socket.getInputStream();
byte[] bt = new byte[1024];
int flag;
while ((flag = inputStream.read(bt)) != -1) {
//打印对方回复的消息
System.out.println(new String(bt, 0, flag));
}
//6.释放资源
socket.close();
}
}
直接启动客户端报错,原因是服务端没有启动
服务端:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServiceMode {
public static void main(String[] args) throws IOException {
//1.定义服务端信息
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务端已启动..."+serverSocket);
//2.等待客户端连接,accept一直阻塞到这里等待被访问
Socket socket = serverSocket.accept();
//3.获取网络输入流,获取客户端发来的信息
InputStream inputStream = socket.getInputStream();
byte[] bt = new byte[1024];
int flag;
while ((flag=inputStream.read(bt))!=-1){
//打印客户端发来的信息
System.out.println(new String(bt,0,flag));
}
//4.获取网络输出流,回信息给我客户端
OutputStream outputStream = socket.getOutputStream();
outputStream.write("你好,狗子,我今天晚上要去吃烧烤,不去学java了...".getBytes());
//5.告知客户端发送完毕了
socket.shutdownOutput();
//释放资源,但是不能释放serverSocket,以为服务端要一直启动保持服务。
socket.close();
}
}
启动服务端,再启动客户端,对应的结果如下:
下篇内容将编写一个测试案例,文件的上传和下载以及利用线程池优化服务器的吞吐量,如果本文对你有帮助请帮忙点赞转发!!!!