一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
创作时间:
作者:
@小白创作中心
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
引用
1
来源
1.
https://developer.aliyun.com/article/1589408
本文将详细介绍TCP网络编程的基础知识和Socket套接字的使用方法。通过理论讲解和代码示例,帮助读者理解如何在Java中实现客户端与服务器之间的通信。
1 Socket讲解
利用套接字(Socket)开发网络应用程序早已被广泛采用,成为事实上的标准。网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
通信的两端都要有Socket,是两台机器间通信的端点。网络通信其实就是Socket间的通信。Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
一般主动发起通信的应用程序属客户端,等待通信请求的为服务端。
Socket分类:
- 流套接字(stream socket):使用TCP提供可依赖的字节流服务。
- 数据报套接字(datagram socket):使用UDP提供“尽力而为”的数据报服务
Socket类的常用构造器:
public Socket(InetAddress address, int port)
:创建一个流套接字并将其连接到指定 IP 地址的指定端口号。public Socket(String host, int port)
:创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket类的常用方法:
public InputStream getInputStream()
:返回此套接字的输入流。可以用于接收网络消息public OutputStream getOutputStream()
:返回此套接字的输出流。可以用于发送网络消息public InetAddress getInetAddress()
:此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 null。public InetAddress getLocalAddress()
:获取套接字绑定的本地地址。 即本端的IP地址public int getPort()
:此套接字连接到的远程端口号;如果尚未连接套接字,则返回 0。public int getLocalPort()
:返回此套接字绑定到的本地端口。 如果尚未绑定套接字,则返回 -1。即本端的端口号。public void close()
:关闭此套接字。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。需要创建新的套接字对象。 关闭此套接字也将会关闭该套接字的InputStream和OutputStream。public void shutdownInput()
:如果在套接字上调用shutdownInput()后从套接字输入流读取内容,则流将返回EOF(文件结束符)。 即不能在从此套接字的输入流中接收任何数据。public void shutdownOutput()
:禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。 如果在套接字上调用shutdownOutput()后写入套接字输出流,则该流将抛出IOException。 即不能通过此套接字的输出流发送任何数据。
2 基于Socket的TCP编程
Java语言的基于套接字编程分为服务端编程和客户端编程,其通信模型如图所示:
3 客户端Socket的工作过程包含以下四个基本的步骤
- 创建 Socket:根据指定服务端的IP地址或端口号构造Socket类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
- 打开连接到 Socket的输入/出流:使用getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输
- 按照一定的协议对Socket进行读写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
- 关闭Socket:断开客户端到服务器的连接,释放线路
3.1 客户端创建Socket对象
客户端程序可以使用Socket类创建对象,创建的同时会自动向服务器方发起连接。Socket的构造器是:
Socket(String host, int port) throws UnknownHostException, IOException
:向服务器(域名是host。端口号为port)发起TCP连接,若成功,则创建Socket对象,否则抛出异常。Socket(InetAddress address, int port) throws IOException
:根据InetAddress对象所表示的IP地址以及端口号port发起连接
客户端建立socketAtClient对象的过程就是向服务器发出套接字连接请求
4 服务器程序的工作过程包含以下四个基本的步骤:
- 调用ServerSocket(int port):创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
- 调用accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
- 调用该Socket类对象的getOutputStream()和getInputStream ()获取输出流和输入流,开始网络数据的发送和接收。
- 关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字
4.1 服务器建立ServerSocket对象
ServerSocket对象负责等待客户端请求建立套接字连接,类似邮局某个窗口中的业务员。也就是说,服务器必须事先建立一个等待客户请求建立套接字连接的ServerSocket对象。
所谓“接收”客户的套接字请求,就是accept()方法会返回一个Socket对象
5 案例实现 客户端和服务端通信
基本思路:
- 客户端和服务端建立连接
- 发送接收数据进行通信
- 关闭连接
具体实现的过程:(提示:需要客户端先发送数据给服务端,服务端在接收数据后,发送数据给客户端,然后客户端接收数据。如果客户端先接收数据后发送数据,会阻塞)
5.1 代码实现
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPTest4 {
@Test
public void Myclient() throws IOException {
//1、准备Scoket,连接服务器,需要指定服务器的IP地址和端口号
Socket socket = new Socket("127.0.0.1", 8888);
//3、获取输出流,用来发送数据给服务器
OutputStream outputStream = socket.getOutputStream();
//2、获取输入流,用来接收服务器发给客户端的数据
InputStream inputStream = socket.getInputStream();
//4、通信
//发送数据
outputStream.write("你好,我是客户端发来的数据".getBytes());
outputStream.flush();
socket.shutdownOutput();
//会在流末写一个“流的末尾”标记,对方才能读到-1,否则对方的读取方法会一直阻塞
//4、接收
byte[] data = new byte[1024];
int len;
while ((len = inputStream.read(data)) != -1) {
System.out.println(new String(data, 0, len));
}
//5、关闭socket,不再与服务器通信,即断开与服务器的连接
//socker关闭,意味着InputStream和OutputStrem也关闭了
socket.close();
}
@Test
public void MyServer() throws IOException {
//1、准备一个ServerSocker
ServerSocket serverSocket = new ServerSocket(8888);
//2、监听一个客户端的连接。accept()是一个阻塞的方法,如果没有客户端连接,将一直等待
Socket socket = serverSocket.accept();
System.out.println("一个客户端连接成功");
//3、获取输出流,用来发送数据给客户端
OutputStream outputStream = socket.getOutputStream();
//获取输入流,用来接收客户端发送给服务器的数据
InputStream inputStream = socket.getInputStream();
//4、通信
//接收数据
byte[] data = new byte[1024];
int len;
while ((len=inputStream.read(data))!=-1){
System.out.println(new String(data,0,len));
}
//发送数据
outputStream.write("我是服务端发来的信息".getBytes());
outputStream.flush();
socket.shutdownOutput();
//socker关闭,意味着InputStream和OutputStrem也关闭了
socket.close();
//6、如果不在接收任何客户端通信,可以关闭ServerSocker
serverSocket.close();
}
}
5.2 实现结果
6 更多案例分析
6.1 客户端发送信息给服务端,服务端将数据显示在控制台上
代码位置:代码仓库链接
6.2 客户端发送文件给服务端,服务端将文件保存在本地
代码位置:代码仓库链接
6.3 从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端
代码位置:代码仓库链接
热门推荐
NBA严重伤病潮:单日7人伤退+库里崴脚 独行侠连遭沉重打击
散瞳的危害及副作用是什么
对散瞳剂产生过敏反应,导致视力模糊应如何处理
办离婚证需要哪些材料?两个小孩离婚抚养权如何判决?
专家解读 | 氢燃料电池车走势分析
一文搞懂空调氟机与空调水机原理和常见机型
省钱又实用:性价比高的文具选购指南
巴西木养护全攻略:从土壤选择到日常护理,让绿植在家中茁壮成长
中国生命科学与医疗行业调研结果:2024年行业现状与展望
《黑神话悟空》全虚空结位置地图 各章节虚空结跟跑路线
60㎡学区房改造:西城小户型的多功能设计
年轻人拯救老破小:100多万在上海买房,只看价格,学区无所谓
如何开始一篇信息性文章:重要提示
体育教师资格证报考条件及考试指南
倒车影像出现故障怎么排查
超忆症是什么
深度解析摩羯座:追求成就的严肃守护者
跨部门沟通称呼的讲究
老人冥想的好处有哪些?老人静坐冥想的练习方法
外媒评中国十大导演,陈凯歌垫底,张艺谋未进前五,冠军实至名归
公众号爆款标题攻略:从“平平无奇”到“一秒吸睛”
逆天改命:解析《哪吒之魔童闹海》的票房为什么会一骑绝尘!
全球科技格局重构:中美"七姐妹"的冰火两重天与未来竞速
模型 旁观者效应/责任分散效应
十二星座专属英文名指南:从白羊到双鱼,总有一款适合你
新能源车船税新政:不同车型优惠标准大调整
中国电信江西萍乡分公司:以信息化助力数字适老化服务
蓉北商圈焕新!园区还没修好,产业已经来了
探秘毛绒玩具工厂:萌物诞生的奇妙乐园
深入解析MongoDB的存储原理