socket网络编程


文章目录

  • socket网络编程
  • 一、网络编程概述
  • 二、网络通信要素概述
  • 三、IP和端口号
  • 四、网络协议
  • 五、TCP网络编程
  • 六、UDP网络编程

一、网络编程概述

网络编程的目的

直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯

网络编程中有两个主要的问题

①如何准确地定位网络上一台或多台主机;定位主机上的特定的应用

②找到主机后如何可靠高效地进行数据传输

二、网络通信要素概述

通信双方地址:

① IP
② 端口号

三、IP和端口号

IP 地址:InetAddress

本地回环地址(hostAddress):

127.0.0.1

主机名(hostName):

localhost

IP地址分类方式1:

IPV4 和 IPV6

IPV4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。以点分十进制表示,如192.168.0.1

IPV6:128位(16个字节),写成8个无符号整数,每个整数用四个十六进制位表示,数之间用冒号(:)分开,如3ffe:3201:1401:1280:c8ff:fe4d:db39:1984

IP地址分类方式2:

公网地址(万维网使用)和私有地址(局域网使用)

192.168.开头的就是私有址址,范围即为192.168.0.-192.168.255.255,专门为组织机构内部使用

Internet上的主机有两种方式表示地址:

域名(hostName):www.baiidu.com
IP 地址(hostAddress):183.232.231.172

域名解析:

域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立连接

InetAddress类

