(一)基础知识
1.定义:
通过套接字来达到进程间通信的目的
通俗来说就是让两个程序联系起来
2.IP:
(1)是一个逻辑地址,是可以修改的,但Mac地址是物理层面的,不可以被修改,是唯一的。
(2)一般来说是唯一的,但在不同的局域网中,两台电脑的IP地址可以一样,在这里,其实只是名称 相同而已。类似于人id,不同的学校的人id可能一样,但他们的学校是不同的。
3.端口号:
eg:QQ,浏览器,百度云三个软件都在运行网络程序,当电脑接受到网络发过来的数据之后,怎么知道要发给哪一个软件呢?
所以给三个软件分配唯一的一个号码,跟接受的数据包含的号码进行匹配,这个号码就是端口号。
端口号现在的范围是0~65535。一般我们自己编程的时候不使用1024以下太小的端口号,因为这些端口号,系统很多程序很有可能在使用。
4.协议:
由于网络传输是很复杂的一个工程,而且又是一个交互的工程。就像一个市场贸易,就得规定好价格。所以人们就提出了协议。协议是通信双方为了实现通信而设计的约定或通话规则。解决数据如何在网络中传输。
常见协议有:
(1)UDP:是无连接,不可靠的。类似于写信
(2)TCP:是面向连接的,可靠的。类似于打电话
TCP的三次握手:
共有四次消息的发送
1.客户端发送请求给服务器
2.服务器发送消息告诉客户端已经连接成功
(这里为什么服务器要发送连接成功给客户端呢?因为客户端还不知道服务器有没有收到请求)
3.服务器再次发送消息询问客户端
(这里为什么要再次发送呢?因为为了排除延迟的情况,客户端发送给服务器的请求,可能会收到某些故障,在网络节点中滞留了导致延迟,所以是一个失效的报文)
4.客户端应答服务器
5.套接字(socket)
套接字就是两台主机之间逻辑连接的端点
本质上就是一组接口,对协议的封装和应用
TCP客户端:一旦new出了Socket对象,该对象就会自动向服务器发送连接请求,如果连接不成功,程序就会立刻停止
TCP服务器:new出的ServerSocket对象不会自动监听客户端 的请求,要调用accept方法,才会监听。
(二)代码实践
1.相关知识:
(1)io流:程序与设备进行数据传输的类,或者说是一个管道。
主要利用了输入流InputStream,输出流OutputStream及其子类进行实现。
(2)线程:是一个程序运行时的不同执行路径。
主要是继承Thread这个类,再重写其run方法,用start来调用
2.代码:
服务器:
import java.io.*;
import java.net.*;
public class TCP_Server {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(6666); //这里并不会自动监听客户端有没有发数据过来
Socket s = ss.accept(); //accpet方法监听客户端有没有发数据过来
//有阻塞作用,如果没有接受到数据,就不会执行下面的代码
DataInputStream dis = new DataInputStream(s.getInputStream()); //getInputStream是套接字的方法,返回一个输入流InputStream,这个InputStream被DataInputStream包裹创建一个对象dis
DataOutputStream dos = new DataOutputStream(s