基于Socket的TCP实例
Java语言的基于套接字编程分为服务端编程和客户端编程。其通信模型如下图:
客户端Socket的工作过程包含以下四个基本的步骤:
➢创建Socket:根据指定服务端的IP地址或端口号构造Socket类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
➢打开连接到Socket的输入出流:使用 getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输
➢按照一定的协议对Socket进行读/写操作:通过输入流读取服务器放入线路的信息.(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
➢关闭Socket:断开客户端到服务器的连接,释放线路
服务器程序的工作过程包含以下四个基本的步骤:
➢调用ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
➢调用accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
➢调用该Socket类对象的getOutputStream()和getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。
➢关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。
服务器必须事先建立一个等待客户请求建立套接字 连接的ServerSocket对象。
接受就是accept方法
package com.caq.java; import org.junit.Test; import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** 实现TCP的网络编程 例题2:客户端发送文件给服务端,服务端将文件保存在本地。 * @Date 2021/12/3 9:13 * @Version 1.0 */ public class TCPTest2 { //客户端 @Test public void client() throws IOException { //1.创建服务器端的ServeSocker,指明自己的端口号 Socket socket = new Socket(InetAddress.getByName("localhost"),9090); //2.获取一个输出流,用于输出数据 OutputStream os = socket.getOutputStream(); //3.写出本地数据的操作 FileInputStream fis = new FileInputStream("cxk1.jpg"); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1){ os.write(buffer,0,len); } //4.资源的关闭 fis.close(); os.close(); socket.close(); } //服务端 @Test public void server() throws IOException { //创建服务端ServerSocket,指明端口 ServerSocket ss = new ServerSocket(9090); //2.获取客户端Socket Socket socket = ss.accept(); //3.获取客户端输入流 InputStream is = socket.getInputStream(); //3.保存为本地文件 FileOutputStream fos = new FileOutputStream("cxk2.jpg"); //4.操作过程 byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1){ fos.write(buffer,0,len); } //5.资源的关闭 fos.close(); is.close(); socket.close(); ss.close(); } }
UDP和URL编程后续学Javaweb更新!!!
小结
位于网络中的计算机具有唯一的IP地址,这样不同的主机可以互相区分。
客户端一服务器是一种最常见的网络应用程序模型。服务器是一个为其客户端提供某种特定服务的硬件或软件。客户机是一个用户应用程序,用于访问某台服务器提供的服务。端口号是对一个服务的访问场所,它用于区分同一物理计算机上的多个服务。套接字用于连接客户端和服务器,客户端和服务器之间的每个通信会话使用一个不同的套接字。TCP协议用于实现面向连接的会话。
Java中有关网络方面的功能都定义在java.net程序包中。Java用InetAddress对象表示IP地址,该对象里有两个字段:主机名(String) 和IP地址(int)。
类Socket和ServerSocket实现了基于TCP协议的客户端一服务器程序。Socket是客户端和服务器之间的一个连接,连接创建的细节被隐藏了。这个连接提供了一个安全的数据传输通道,这是因为TCP协议可以解决数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题,它保证数据可靠的传送。
类URL和URLConnection提供了最高级网络应用。URL的网络资源的位置来同一表示Internet上各种网络资源。通过URL_对象可以创建当前应用程序和URL表示的网络资源之间的连接,这样当前程序就可以读取网络资源数据,或者把自己的数据传送到网络上去。