对于即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求。这会,Socket对于我们来说就非常实用了。下面是本次学习的笔记。主要分异常类型、交互原理、Socket、ServerSocket、多线程这几个方面阐述。
异常类型
在了解Socket的内容之前,先要了解一下涉及到的一些异常类型。以下四种类型都是继承于IOException,所以很多之后直接弹出IOException即可。
UnkownHostException:      主机名字或IP错误
ConnectException:        服务器拒绝连接、服务器没有启动、(超出队列数,拒绝连接)
SocketTimeoutException:      连接超时
BindException:          Socket对象无法与制定的本地IP地址或端口绑定
交互过程
Socket与ServerSocket的交互,下面的图片我觉得已经说的很详细很清楚了。

Socket
构造函数
Socket()
Socket(InetAddress address, int port)throws UnknownHostException, IOException
Socket(InetAddress address, int port, InetAddress localAddress, int localPort)throws IOException
Socket(String host, int port)throws UnknownHostException, IOException
Socket(String host, int port, InetAddress localAddress, int localPort)throws IOException

除去第一种不带参数的之外,其它构造函数会尝试建立与服务器的连接。如果失败会抛出IOException错误。如果成功,则返回Socket对象。
InetAddress是一个用于记录主机的类,其静态getHostByName(String msg)可以返回一个实例,其静态方法getLocalHost()也可以获得当前主机的IP地址,并返回一个实例。Socket(String host, int port, InetAddress localAddress, int localPort)构造函数的参数分别为目标IP、目标端口、绑定本地IP、绑定本地端口。

Socket方法
getInetAddress();      远程服务端的IP地址
getPort();          远程服务端的端口
getLocalAddress()      本地客户端的IP地址
getLocalPort()        本地客户端的端口
getInputStream();     获得输入流
getOutStream();      获得输出流
值得注意的是,在这些方法里面,最重要的就是getInputStream()和getOutputStream()了。

Socket状态
isClosed();            //连接是否已关闭,若关闭,返回true;否则返回false
isConnect();      //如果曾经连接过,返回true;否则返回false
isBound();            //如果Socket已经与本地一个端口绑定,返回true;否则返回false
如果要确认Socket的状态是否处于连接中,下面语句是很好的判断方式。
boolean isConnection=socket.isConnected() && !socket.isClosed();   //判断当前是否处于连接

半关闭Socket
很多时候,我们并不知道在获得的输入流里面到底读多长才结束。下面是一些比较普遍的方法:
自定义标识符(譬如下面的例子,当受到“bye”字符串的时候,关闭Socket)
告知读取长度(有些自定义协议的,固定前几个字节表示读取的长度的)
读完所有数据
当Socket调用close的时候关闭的时候,关闭其输入输出流

ServerSocket
构造函数
ServerSocket()throws IOException
ServerSocket(int port)throws IOException
ServerSocket(int port, int backlog)throws IOException
ServerSocket(int port, int backlog, InetAddress bindAddr)throws IOException
注意点:
1.port服务端要监听的端口;backlog客户端连接请求的队列长度;bindAddr服务端绑定IP
2.如果端口被占用或者没有权限使用某些端口会抛出BindException错误。譬如1~1023的端口需要管理员才拥有权限绑定。
3.如果设置端口为0,则系统会自动为其分配一个端口;
4.bindAddr用于绑定服务器IP,为什么会有这样的设置呢,譬如有些机器有多个网卡。
5.ServerSocket一旦绑定了监听端口,就无法更改。ServerSocket()可以实现在绑定端口前设置其他的参数。
单线程的ServerSocket例子

 1 public void service(){
 2         while(true){
 3             Socket socket = null;
 4             try{
 5                 socket = null ;//serverSocket.accept();//从连接队列中取出一个连接,如果没有则等待
 6                 System.out.println("新增连接:" + socket.getInetAddress() + ":" + socket.getPort());
 7             }catch(Exception e){
 8                 e.printStackTrace();
 9             }finally{
10                 try{
11                     if(socket!=null)
12                         socket.close();//与一个客户端通信结束后,要关闭Socket
13                 }catch(IOException e){
14                     e.printStackTrace();
15                 }
16             }
17         }
18     }

View Code

多线程的ServerSocket
多线程的好处不用多说,而且大多数的场景都是多线程的,无论是我们的即时类游戏还是IM,多线程的需求都是必须的。下面说说实现方式:
 主线程会循环执行ServerSocket.accept();
 当拿到客户端连接请求的时候,就会将Socket对象传递给多线程,让多线程去执行具体的操作;
实现多线程的方法要么继承Thread类,要么实现Runnable接口。当然也可以使用线程池,但实现的本质都是差不多的。
这里举例:
下面代码为服务器的主线程。为每个客户分配一个工作线程:

 1 public void service(){
 2         while(true){
 3             Socket socket=null;
 4             try{
 5                 socket = serverSocket.accept(); //主线程获取客户端连接
 6                 Thread workThread = new Thread(new Handler(socket)); //创建线程
 7                 workThread.start(); //启动线程
 8             }catch(Exception e){
 9                 e.printStackTrace();
10             }
11         }
12     }

View Code

