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. 通讯结束后关闭连接

  

最新文章

  1. 51nod1240(莫比乌斯函数)
  2. Java 程序员必须掌握的 Linux 命令(转:导师Jencks)
  3. apache flink 入门
  4. 黑苹果-IOS学习的开始
  5. js中创建数组的方法
  6. 警惕多iframe下的同名id引起的诡异问题
  7. 使用Jayrock开源组件开发基于JSON-RPC协议的接口
  8. lamp环境搭建(ubuntu)
  9. HDU 3351 Seinfeld(括号匹配)
  10. HW3.27
  11. activity中实现Spinner绑定
  12. NSString去掉火车和空格
  13. 清华集训2014 day1 task3 奇数国
  14. Eclipse用法和技巧二十六:浅谈快捷键
  15. oracle 解锁scott账户
  16. Linux目录结构及快捷键
  17. web开发性能优化---UI界面篇
  18. js前端模块化(一) commonjs
  19. mysql集群搭建--韩国庆
  20. AVAudioSesion和AVAudioPlayer的基本使用

热门文章

  1. 【hdu2955】 Robberies 01背包
  2. HDU - 4704 sum 大数取余+欧拉降幂
  3. ZOJ 1586 QS Network Kruskal求最小生成树
  4. 组合外键(FOREIGN KEY)
  5. 计总与排名SUM和RANK函数
  6. OVN学习(一)
  7. 剑指Offer的学习笔记(C#篇)-- 栈的压入、弹出序列
  8. JS数组去重精简版
  9. mysql5.6数据库同步,单向双向同步问题
  10. 2016 CCPC-Final