1.Socket原理

1)Socket简介

  socket通常称作“套接字”,用于描述IP地址和端口号,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应不同的服务。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务端,Socket是简历网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。

2)获取本地地址和端口号

  • 获取本地使用的端口号

    int getLocalPort()
    返回类型为int

      

  • 获取套接字绑定的本地地址
    InetAddress getLocalAddress()
    

      

  • 使用InetAddress获取本地的地址方法
    String getCanonicaHostName()
    返回类型为String

      

  • 获取此IP地址的完全限定域名  
    String getHostAddress()
    返回类型为String

      

3)获取远端地址和端口号

  • Socket获取远端端口号方法

    int getPort()
    返回类型为int

      

  • 获取远端套接字绑定的远端地址
    InetAddress.getInetAddress()
    

      

案例1:Socket获取IP、端口信息

1.设置服务端,以本机作为服务器端演示

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; public class ServerSocketDemo {
public static void main(String[] args) {
ServerSocket server;
try {
server = new ServerSocket(8080); //创建ServerSocket并申请8080服务端口
Socket socket = server.accept(); //阻塞方法,监听服务端口,等待客户端的链接并返回一个socket实例
} catch (IOException e) {
e.printStackTrace();
}
}
}

2.设置客户端,以本机作为客户端演示

客户端设置完成后,先启动服务端,然后启动客户端去连接服务端,连接成功之后可以看到输出本端与远端的IP和端口信息

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket; public class SocketInetAddressDemo {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost",8080);
//获取本地使用的端口号
int port = socket.getLocalPort();
System.out.println("本地使用端口号:"+port); InetAddress add = socket.getLocalAddress(); //获取本地地址信息
//使用InetAddress获取本地地址
String hostname = add.getCanonicalHostName();
System.out.println("本地地址:"+hostname);
//获取此IP的完全限定域名
String hostadd = add.getHostAddress();
System.out.println("限定域名:"+hostadd);
//获取远端的端口号
int desPort = socket.getPort();
System.out.println("远端端口号:"+desPort);
//获取远端IP
InetAddress inetAdd = socket.getInetAddress();
System.out.println(inetAdd);
} catch (IOException e) {
e.printStackTrace();
}
}
} /*
运行结果:
本地使用端口号:62565
本地地址:127.0.0.1
限定域名:127.0.0.1
远端端口号:8080
localhost/127.0.0.1
*/

4)获取网络输入流和网络输出流

  使用Socket获取输入流与输出流,这两个方法使用Socket通讯的关键方法,封装了TCP协议的Socket是基于流进行通讯的,所以我们在创建了双方连接后,只需要获取相应的输入流与输出流即可实现通讯。

  • 返回此套接字的输入流

    InputStream getInputStream()
    

     

  • 返回此套接字的输出流

    OutputStream.getOutputStream()
    

      

  具体代码示例:

public void testSocket() throws Exception{
Socket socket = new Socket("localhost",8080);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
}

  

5)close方法

  当使用Socket进行通讯完毕后,要关闭Socket以释放系统资源。

void close()

  

2.Socket通讯模型

1)Server端ServerSocket监听

  java.net.ServerSocket是运行于服务端应用程序中,通常创建ServerSocket需要指定服务端口号,之后监听Sokcet的连接,监听方法为:

Socket accept()

  该方法是一个阻塞方法,直到一个客户端通过Socket连接后,accept会封装一个Socket,该Socket封装与表示该客户端的有关的信息,通过这个Socket与该客户端进行通信。

//创建ServerSocket并申请服务端口8080
ServerSocket server = new ServerSocket(8080);
//accept()方法会产生阻塞,直到某个Socket连接并返回请求连接的Socket
Socket socket = server.accept();

  

2)Client端Socket连接

  当服务端ServerSocket调用accept方法阻塞等待客户端连接后,我们可以通过在客户端应用程序中创建Socket来向服务端发起连接。

  需要注意的是:创建Socket的同时就发起连接,若连接异常会抛出异常,我们通常创建Socket时会传入服务端的地址以及端口号。

