网络是连接不同计算机的媒介,不同的计算机依靠网络来互相通信,即传递数据。

Java中与网络编程相关的部分主要是Socket(套接字),它作为一种抽象的结构,实现了与通信相关的各类方法,构成一套完整的通信机制。

当然,Socket本身是独立于编程语言之上的概念,就像数据结构与算法一样,它并不属于Java,而是一种公认的通信的解决方案,大部分语言都实现了与socket相关的通信功能。

原理

Socket通过使用TCP(传输控制协议)提供了两台计算机之间的通信机制。具体的方式是:服务器处会首先创建ServerSocket对象,并使其处于监听本地某端口状态,而客户端通过创建一个Socket去连接服务端上的对应端口,于是连接建立,服务端的ServerSocket的accept方法会返回一个Socket对象,现在两台机器就可以都通过Socket对象的标准写入和读取方法来进行通信了。

完整步骤如下:

  • 服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
  • 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
  • 服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
  • Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
  • 在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。

Java实现

服务端——ServerSocket

服务端首先实例化一个ServerSocket类对象,该对象需要调用accept()方法监听本地的一个端口,之后便进入阻塞状态,直到客户端的Socket的连接请求到来。

ServerSocket 类的方法:

|方法|描述|

|--------|

|public ServerSocket(int port) throws IOException|创建绑定到特定端口的服务器套接字。|

|public ServerSocket(int port, int backlog) throws IOException|利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。|

|public ServerSocket(int port, int backlog, InetAddress address) throws IOException|使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。|

|public ServerSocket() throws IOException|创建非绑定服务器套接字。创建非绑定服务器套接字。 如果 ServerSocket 构造方法没有抛出异常,就意味着你的应用程序已经成功绑定到指定的端口,并且侦听客户端请求。|

一般使用的最多的是第一种构造方法,即新建ServerSocket,并让其直接监听本地的某一端口。

还有一些 ServerSocket 类的常用方法:

方法 描述
public int getLocalPort() 返回此套接字在其上侦听的端口。
public Socket accept() throws IOException 侦听并接受到此套接字的连接。
public void setSoTimeout(int timeout) 通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位。
public void bind(SocketAddress host, int backlog) 将 ServerSocket 绑定到特定地址(IP 地址和端口号)。

客户端

客户端直接进行Socket类的实例化,并尝试连接服务器的对应端口。

首先看Socket类的构造方法。

方法 描述
public Socket(String host, int port) throws UnknownHostException, IOException. 创建一个流套接字并将其连接到指定主机上的指定端口号。
public Socket(InetAddress host, int port) throws IOException 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. 创建一个套接字并将其连接到指定远程主机上的指定远程端口。
public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. 创建一个套接字并将其连接到指定远程地址上的指定远程端口。
public Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字

而Socket在构造后,其实会首先自动地去尝试连接指定的服务器与端口。

连接建立

连接建立后,两边的Socket就可以开始自由交流了,交流过程中,两边的Socket对象本质都一样了(服务端的ServerSocket调用accept()方法后已经返回了Socket对象,因此服务端现在也是一个Socket对象在进行交流)。

下面是通信过程中socket对象可以调用的一些方法:

方法 描述
public void connect(SocketAddress host, int timeout) throws IOException 将此套接字连接到服务器,并指定一个超时值。
public InetAddress getInetAddress() 返回套接字连接的地址。
public int getPort() 返回此套接字连接到的远程端口。
public int getLocalPort() 返回此套接字绑定到的本地端口。
public SocketAddress getRemoteSocketAddress() 返回此套接字连接的端点的地址,如果未连接则返回 null。
public InputStream getInputStream() throws IOException 返回此套接字的输入流。
public OutputStream getOutputStream() throws IOException 返回此套接字的输出流。
public void close() throws IOException 关闭此套接字。

实例

Server类:

/**
*
*/
package socket; import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author Tom Qian
* @email tomqianmaple@outlook.com
* @github https://github.com/bluemapleman
* @date 2017年8月18日
*/ public class Server
{
private static int port=10000;
private static String ip="127.0.0.1"; /**
* @param args
*/
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(10000);
while(true){
Socket s=ss.accept();
PrintStream ps=new PrintStream(s.getOutputStream());
ps.print("您好,您收到了服务器的新年祝福!"); ps.close();
s.close();
} } }

Client类:

/**
* @author Tom Qian
* @email tomqianmaple@outlook.com
* @github https://github.com/bluemapleman
* @date 2017年8月18日
*/
package socket; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket; public class Client
{ /**
* @param args
*/
public static void main(String[] args) throws Exception
{
int port=10000;
Socket socket=new Socket("127.0.0.1",port);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line=br.readLine();
System.out.println("来自服务器的数据:"+line);
br.close();
socket.close(); } }