当然这里的重点在于如何实现Handler这个类。Handler需要实现Runnable接口:

 1 class Handler implements Runnable {
 2     private Socket socket;
 3
 4     public Handler(Socket socket) {
 5         this.socket = socket;
 6     }
 7
 8     public void run() {
 9         try {
10             System.out.println("新连接:" + socket.getInetAddress() + ":"
11                     + socket.getPort());
12             Thread.sleep(10000);
13         } catch (Exception e) {
14             e.printStackTrace();
15         } finally {
16             try {
17                 System.out.println("关闭连接:" + socket.getInetAddress() + ":"
18                         + socket.getPort());
19                 if (socket != null)
20                     socket.close();
21             } catch (IOException e) {
22                 e.printStackTrace();
23             }
24         }
25     }
26 }

View Code

当然是先多线程还有其它的方式,譬如线程池,或者JVM自带的线程池都可以。这里就不说明了。
转载 :http://www.cnblogs.com/rond/p/3565113.html

转载于:https://www.cnblogs.com/kongxianghao/p/6849828.html

Socket和ServerSocket学习笔记相关推荐

  1. [Java]Socket和ServerSocket学习笔记

    对于即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求.这会,Socket对于我们来说就非常实用了.下面是本次学习的笔记.主要分异常类型.交互原理.Socket.ServerSock ...

  2. java事件 socket_java中有关socket通信的学习笔记

    最近做的项目中使用到了一些基于java的socket长连接的一些功能,用来穿透有关行业的网闸.用到了也就学习了一下,下面是对学习内容的一个笔记,记录一下也希望有兴趣的同学可以参考一下,加深对javas ...

  3. Socket通信---网络通信学习笔记(一)

    两台计算机进行通信的基本前提: (1)IP地址: 每台计算机都有自己独一无二的IP地址,根据IP地址判断与哪台计算机进行通信. (2)端口号: 每个应用程序都有自己专属的端口,根据端口号判断与计算机中 ...

  4. Socket网络编程学习笔记 (10)简易聊天室案例

    1. 聊天室数据传输设计 必要条件:客户端.服务器 必要约束:数据传输协议 原理:服务器监听消息来源.客户端链接服务器并发送消息到服务器 1.1 客户端.服务器数据交互 client 发送消息到服务器 ...

  5. python中socket模块常用吗_python网络学习笔记——socket模块使用记录

    此文章记录了笔者学习python网络中socket模块的笔记. 建议初次学习socket的读者先读一遍socket模块主要函数的介绍. socket模块的介绍可以参考笔者的前一篇关于socket官方文 ...

  6. 《实战 Linux Socket 编程》Warren W.Gay 图解Key-point学习笔记-1

    第一章 套接口简介 --------本文为作者原创,转载请注明出处-------- 此系列为本人的学习笔记,欢迎大家在留言区对概念进行拓展延伸.纠错讨论! 注:所有的例子程序均来自于原书,笔者亲自录入 ...

  7. LiteOS学习笔记-5通信模组之LiteOS的SAL及socket编程

    LiteOS学习笔记-5通信模组之LiteOS的SAL及socket编程 一.SAL套接字抽象层 二.Socket套接字简介 Socket概述 Socket结构体 字节序转换函数 ip地址的转换 字节 ...

  8. 网络通信编程学习笔记(六):socket编程实战

    目录 一.wireshark抓包分析TCP协议 1.1.TCP协议的连接与断开简介 1.2.用wireshark抓取使用TCP协议传输的握手包 二.用Teardrop代码编写一个假包,并抓取 2.1. ...

  9. socket编程学习笔记:部分函数用法以及accept函数问题

    学习笔记:socket编程部分函数用法 socket()函数: bind()函数: listen()函数: accept()函数: connect()函数: socket()函数: socket函数对 ...

  10. 【学习笔记】在windows下进行基于TCP的本地客户端和服务端socket通信

    文章目录 socket介绍 java中使用socket 基于tcp的socket通信 使用ServerSocket类创建一个web服务器:(java) windows下的基于tcp的socket编程( ...

最新文章

  1. mac怎么用c语言写文件路径,Mac 中使用os模块更改文件路径
  2. CSS Sprites (CSS精灵)
  3. 数据结构:单向链表的反转
  4. 利用ASP下载远程文件到服务器
  5. Java学习笔记_抽象/接口
  6. stl中copy()函数_std :: rotate_copy()函数以及C ++ STL中的示例
  7. 赛锐信息-AMS系列产品简介
  8. unity3d点击屏幕判断是否击中场景中物体
  9. python安全性_关于python安全性的问题
  10. windows 监控
  11. 三种1:4传输线变压器巴伦的分析
  12. zynq7000从emmc启动,使用ext4文件系统
  13. Android 混淆
  14. SCI收录期刊——采矿和选矿
  15. java计算机毕业设计教师科研成果管理源码+mysql数据库+系统+lw文档+部署
  16. Liu C-2021-1: Nontrivial Gates FET
  17. Python爬虫爬取链家租房信息(python大作业)
  18. html表格宽度设置没效果,html表格宽度设置失效
  19. 使用 ThreeJS 还原「流浪气球」
  20. 神经网络模型结果怎么看,神经网络模型怎么评估

热门文章

  1. Giter8 -- 把项目布局模板放到 GitHub 上
  2. soultion of mySQL disk exceeded problem
  3. 电梯设计需求调研报告
  4. Android开源框架Universal-Image-Loader完全解析(三)
  5. 算法设计和数据结构学习_2(常见排序算法思想)
  6. POJ 3468 A Simple Problem with Integers(线段树区间更新)
  7. flask—wtforms
  8. liunx下文件授权可执行权限chmod
  9. 九度OJ 1133:学分绩点 (加权平均数)
  10. bzoj2002:[Hnoi2010]Bounce 弹飞绵羊