一、网络编程基本概念
1. 什么是计算机网络
分布在不同地域的计算机, 通过硬件等网络设备使用通信线路互相连接形成的一个网格系统.
计算机网络, 可以很方便的进行 信息的传递, 资源的共享!
2. 什么是计算机的IP地址
IP地址 是计算机在互联网中的唯一标识 . 就像人在社会中的身份证号码.
本机IP:
127.0.0.1
localhost
3. 什么是 网络中 网站的域名
域名可以简单的理解为, IP地址的别名. 更方便记忆, 当输入域名后(例如www.baidu.com) , 计算机会访问域名解析商 , 然后得到ip地址, 再进行访问.
4. 什么是计算机的端口号
端口号的范围 0-65535 之间 . *****
与ip地址很相似, IP地址是计算机在网络中的唯一标识 .
端口号是计算机中 程序的标识 . 用于在一台计算机中区分不同的应用程序
端口号在使用时 , 应尽量避免0-1024之间的端口号, 因为已经被一些知名的软件 和 windows操作系统所占用了.
5. 什么是计算机之间的通信协议
是计算机与计算机之间交流的标准 .
是对数据的 传输速率, 传入接口, 步骤控制 出错控制 等等 制定的一套标准 !
常用的通信协议:
1. http协议 : 超文本传输协议 . 80端口号
2. https协议: 安全的超文本传输协议 443端口号
3. ftp协议: 文件传输协议 21端口号
4. TCP协议: 传输控制协议
5. UDP协议: 数据报协议
6.网络 编程程序的分类:
1.B/S 程序 : 浏览器与服务器程序
2.C/S 程序 : 客户端与服务器程序
7.TCP协议 - OSI网络模型
指的是 从一台计算机的软件中, 将数据发送到另一台计算机的软件中的过程.
七层网络模型: 应用层 / 表现层 / 会话层 / 传输层 / 网络层 / 数据链路层 / 物理层
三次握手 和 四次挥手 熟悉
第一次握手:客户端向服务器端发起连接请求,等待服务器确认。
第二次握手:服务器端向客户端回送一个响应,通知客户端收到了连接请求。
第三次握手:客户端再次向服务器端发送确认信息,确认连接。
第一次挥手:客户端向服务器发送断开请求。
第二次挥手:服务器收到请求后,向客户端回一个应答,接着服务器进入等待关闭状态,TCP处于半关闭状态。
第三次挥手:服务器也打算断开连接,向客户端发送报文。
第四次挥手:客户端收到报文后,回复一个响应。双方关闭。
二、TCP程序
需要用到两个类来编写TCP的cs程序
1、ServerSocket 搭建服务器
2、Socket 搭建客户端
ServerSocket用来搭建服务器,搭建完毕后,会绑定一个端口号。
然后此服务器可以等待客户端连接。
每连接一个客户端,服务器就会得到一个新的Socket对象,用于跟客户通信。
Socket是两台计算机之间通信的端点。一边持有一个socket对象,来沟通。socket像电话的作用。
下面我们来演示一下服务器与客户端连接的全过程,注:用两个类来通信,一个搭建服务器,一个搭建客户端。
第一步,我们先来搭建服务器:起端口号为:10086
ServerSocket server = new ServerSocket(10086); //搭建服务器
第二步:用accept来接收客户端的连接,并且将链接好的端口起名为socket
Socket socket = server.accept(); //等待客户端连接,连接好的端点为socket
第三步:创建一个客户端:
Socket socket = new Socket("127.0.0.1",10086);
端口中的参数是IP地址和端口号。本机IP地址为127.0.0.1或localhost。端口号就是服务器的端口号。
这样运行两个类,我们的服务器和客户端就连接成功了。
下面我们进行一些简单的通信。通信都是用socket来进行通信的。用输入输出流来进行交流。
服务器端发消息:
//发消息
OutputStream os = socket.getOutputStream(); //端点调用输出流
PrintStream ps = new PrintStream(os);//将输出流转换成打印流
ps.println("欢迎连接本服务器!");
客户端收消息:
InputStreamReader将字节流转换为字符流,BufferedReader从字符流中缓存字符。
InputStream is = socket.getInputStream(); //用端点调用输入流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String text = br.readLine();
System.out.printf("客户端接收到的消息为:"+text);
客户端的发消息,服务器的收消息的方法都同上。
注:必须有一端发,一端收,不能两端同时都发。
整体的代码如下:代码示例:
服务器端:
public class Demo1 {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(10086); //搭建服务器
System.out.println("服务器搭建完毕!");
Socket socket = server.accept(); //等待客户端连接,连接好的端点为socket
System.out.println("一个客户端已成功连接√");
//发消息
OutputStream os = socket.getOutputStream(); //端点调用输出流
PrintStream ps = new PrintStream(os);//将输出流转换成打印流
ps.println("欢迎连接本服务器!");
//接收消息
InputStream is = socket.getInputStream(); //用端口接收流
/**
* InputStreamReader将字节流转换为字符流
* BufferedReader从字符流中缓存字符
*/
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String text = br.readLine();
System.out.printf("服务器接到了客户端的回复:"+text);
System.out.printf("服务器程序执行结束!");
}
}
客户端:
public class Demo2 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",10086);
InputStream is = socket.getInputStream(); //用端点调用输入流
/**
* InputStreamReader将字节流转换为字符流
* BufferedReader从字符流中缓存字符
*/
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String text = br.readLine();
System.out.printf("客户端接收到的消息为:"+text);
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("服务器你好!");
}
}
运行结果:
执行完服务器端,服务器端等待客户端连接。
再运行客户端:客户端代码结果
服务器端结果:整个结束。
三、服务器中加入多线程
上面的方法,我们一个服务器可以连接多个客户端,但是只能按顺序执行,处理完第一个客户端的事情后,才能处理第二个客户端。效率太低,服务器不可能一次只处理一个客户端的事情。所以我们需要加入多线程技术。多线程技术连接:
循环接收客户端,在接收客户端后面,加入多线程。每接收一个客户端,就进入一个新的线程中。各线程完成各线程的事情。
请阅读源码:
public class Demo3 {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(20086);
while(true){
Socket socket = server.accept();
new Thread(){
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
System.out.println(Thread.currentThread().getName());
System.out.println("客户端发来的消息:"+br.readLine());
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("我是服务器,感谢链接");
Thread.sleep(10000); //休眠十秒
System.out.println(Thread.currentThread().getName()+"休眠完毕!");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
}
}
于是我们在客户端不断连接。
运行结果如下:多线程一起运行。一个服务器连接多个客户端,并同时处理。
本文到这里,关于TCP网络编程的方法就全部介绍完毕了。
作者码字不易,您的点赞收藏是对我的鼓励~