网络通信Java

客户端

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();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yun_gao_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值