//参数1:服务器的IP地址  参数2:服务端的服务端口号
Socket socket = new Socket("localhost",8080);

  

3)C/S端通信模型

  C/S即:Client-Server,客户端到服务端

  客户端与服务端通信模型如下:

  1. 服务端创建ServerSocket
  2. 通过调用ServerSocket的accept方法监听客户端的连接
  3. 客户端创建Socket并指定服务端的地址以及端口来建立与服务端的连接
  4. 当服务端accept发现客户连接后,获取对应该客户端的Socket
  5. 双方通过Socket分别获取对应的输入与输出流进行数据通讯
  6. 通讯结束后关闭连接

  

Java TCP通信的更多相关文章

  1. Java TCP通信概念及实例

    TCP/UDP 协议 通俗解释: TCP协议和UDP协议的区别类似于电话系统和邮政系统. <1>TCP:类似于电话系统,建立双向的通信通道,确定连接,话音顺序接听. <2>UD ...

  2. java TCP 通信:服务端与客服端

    1.首先先来看下基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输 ...

  3. java TCP通信 socket 套接字 用图片上传轰炸服务器

    客户端 package com.swift.jinji; import java.io.FileInputStream; import java.io.IOException; import java ...

  4. TCP通信服务端及客户端代码

    Java TCP通信使用的是Socket(客服端)和ServerSocket(服务端),具体代码如下. server端代码: import java.io.BufferedReader; import ...

  5. 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)

    书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子——反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 1 2 3 ...

  6. java 网络编程之TCP通信和简单的文件上传功能

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  7. TCP通信实现对接硬件发送与接收十六进制数据 & int与byte的转换原理 & java中正负数的表示

    今天收到的一份需求任务是对接硬件,TCP通信,并给出通信端口与数据包格式,如下: 1.首先编写了一个简单的十六进制转byte[]数组与byte[]转换16进制字符串的两个方法,如下: /** * 将十 ...

  8. Java网络编程之TCP通信

    一.概述 Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信.Socket类的方法会建立和销毁连接,设置各种Socket选项. Server ...

  9. 【Java TCP/IP Socket】深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)

    基础准备 首先需要明白数据传输的底层实现机制,在http://blog.csdn.net/ns_code/article/details/15813809这篇博客中有详细的介绍,在上面的博客中,我们提 ...

随机推荐

  1. wireshark里无网络接口解决办法

    管理员模式下开启npf服务,该服务能捕获网络接口,net start npf

  2. L2-014. 列车调度 (DP)

    火车站的列车调度铁轨的结构如下图所示. Figure 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择任意一条轨道进入,最后从出口 ...

  3. 滴滴Booster移动APP质量优化框架 学习之旅

    推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 一.Booster简介 Booster是滴滴最近开源一个的移动应 ...

  4. HDU - 1535 Invitation Cards 前向星SPFA

    Invitation Cards In the age of television, not many people attend theater performances. Antique Come ...

  5. ASP.NET学习笔记(五)ASP 对象

    1.ASP Response 对象用于从服务器向用户发送输出的结果. 2.ASP Request 对象用于从用户那里取得信息 Request.QueryString 命令用于搜集使用 method=& ...

  6. ]Linq to EF 增删改查

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  7. CentOS 下部署Nginx+Gunicorn+Supervisor部署Flask项目

    原本之前有一部分东西是在Windows Server,但是由于Gunicorn不支持Windows部署起来颇为麻烦.最近转战CentOS,折腾一段时间,终于简单部署成功.CentOS新手,作为一个总结 ...

  8. C#中的结构体要使用new来实例化吗?

    声明结构的默认(无参数)构造函数是错误的.总是提供默认构造函数以将结构成员初始化为它们的默认值.在结构中初始化实例字段也是错误的. 如果使用 new 运算符创建结构对象,则会创建该结构对象,并调用适当 ...

  9. poj3164(最小树形图&朱刘算法模板)

    题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...

  10. JS 时间格式为/Date(1332919782070)/ 转化为正常的格式

    原理是取中间的毫秒数,再转换成js的Date类型 function ChangeDateFormat(val) { if (val != null) { var date = new Date(par ...