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

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. 初识Spring JdbcTemplate

    JdbcTemplate 概述 JdbcTemplate是Spring提供的一个模板类,它是对jdbc的封装.用于支持持久层的操作.具有简单,方便等特点. pom.xml <!--依赖版本--& ...

  2. LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会 ...

  3. 机器学习- RNN以及LSTM的原理分析

    概述 RNN是递归神经网络,它提供了一种解决深度学习的另一个思路,那就是每一步的输出不仅仅跟当前这一步的输入有关,而且还跟前面和后面的输入输出有关,尤其是在一些NLP的应用中,经常会用到,例如在NLP ...

  4. Django+Nginx+Uwsgi环境配置

    nginx.conf : server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.acces ...

  5. 7-8 jmu-python-从列表中删除元素 (15 分)

    删除列表中所有符合条件的值. 输入格式: 输入n,代表要测试n次.每次测试:首先,输入1行字符串(字符串内的元素使用空格分隔)然后,输入要删除的元素x. 输出格式: 输出删除元素x后的每行字符串.如果 ...

  6. 正式学习MVC 04

    1.ActionResult ActionResult是一个父类, 子类包括了我们熟知的 ViewResult 返回相应的视图 ContentResult  返回字符串 RedirectResult( ...

  7. 基于vue开发的在线付费课程应用

    最近在弄一个付费课程的应用,主要有微信登录,支付和自定义分享,在开发过程中遇到的坑,这里做一下记录 文章主要有以下几点 使用库简介 微信登录解决 微信支付解决 微信自定义分享解决 页面前进后退数据状态 ...

  8. javascript常用工具函数总结(不定期补充)未指定标题的文章

    前言 以下代码来自:自己写的.工作项目框架上用到的.其他框架源码上的.网上看到的. 主要是作为工具函数,服务于框架业务,自身不依赖于其他框架类库,部分使用到es6/es7的语法使用时要注意转码 虽然尽 ...

  9. fsLayuiPlugin数据表格动态转义

    数据表格动态转义提供一种更简洁的方式,主要解决前端laytpl模板转义的问题,对于一些简单的,例如:状态展示,我们可以通过前端编写laytpl模板来处理:对于动态的数据,通过这种静态方式是没有办法处理 ...

  10. JS 获取一段时间内的工作时长小时数

    本来想是想找轮子的,但是并没有找到能用的,多数都是问题很大,所以就自己写了一个 需求说明 支持自选时间段,即开始时间与结束时间根据用户的上班及下班时间判定返回小时数 技术栈 moment.js 思考过 ...