Socket网络编程详解
一、Socket简介
1.1、socket通信基本原理
首先socket 通信是基于TCP/IP 网络层上的一种传送方式。在七个层级关系中,我们将的socket属于传输层。
什么是Socket:socket是基于应用服务与TCP/IP通信之间的一个抽象,他将TCP/IP协议里面复杂的通信逻辑进行分装,对用户来说,只要通过一组简单的API就可以实现网络的连接。
原理图:
大致原理:
服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行监听,通过调用accept方法阻塞,这时候,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接
1.2、网络中进程之间如何通信?
(1)先了解本地进程间怎么通信
消息传递(管道、FIFO、消息队列)
同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量)
共享内存(匿名的和具名的)
远程过程调用(Solaris门和Sun RPC)
(2)网络中进程之间如何通信?
Socket(open—write/read—close)
(3)网络中通信要解决的问题:唯一标识一个进程
在本地可以通过进程PID来唯一标识一个进程。网络中不行。TCP/IP协议族已经解决了这个问题,
网络层的“ip地址”可以唯一标识网络中的主机,
而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)
这样利用三元组(ip地址,协议,端口)就可以了
1.3、Socket通信总的步骤
①服务端:创建ServerSocket对象,绑定监听端口
②服务端:通过accept()方法监听客户端请求
③客户端:创建Socket对象,指明需要连接的服务器的地址和端口号
④客户端:连接建立后,通过输出流向服务器发送请求信息
⑤服务端:连接建立后,通过输入流读取客户端发送的请求信息
⑥服务端:通过输出流向客户端发送响应信息
⑦客户端:通过输入流获取服务器相应的信息
二、Socket类
2.1、使用Socket连接服务器的过程包含以下4个基本的步骤
什么是Socket:
套接字(Socket)是一个抽象层,应用程序可以通过它发送或接收数据;就像操作文件那样可以打开、读写和关闭。套接字允许应用程序将 I/O 应用于网络中,并与其他应用程序进行通信。
(1)创建Socket
Socket(String host, int port)throws UnknownHostException, IOException;
Socket(InetAddress address, int port)throws UnknownHostException, IOException;
Socket(InetAddress address, int port, InetAddress localAddress, int localPort)throws IOException;
//下边这个方法参数为:目标IP、目标端口、绑定本地IP、绑定本地端口
Socket(String host, int port, InetAddress localAddress, int localPort)throws IOException;
第一种方法用的最多。
InetAddress:是一个用于记录主机的类,其静态getHostByName(String msg)可以返回一个实例,其静态方法getLocalHost()也可以获得当前主机的IP地址,并返回一个实例;
注意:
在Socket建立的时候,如果远程主机不可访问,会阻塞很长时间,所以要设立超时时间:
Socket socket = new Socket(...);
socket.setSoTimeout(10000);
// 单位为毫秒
(2)打开连接到Socket的输入/输出流
(3)按照一定协议对Socket执行读写操作
(4)关闭Socket
2.2、Socket方法介绍
getInetAddress(); 远程服务端的IP地址
getPort(); 远程服务端的端口
getLocalAddress() 本地客户端的IP地址
getLocalPort() 本地客户端的端口
getInputStream(); 返回与调用的套接字相关联的输入流
getOutStream(); 返回与调用的套接字相关联的输出流
//最后两个方法很重要
2.3、Socket状态介绍
isClosed(); //连接是否已关闭,若关闭,返回true;否则返回false
isConnect(); //如果曾经连接过,返回true;否则返回false
isBound(); //如果Socket已经与本地一个端口绑定,返回true;否则返回false
isConnected(); //判断Socket的连接状态
三、ServerSocket类
作用:服务器端用来监听特定端口上客户端的连接,也可以发送信息
构造函数:
ServerSocket()throws IOException;
ServerSocket(int port)throws IOException;
ServerSocket(int port, int backlog)throws IOException;
ServerSocket(int port, int backlog, InetAddress bindAddr)throws IOException;
port:服务端要监听的端口;
backlog:客户端连接请求的队列长度;
bindAddr:服务端绑定IP。
3.1、使用ServerSocket监听Socket包含4个基本的步骤
(1)创建ServerSocket
(2)监听客户端的连接(accept()方法)
(3)打开连接到ServerSocket的输入/输出流
(4)按照一定协议对ServerSocket执行读写操作
注意:Socket需要自己关闭,但是ServerSocket不需要自己关闭
四、实战
4.1、案例1
(1)客户端
class Client{public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1",8080);
// 用一个子线程处理服务器端数据new Thread(new CilentThread(socket)).start();
// 从终端接收数据,发给客户端BufferedReader keyIn = new BufferedReader(new InputStreamReader(System.in));PrintStream ps = new PrintStream(socket.getOutputStream());String line = null;while ((line = keyIn.readLine()) != null){ps.println(line);}}
}
//创建一个客户端的子线程,接收客户端发送的数据
class CilentThread implements Runnable{private Socket socket;public CilentThread (Socket socket){this.socket = socket;}@Overridepublic void run(){BufferedReader br = null;try {br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = null;while ((line = br.readLine()) != null){System.out.println(line);}} catch (IOException e) {System.out.println("网络出错,请检查");System.exit(-1);}finally {try {if (br != null) {br.close();}if (socket != null){socket.close();}} catch (IOException e) {e.printStackTrace();}}}
}
(2)服务端
class Server{public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(8080);Socket socket = ss.accept();
// 创建一个子线程,处理客户端输入数据new ServerThread(socket).start();
// 接收终端的输入(字符)BufferedReader keyIn = new BufferedReader(new InputStreamReader(System.in));
// 客户端的输出流PrintStream ps = new PrintStream(socket.getOutputStream());
// 读取终端的输入,并输出给客户端String line = null;while ((line = keyIn.readLine()) != null) {ps.println(line);}}
}
//创建一个子线程接收客户端的数据
class ServerThread extends Thread{private Socket socket = null;public ServerThread(Socket socket){this.socket = socket;}@Overridepublic void run() {BufferedReader br = null;try {br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = null;while ((line = br.readLine()) != null){System.out.println(line);}} catch (IOException e) {System.out.println("网络异常,请重新登陆");
// 断开子线程System.exit(-1);}finally {try {if (br != null){br.close();}if (socket != null){socket.close();}} catch (IOException e) {e.printStackTrace();}}}
}
参考:
https://www.jianshu.com/p/cde27461c226
https://blog.csdn.net/qq_31918961/article/details/80546537
https://www.jianshu.com/p/908aa099fab4
Socket网络编程详解相关推荐
- python编程入门与案例详解-Pythony运维入门之Socket网络编程详解
Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...
- Linux网络编程---详解TCP
Linux网络编程---详解TCP的三次握手和四次挥手_shanghx_123的博客-CSDN博客_tcp的协议数据单元被称为 TCP协议详解(TCP报文.三次握手.四次挥手.TIME_WAIT状态. ...
- 【网络编程】之四、socket网络编程例解
前面说了那么多,现在我们给出4个代码+详解,基于win32平台的socket编程.使用TCP 和 UDP 两种协议. OK,先来看一下TCP服务器和客户端: [cpp] view plaincopy ...
- java socket/Serversocket编程详解(中/英文)
socket /套接字 Sockets let you send raw streams of bytes back and forth between two computers, giving y ...
- Netty从使用到源码3_NIO网络编程详解
关于BIO(即Java传统的网络编程,参考) NIO网络编程 1.逐步演变 1.单线程阻塞模式 创建服务器 import java.net.InetSocketAddress; import java ...
- python网络编程项目_python网络编程详解
最近在看<UNIX网络编程 卷1>和<FREEBSD操作系统设计与实现>这两本书,我重点关注了TCP协议相关的内容,结合自己后台开发的经验,写下这篇文章,一方面是为了帮助有需要 ...
- unet网络python代码详解_python网络编程详解
最近在看<UNIX网络编程 卷1>和<FREEBSD操作系统设计与实现>这两本书,我重点关注了TCP协议相关的内容,结合自己后台开发的经验,写下这篇文章,一方面是为了帮助有需要 ...
- 14.网络编程详解-狂神笔记
01.什么是计算机网络 网络编程 打电话 – 连接 – 接了电话 – 通话 (TCP) 发短信 – 发送了就完事了 – 接收 (UDP) 计算机网络: 计算机网络是指将地理位置不同的具有独立功能的多台 ...
- android 网络编程实现,Android开发使用HttpURLConnection进行网络编程详解【附源码下载】...
本文实例讲述了Android开发使用HttpURLConnection进行网络编程.分享给大家供大家参考,具体如下: --HttpURLConnection URLConnection已经可以非常方便 ...
最新文章
- 翻译机之后,搜狗再推智能硬件产品录音笔
- nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
- python 找到目录下文件名规则_假如编程是魔法之零基础看得懂的Python入门教程 ——(二)魔法实习生第一步了解魔杖的使用...
- ui5里周期性检查window size大小的变化
- libcurl库进行http通讯网络编程
- 本周五丨数据库智能管控最佳实践与探索
- Java 接口(interface)的三种类型
- linux中的段定义的,Linux中的段
- 天地不仁,以万物为刍狗
- mysql navicat视图_navicat怎么创建视图
- 计算机术语 gc 是什么意思,GC是什么?为什么我们要去使用它
- appium学习总结5 - 操作设备
- Java根据自定义模板生成Word
- div随着屏幕滚动而滚动
- 网络资源下载方式:http/https、ftp/sftp、BT种子、磁力下载、ed2k下载等的区别
- frp Connection refused
- 用优启通U盘安装Ghost版Win10系统教程
- 函数中arguments是什么?
- 整理MAC下Eclipse的常用快捷键
- c语言编程求完全平方数,菜鸟求助,要怎么求完全平方数?
热门文章
- 元末明初为什么会爆发农民起义
- VMware 虚拟机安装Linux(Ubuntu)系统教程
- C++的STL中accumulate的用法
- 【云原生】设备入云之FlexManager主流控制器读写
- 表示微型计算机系统稳定性,计算机选择题
- C++中int、long和double的取值范围和最大值,以及32位和64位的差异解读
- OSI的7层模型和TCP/IP四层模型
- EF系列(一)——深入框架底层
- web端登录需要验证码-python获取验证码数值
- 升级win11后,觉得不好用想重装win10系统?教你重装win10“精简版”