一、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网络编程详解相关推荐

  1. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...

  2. Linux网络编程---详解TCP

    Linux网络编程---详解TCP的三次握手和四次挥手_shanghx_123的博客-CSDN博客_tcp的协议数据单元被称为 TCP协议详解(TCP报文.三次握手.四次挥手.TIME_WAIT状态. ...

  3. 【网络编程】之四、socket网络编程例解

    前面说了那么多,现在我们给出4个代码+详解,基于win32平台的socket编程.使用TCP 和 UDP 两种协议. OK,先来看一下TCP服务器和客户端: [cpp] view plaincopy ...

  4. java socket/Serversocket编程详解(中/英文)

    socket /套接字 Sockets let you send raw streams of bytes back and forth between two computers, giving y ...

  5. Netty从使用到源码3_NIO网络编程详解

    关于BIO(即Java传统的网络编程,参考) NIO网络编程 1.逐步演变 1.单线程阻塞模式 创建服务器 import java.net.InetSocketAddress; import java ...

  6. python网络编程项目_python网络编程详解

    最近在看<UNIX网络编程 卷1>和<FREEBSD操作系统设计与实现>这两本书,我重点关注了TCP协议相关的内容,结合自己后台开发的经验,写下这篇文章,一方面是为了帮助有需要 ...

  7. unet网络python代码详解_python网络编程详解

    最近在看<UNIX网络编程 卷1>和<FREEBSD操作系统设计与实现>这两本书,我重点关注了TCP协议相关的内容,结合自己后台开发的经验,写下这篇文章,一方面是为了帮助有需要 ...

  8. 14.网络编程详解-狂神笔记

    01.什么是计算机网络 网络编程 打电话 – 连接 – 接了电话 – 通话 (TCP) 发短信 – 发送了就完事了 – 接收 (UDP) 计算机网络: 计算机网络是指将地理位置不同的具有独立功能的多台 ...

  9. android 网络编程实现,Android开发使用HttpURLConnection进行网络编程详解【附源码下载】...

    本文实例讲述了Android开发使用HttpURLConnection进行网络编程.分享给大家供大家参考,具体如下: --HttpURLConnection URLConnection已经可以非常方便 ...

最新文章

  1. 翻译机之后,搜狗再推智能硬件产品录音笔
  2. nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
  3. python 找到目录下文件名规则_假如编程是魔法之零基础看得懂的Python入门教程 ——(二)魔法实习生第一步了解魔杖的使用...
  4. ui5里周期性检查window size大小的变化
  5. libcurl库进行http通讯网络编程
  6. 本周五丨数据库智能管控最佳实践与探索
  7. Java 接口(interface)的三种类型
  8. linux中的段定义的,Linux中的段
  9. 天地不仁,以万物为刍狗
  10. mysql navicat视图_navicat怎么创建视图
  11. 计算机术语 gc 是什么意思,GC是什么?为什么我们要去使用它
  12. appium学习总结5 - 操作设备
  13. Java根据自定义模板生成Word
  14. div随着屏幕滚动而滚动
  15. 网络资源下载方式:http/https、ftp/sftp、BT种子、磁力下载、ed2k下载等的区别
  16. frp Connection refused
  17. 用优启通U盘安装Ghost版Win10系统教程
  18. 函数中arguments是什么?
  19. 整理MAC下Eclipse的常用快捷键
  20. c语言编程求完全平方数,菜鸟求助,要怎么求完全平方数?

热门文章

  1. 元末明初为什么会爆发农民起义
  2. VMware 虚拟机安装Linux(Ubuntu)系统教程
  3. C++的STL中accumulate的用法
  4. 【云原生】设备入云之FlexManager主流控制器读写
  5. 表示微型计算机系统稳定性,计算机选择题
  6. C++中int、long和double的取值范围和最大值,以及32位和64位的差异解读
  7. OSI的7层模型和TCP/IP四层模型
  8. EF系列(一)——深入框架底层
  9. web端登录需要验证码-python获取验证码数值
  10. 升级win11后,觉得不好用想重装win10系统?教你重装win10“精简版”