先启动Server类,再启动Client类(否则Client这边会报ConnectException,拒绝连接错误!当然啦!服务端那边连个收信员都没有,你的信怎么可能发的过去呢?),效果如下:

本文参考:

[1] 菜鸟教程——Java网络编程

Java网络编程——Socket的更多相关文章

  1. java网络编程socket\server\TCP笔记(转)

    java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅     1 TCP的开销 a ...

  2. java网络编程socket解析

    转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在 ...

  3. day05 Java网络编程socket 与多线程

    java网络编程 java.net.Socket Socket(套接字)封装了TCP协议的通讯细节,是的我们使用它可以与服务端建立网络链接,并通过 它获取两个流(一个输入一个输出),然后使用这两个流的 ...

  4. java网络编程Socket通信详解

    Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...

  5. java网络编程——socket实现简单的CS会话

    还记得当年学计网课时用python实现一个简单的CS会话功能,这也是学习socket网络编程的第一步,现改用java重新实现,以此记录. 客户端 import java.io.*; import ja ...

  6. JAVA网络编程Socket常见问题 【长连接专题】

    一. 网络程序运行过程中的常见异常及处理 第1个异常是 java.net.BindException:Address already in use: JVM_Bind. 该异常发生在服务器端进行new ...

  7. java 网络编程Socket

    TCP: 通过TCP协议传输,得到的是一个顺序的无差错的数据流. 发送方和接收方的成对的两个socket之间必须建立连接, 以便在TCP协议的基础上进行通信,当一个socket(通常都是server ...

  8. java 网络编程Socket编程

    Server.java import java.io.*; import java.net.*; public class Server { public static void main(Strin ...

  9. Java网络编程Socket通信

        TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议     UDP (User Datagram Proto ...

随机推荐

  1. LNMP环境搭建--Centos7

    LNMP环境搭建--Centos7 | 刘鹏--博客 盒子 盒子 博客 分类 搜索 文章目录 在Centos7环境安装LAMP环境,备忘哈哈. 准备 首先去官网下载php,nginx 编译安装php ...

  2. USB小白学习之路(6) IIC EEPROM读取解析

    IIC EEPROM读取解析 1. 编译错误处理(这里可以忽略) 在解压包解压了程序后,直接编译,出现如下错误. *** WARNING L14: INCOMPATIBLE MEMORY MODEL ...

  3. 初识Arduino

    Arduino是一款便捷灵活.方便上手的开源电子原型平台.包含硬件(各种型号的Arduino板)和软件(Arduino IDE).由一个欧洲开发团队于2005年冬季开发.其成员包括Massimo Ba ...

  4. 带你封装自己的MVP+Retrofit+RxJava2框架(一)

    前言 文本已经收录到我的Github个人博客,欢迎大佬们光临寒舍:我的GIthub博客 看完本篇文章的,可以看下带你封装自己的MVP+Retrofit+RxJava2框架(二),里面封装得到了改进 本 ...

  5. Mac使用brew安装MongoDB

    之前一直使用以下命令安装MongoDB,但是一直安装不上 brew install mongodb 后来看了官网,安装方法如下 brew tap mongodb/brew //这步不知道需不需要 br ...

  6. windows下tensorflow/objectdetection API环境搭建(基于tensorflow1.14和python3.6)

    此前就听闻室友说tensorflow在windows下坑很多,这次终于亲身领会到了.以下是参考网上大佬的教程以及自己的踩坑史总结出的有效步骤(亲测有效) 1.下载objectdetection所在的m ...

  7. 大型Java进阶专题(一) 前言

    前言 ​ 各位读者好,本系列为Java进阶专题,为那些有一定工作经验,做了多年业务的码农,希望突破技术瓶颈,但没有形成系统的Java只是体系,缺乏清晰的提升方法和学习路径的人,比如作者本人.该课题的是 ...

  8. 使用vue cli3新建一个vue项目

    写在最前 虽然身为一个java后端工作者,前端还是要沾点的,基于vue的火热,所以平常的工作中项目前端基本都是vue.这次就主要讲一讲vue项目的创建,并从vue的安装开始讲起,附带上我之前安装使用时 ...

  9. SpringBoot是如何实现自动配置的?--SpringBoot源码(四)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoot源码(三 ...

  10. Intel优化Gen7驱动代码 Geekbench 5性能猛增

    Linux下缺少大量开发.支持是会导致各种奇葩的错误的,Intel日前就提交了一个代码修复,22nm Ivybridge及Haswell处理器的GeekBench 5的性能就提升了330%. 3.3倍 ...