方法声明 功能描述
InetAddress getByName(String host) 获取给定主机名的的IP地址,host参数表示指定主机
InetAddress getLocalHost() 获取本地主机地址
String getHostName() 获取本地IP地址的主机名
boolean isReachable(int timeout) 判断在限定时间内指定的IP地址是否可以访问
String getHostAddress() 获取字符串格式的原始IP地址
public class Test01 {public static void main(String[] args) throws UnknownHostException {// 获取给定主机名的的IP地址,host参数表示指定主机InetAddress inetAddress = InetAddress.getByName("192.168.0.106");// 获取获取本地IP地址的主机名String hostName = inetAddress.getHostName();// 获取IP地址String address = inetAddress.getHostAddress();System.out.println("hostName:" + hostName);System.out.println("address:" + address);}
}

四、网络协议

网络通信协议

计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准

通信协议分层的思想

在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系

两个协议

① 传输控制协议TCP(Transmission Control Protocol)

② 用户数据报协议UDP(User Datagram Protocol)

TCP 和 UDP

TCP协议:

①使用TCP协议前,须先建立TCP连接,形成传输数据通道
②传输前,采用“三次握手”方式,点对点通信,是可靠的
③ TCP协议进行通信的两个应用进程:客户端、服务端
④在连接中可进行大数据量的传输
⑤传输完毕,需释放已建立的连接,效率低

UDP协议:

①将数据、源、目的封装成数据包,不需要建立连接
②每个数据报的大小限制在64K内
③发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
④可以广播发送
⑤发送数据结束时无需释放资源,开销小,速度快

Socket

1、通信的两端都要有Socket,是两台机器间通信的端点

2、 网络通信其实就是Socket间的通信

3、Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输

4、一般主动发起通信的应用程序属客户端,等待通信请求的为服务端

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() 获取套接字绑定的本地地址
public int getPort() 此套接字连接到的远程端口号
public int getLocalPort() 返回此套接字绑定到的本地端口
public void close() 关闭此套接字
public void shutdownInput() 不能在从此套接字的输入流中接收任何数据
public void shutdownOutput() 禁用此套接字的输出流

五、TCP网络编程

三次握手

1、TCP是面向连接的可靠协议、通过三次握手建立连接,通讯完成时拆除连接
2、tcp协议 需要先经历三次握手成功之后 在将数据发送给服务器端 确保服务器端是在 在将数据

TCP协议实现示意图

客户端发送数据四个步骤:

1、创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常

2、打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输

3、按照一定的协议对 Socket 进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程

4、关闭 Socket:断开客户端到服务器的连接,释放线路

package com.nnfx.test01;import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;/*** @author 杰仔正在努力* @create 2022-12-17 21:26*/
public class TcpClient {public static void main(String[] args) throws IOException {/*** 1.创建发送端Socket对象(创建连接)* 2.获取输出流对象;* 3.发送数据;* 4.释放资源;*///1、创建发送端Socket对象(创建连接)Socket socket = new Socket(InetAddress.getByName("nnfx.server.com"), 8090);//2.获取输出流对象;OutputStream outputStream = socket.getOutputStream();//3.发送数据;outputStream.write("nnfx".getBytes());outputStream.close();socket.close();}
}

服务器端发送数据六个步骤:

1、创建接收端Socket对象

2、监听(阻塞:如果建立连接失败,程序会一直阻塞,不往下执行

3、获取输入流对象

4、获取数据

5、输出数据

6、释放资源

package com.nnfx.test01;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** @author 杰仔正在努力* @create 2022-12-17 21:31*/
public class TcpServer {public static void main(String[] args) throws IOException {/*** 1.创建接收端Socket对象;* 2.监听(阻塞:如果建立连接失败,程序会一直阻塞,不往下执行;* 3.获取输入流对象;* 4.获取数据;* 5.输出数据;* 6.释放资源;*///1.创建接收端Socket对象;ServerSocket serverSocket = new ServerSocket(8090);//2.监听客户端发送数据给服务器 如果客户端一直没有发送数据给服务器 导致服务器端会在该方法一直阻塞System.out.println("服务器正在等待客户端接收数据。。。。");Socket socket = serverSocket.accept();//3.获取输入流对象;InputStream inputStream = socket.getInputStream();byte[] bytes = new byte[1024];int len = inputStream.read(bytes);System.out.println("服务器端接收客户端发送的数据:" + new String(bytes,len));inputStream.close();socket.close();serverSocket.close();}
}

报错

Exception in thread "main" java.net.ConnectException: Connection refused: connectat java.net.DualStackPlainSocketImpl.connect0(Native Method)at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:75)at java.net.AbstractPlainSocketImpl

原因: ip 访问不同 防火墙 没有关闭 或者 只能够在局域网访问

六、UDP网络编程

UDP协议 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法,俗称面向无连接

核心特点:面向无连接、不可靠的协议 、安全系数很低 容易丢包 但是传输速度是非常快 不需要类似于tcp协议三次握手。 聊天工具

发送数据四个步骤:

1、创建发送端socket对象;

2、提供数据,并将数据封装到数据包中;

3、通过socket服务的发送功能,将数据包发出去;

4、释放资源;

在windows 操作系统中,C:\Windows\System32\drivers\etc\HOSTS 文件中 新增 127.0.0.1 nnfx.server.com

package com.nnfx.socket;import java.io.IOException;
import java.net.*;/*** @author 杰仔正在努力* @create 2022-12-17 18:29*/
public class UdpClient {public static void main(String[] args) throws IOException {//        1.创建发送端socket对象;DatagramSocket datagramSocket = new DatagramSocket();
//        2.提供数据,并将数据封装到数据包中;/*** 参数1:发送数据 类型byte数组* 参数2:发送数据长度* 参数3:发送到服务器端ip地址* 参数4:发送服务器端 端口号码*/byte[] msg = "nnfx".getBytes();//走dns解析获取ip地址InetAddress inetAddress = InetAddress.getByName("nnfx.server.com");int port = 8080;DatagramPacket datagramPacket = new DatagramPacket(msg, msg.length, inetAddress, port);
//        3.通过socket服务的发送功能,将数据包发出去;datagramSocket.send(datagramPacket);System.out.println("发送数据成功。。。");
//        4.释放资源;datagramSocket.close();}
}

接收数据五个步骤:

1、创建接收端socket对象;

2、接收数据;

3、解析数据;

4、输出数据;

5、释放资源;

package com.nnfx.socket;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;/*** @author 杰仔正在努力* @create 2022-12-17 18:46*/
public class UdpServer {public static void main(String[] args) throws IOException {/*** 1.创建接收端socket对象;* 2.接收数据;* 3.解析数据;* 4.输出数据;* 5.释放资源;*///1、创建接收端socket对象//监听端口8080int port = 8080;DatagramSocket datagramSocket = new DatagramSocket(port);//2、接收数据byte[] bytes = new byte[1024];//数据包的形式接收DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);//开始监听客户端发送给服务器端数据,如果没有监听到数据则一直阻塞等待System.out.println("开始接受客户端发送的数据....");datagramSocket.receive(datagramPacket);System.out.println("接收到数据。。。");byte[] data = datagramPacket.getData();String msg = new String(data);//4、输出客户端发送给服务器端的内容System.out.println(msg);datagramSocket.close();}
}

Java之socket网络编程相关推荐

  1. 【Java】Socket网络编程解读与实战

    Socket原理 Socket原理 <Socket 到底是什么> Socket--套接字 是网络应用程序编程的接口和一种机制 用套接字中的相关函数来建立连接和完成通信 Socket可以看成 ...

  2. (Java)socket网络编程及处理socket粘包拆包问题

    目录 1.socket简介 2.TCP/IP协议 3.tcp三次握手 4.socket的一些接口函数原理 5.java socket 长连接粘包拆包问题 6.socket模拟服务端客户端发消息 7.U ...

  3. JAVA.SE Socket网络编程

    文章目录 1.网络编程入门 1.1软件架构介绍 1.2互联网通信协议 1.3网络编程的三要素 2.TCP通信 2.1通信分为客户端与服务器 2.2 socket的介绍与使用 2.3servletSoc ...

  4. java使用socket网络编程实现qq互聊(UPD简单版本)

    JAVA初学者.勿喷. eclipse稍微有点难用,关程序是在Console里面,要是没开出来并且死循环的话电脑cpu直接拉满了. 而且进程的关闭是输入指定的"再见"才关闭多线程, ...

  5. 【Java】Socket网络编程实现内网穿透、端口映射转发、内网穿透上网工具的编写,设置IP白名单防火墙

    这里写目录标题 简介 更新 一.背景 1.1 情景假设 1.2 想要达到的目的 1.3 局限 1.3 解决方案一(路由器NAT) 1.4 解决方案二(云服务器转发) 二.方案介绍 2.1 方案简介 2 ...

  6. Java的Socket网络编程

    1.Socket是什么? socket是进程之间通信的一种方式,调用这个网络库中的一些API实现分布在不同主机之间的相关进程的一些数据交换. 服务器端需要做的事情 打开一个通信通道并告诉本机,它愿意在 ...

  7. Java 之 socket 网络编程

    客户端 import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.n ...

  8. Linux C++/Java/Web/OC Socket网络编程

    一,Linux C++ Socket网络编程 1.什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制 ...

  9. linux java socket编程_深入学习socket网络编程,以java语言为例

    了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...

最新文章

  1. h5 调起相机_Html5在手机端调用相机的方法实现
  2. 三点弯曲弹性模量怎么计算公式_?怎么计算弯管的尺寸和弯管的张力
  3. 运行mysql时,提示Table ‘performance_schema.session_variables’ doesn’t exist
  4. 遇到个鬼,在WIN08的DELL R710上安装CENTOS 63,无法格式化以前的硬盘分区,安装无法进行下去。...
  5. Changing scope values asynchronously - updates don't propagate without .apply()
  6. ES5-16【utils】数组方法、类数组
  7. VMware配置linux网络步骤
  8. 华为gsm模块_出货量全球第一,华为阿里腾讯都是其客户,上海移远通信牛在哪?...
  9. Flink的累加器(Accumulator)应用
  10. java集合框架之Collection
  11. 又是Access做怪,DateTime类型操作失败
  12. python程序运行原理
  13. matlab r2014a 序列号,Matlab R2014a 免费版
  14. zemax准直透镜_基于ZEMAX的半导体激光器非球面准直透镜设计.PDF
  15. 【gp数据库】你可能不知道却超级实用的函数
  16. CSS动画入门:一分钟实现球体上下跳动动画效果
  17. 改进的各向异性湿法蚀刻工艺
  18. Spring Cloud深入浅出
  19. 树莓派Pico-Raspberry Pi Pico简介
  20. 【CZY选讲·吃东西】

热门文章

  1. 【Markdown】Markdown 中的Flow flowchart.js 的基础教程
  2. HTML、HTTP、Web综合面试题(三)
  3. js实现鼠标跟随效果
  4. Python的 yield用法
  5. apache、php安装
  6. App打开小程序,小程序打开App
  7. keydown、input、keyup
  8. 解决windows自带远程桌面无法打开某些软件(模拟器等)
  9. 逻辑回归(Logistic Regression)原理及Python实现
  10. CNN网络详细讲解,可视化图例解读