客户端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 软件结构:
* C/S结构(Client/Server结构)是指客户端和服务器端结构,常见程序有QQ,迅雷等软件
* B/S结构(Browser/Server结构)是指浏览器和服务器结构,常见浏览器有谷歌,火狐等
* 两种架构各有各优势,但无论哪个都离不开网络的支持,网络编程,就是在一定的协议下,实现两台计算机的通信的程序
*/
/**
* 网络编程的三要素
* 1.协议
* 2.IP地址
* 3.端口号
*
*/
/**
* 网络通信协议——规则
* TCP/IP协议(Transmission Control Protocol/Internet Protocol)
* 其内部包含一系列的用于处理数据通信的协议,并采用4层分层模型:
* 应用层(主要负责应用程序的协议);传输层(使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议);网络层(整个协议的核心);数据链路层,物理层(用于定义物理传输通道)
*
*/
/**
* 1.协议
* 传输层
* 协议的分类:TCP,UDP
* UDP:面向无连接,不可靠,不安全,效率高,耗资小 应用:视频会议
* TCP:面向连接,可靠,安全,效率低
* 在TCP连接中必须明确客户端和服务器端,由客户端向服务器端发出连接请求,每次连接的创建都需要进行“三次握手”
*第一次握手:客户端向服务器端发送连接请求,等待服务器端确定
*第二次握手:服务器端向客户端发送一个响应,通知客户端收到了连接请求
*第三次握手:客户端再次向服务器端发送确认消息,确认连接
*/
/**
* 2.IP地址
* 指互联网协议地址(Internet Protocol Address),俗称IP,IP给一个网络中的计算机设备做唯一的编号
* 将一台计算机比喻成电话机,则IP相当于电话号码
* IP分类:
* IPv4:32位的二进制,被分成四组,每组8位二进制,一个字节,表示成a.b.c.d,
* a,b,c,d都是一个字节大小的0-256之间的十进制数
* IPv6:128位,被分成八组,每组16位二进制,两个字节,每组都是一个十六进制的数
*
*查看本机IP地址,在控制台输入:
*ipconfig
*检查网络是否连通,在控制台输入:
*ping 空格 IP地址
*/
/**
* 3.端口号:是一个逻辑接口,我们无法直接看到
* 当我们使用网络软件,一打开,那么操作系统就为其分配一个随机的端口号,或者网络软件在打开的时候向系统要指定端口号
* 端口号由两个字节组成,取值范围为0-65535
* 注意:1024之前的端口号不能使用,已经被系统分配给已知的网络软件
* 同一台计算机的网络软件的端口号不能重复
*
* 使用IP+端口号就能保住数据准确无误地发送到对方计算机指定的软件上了
* 常用端口号:
* 1. 80端口 ,网络端口
* www.baidu.com:80 准确的网址,不加端口号80也可以打开百度
* www.baidu.com:70 错误的网址
* 2. 数据库 mysql:3306 oracle:1521
* 3. Tomcat服务器:8080
*
*/
/**
* TCP通信:实现两台计算机之间的数据交互,通信的两端要严格区分客户端(Client)_一般是配置低的计算机 和服务器端(Server)_一般是配置高的计算机
* 两端通信的步骤:
* 1.服务端程序,需要事先启动,等待客户端的连接
* 2.客户端主动连接服务器端,连接成功才能通信,服务器端不能主动连接客户端
* 3.客户端和服务器端建立一个逻辑连接,而这个连接中包含一个对象——IO对象,客户端和服务器端可以通过这个IO对象进行通信
* 注意:
*1. 通信的不仅仅是字符,所以IO对象是字节流对象
*2.客户端和服务器端进行一次交互需要4个IO流对象
*3.服务器端需要明确两件事:
*①多个客户端和服务器端进行交互,服务器端必须明确和哪个客户端进行的交互,在服务器端有个方法:accept,可以获取请求连接的客户端对象
*②多个客户端和服务器端进行交互,需要多个IO流对象
* 服务器没有IO流,服务器端可以获取请求的客户端对象Socket,使用每个客户端Socket中提供的IO流和客户端进行交互
* 服务器使用客户端的字节输入流读取客户端发送的数据
* 服务器使用客户端的字节输出流给客户端回写数据
*
*
*Java中提供了两个类用于实现TCP通信程序
*1.客户端:java.net.Socket类表示。创建Socket对象,向服务器发送连接请求,服务器端响应请求,两者建立连接开始通信
*2.服务器端:java.net.ServerSocket类表示。创建ServerSocket对象,相当于开启一个服务,等待客户端的连接
*/
/**
* 1.TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器回写的数据
* java.net.Socket此类实现客户端的套接字,套接字是两台机器间通信的端点
* 套接字:包含IP和端口号的网络单位
*
* 构造方法:Socket(String host,int port)创建一个套接字并将其连接到指定主机的指定端口号
* 参数:
* String host 服务器主机的名称/服务器的IP
* int port 服务器的端口号
*
* 成员方法:
* OutputStream getOutputStream() 返回套接字的输出流
* InputStream getInputStream() 返回套接字的输入流
* void close 关闭套接字
*
* 实现步骤:
* 1.用Socket创建一个客户端对象,构造方法绑定服务器的IP地址和端口号
* 2.使用Socket对象中的方法getOutputStream()获取网络字节输出流对象
* 3.使用网络字节输出流对象中的方法write给服务器发送数据
* 4.使用Socket对象中的方法getInputStream()获取网络字节输入流对象
* 5.使用网络字节输入流对象中的方法read读取服务器回写的数据
* 6.释放资源(Socket对象的方法close)
*
*注意:
*1,客户端和服务器端进行交互,必须使用Socket中提供的网络流,不能使用自己创建的流对象
*2.当我们创建客户端对象时,就会去和服务器端进行三次握手建立连接通路,如果服务器端已经启动,那么就可以进行交互,没有启动则会抛出异常
*/
/**
*TCP通信的服务器端:接受客户端的请求,读取客户端发送的数据,给客户端回写数据
*表示服务器端的类:java.net.ServerSocket:此类实现服务器的套接字
*构造方法:ServerSocket(int port)创建绑定到特定端口的服务器套接字
*服务器必须明确:是哪个客户端请求的服务器
*成员方法:Socket accept()侦听并接受到此套接字的连接
*服务器端的实现步骤:
*1.创建服务器ServerSocket对象和系统要指定的端口号
*2.使用ServerSocket对象中的方法accept,获取请求的客户对象Socket
*3.使用Socket对象中的方法getInputStream()获取网络字节输入流对象
*4.使用网络字节输入流对象中的方法read,读取客户端发送的数据
*5.使用Socket对象中的方法getOutputStream()获取网络字节输出流
*6.使用网络字节输出流中的方法write,给客户端回写数据
*7.释放资源(Socket和ServerSocket)
*
*
*/
public class Net_Client {
public static void main(String[] args) throws IOException {
Socket socket =new Socket("10.99.42.161",8888);
OutputStream os=socket.getOutputStream();
os.write("你好,服务器".getBytes());
InputStream is=socket.getInputStream();
byte[] b=new byte[1024];
int len=is.read(b);
System.out.println(new String(b,0,len));
socket.close();
}
}
服务器端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Net_Server {
public static void main(String[] args) throws IOException {
ServerSocket serversocket=new ServerSocket(8888);
Socket socket=serversocket.accept();
InputStream is=socket.getInputStream();
byte[] b=new byte[1024];
int len=is.read(b);
System.out.println(new String(b,0,len));
OutputStream os=socket.getOutputStream();
os.write("谢谢,收到".getBytes());
socket.close();
serversocket.close();
}
}