对于即时类应用或者即时类的游戏,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例子
复制代码
public void service(){
    while(true){
        Socket socket=null;
        try{
            socket=serverSocket.accept();//从连接队列中取出一个连接,如果没有则等待
            System.out.println("新增连接:"+socket.getInetAddress()+":"+socket.getPort());
            ...//接收和发送数据
        }catch(IOException e){e.printStackTrace();}finally{
            try{
                if(socket!=null) socket.close();//与一个客户端通信结束后,要关闭Socket
            }catch(IOException e){e.printStackTrace();}
        }
    }
}
复制代码

多线程的ServerSocket
多线程的好处不用多说,而且大多数的场景都是多线程的,无论是我们的即时类游戏还是IM,多线程的需求都是必须的。下面说说实现方式:
主线程会循环执行ServerSocket.accept();
当拿到客户端连接请求的时候,就会将Socket对象传递给多线程,让多线程去执行具体的操作;
实现多线程的方法要么继承Thread类,要么实现Runnable接口。当然也可以使用线程池,但实现的本质都是差不多的。
 
这里举例:
下面代码为服务器的主线程。为每个客户分配一个工作线程:
复制代码
public void service(){
    while(true){
        Socket socket=null;
        try{
            socket=serverSocket.accept();                        //主线程获取客户端连接
            Thread workThread=new Thread(new Handler(socket));    //创建线程
            workThread.start();                                    //启动线程
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
复制代码

当然这里的重点在于如何实现Handler这个类。Handler需要实现Runnable接口:
复制代码
class Handler implements Runnable{
    private Socket socket;
    public Handler(Socket socket){
        this.socket=socket;
    }
    
    public void run(){
        try{
            System.out.println("新连接:"+socket.getInetAddress()+":"+socket.getPort());
            Thread.sleep(10000);
        }catch(Exception e){e.printStackTrace();}finally{
            try{
                System.out.println("关闭连接:"+socket.getInetAddress()+":"+socket.getPort());
                if(socket!=null)socket.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}
复制代码
当然是先多线程还有其它的方式,譬如线程池,或者JVM自带的线程池都可以。这里就不说明了。

Socket和ServerSocket相关推荐

  1. 使用Socket及ServerSocket创建简单的服务器

    使用Socket及ServerSocket创建简单的服务器 @(JAVA)[java] 参考自core java package com.lujinhong.corejava;import java. ...

  2. TCP协议下 Socket 与 ServerSocket

    不多bb. package c_20_1_5;import java.io.FileInputStream; import java.io.FileOutputStream; import java. ...

  3. common java socket,JAVA I/O(四)网络Socket和ServerSocket

    <Thinking in Enterprise Java>中第一章描述了用Socket和Channel的网络编程,核心即为Socket和Channel,本文简单讲述Socket的应用. S ...

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

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

  5. java socketserver多线程_JAVA I/O(五)多线程网络Socket和ServerSocket

    上篇文章介绍了Socket和ServerSocket简单使用和源码,服务器端会对每个客户端请求创建一个线程,为使服务器端能同时处理多个客户端请求,可以采用多线程的方式.本文仅对实例进行简单记录,如下. ...

  6. Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例

    Java网络编程 Socket.ServerSocket 详解,方法介绍及完整代码示例 概念 什么是网络编程? 网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来.当这些通过网络 ...

  7. Socket和ServerSocket的介绍

    1.Socket 类 socket可以使一个应用从网络中读取和写入数据,不同计算机上的两个应用可以通过连接发送和接受字节流.当发送消息时,你需要知道对方的ip和端口.在java中,socket指的是j ...

  8. Socket和ServerSocket(建立客户端和服务器端)

    网络编程(c/s)与网站编程(b/s)的区别? 网站编程是编写网页html,jsp,servelet等,只需要编写一端(server端),不需要编写client端,已经编写好了 网络编程相对底层一些, ...

  9. nearbyserversocket驱动_关于Socket和ServerSocket类详解

    Socket类 套接字是网络连接的一个端点.套接字使得一个应用可以从网络中读取和写入数据.放在两个不同计算机上的两个应用可以通过连接发送和接受字节流.为了从你的应用发送一条信息到另一个应用,你需要知道 ...

最新文章

  1. Android学习笔记(七):多个Activity和Intent
  2. Linux-进程内存占用情况
  3. NoMasp博客导读
  4. HDU 3613 Best Reward 正反两次扩展KMP
  5. 操作系统 课堂练习题03【20道 经典题目】
  6. 制图折断线_甲级设计院CAD制图技巧与画法讲解! 超实用,值得你收藏~
  7. 板子制作_使用Buildroot制作Ubootamp;Kernelamp;Rootfs
  8. C语言小知识---为什么要使用指针
  9. 醉赤壁用计算机怎么,抖音醉赤壁女生版谁唱的 醉赤壁女生合唱歌词
  10. oracle中同义词的用法,Oracle中定义以及使用同义词的方法
  11. 谷歌VR展示360度全景图
  12. android 吉他模拟器,真实吉他模拟器怎么玩 新手玩法攻略详解
  13. 微信公众号网页授权登陆
  14. OpenCV开发笔记(四十四):红胖子8分钟带你深入了解霍夫圆变换(图文并茂+浅显易懂+程序源码)
  15. [ 项目篇 ] 02 - LiveSpeaker项目的硬件平台选型
  16. C_.NET+Framdwork题库(未整理完,有时间再补)
  17. 表单提交-form,快速取值
  18. 肯德基微信小程序连接服务器异常,微信小程序平台常见问题及解决方案
  19. Oracle小数补零
  20. React Native腾讯广告优量汇广点通广告SDK集成

热门文章

  1. 算法章节 数组、链表、栈、队列
  2. Python学习13 异常处理机制
  3. 李国杰院士:国内开源社区的崛起需要一个过程
  4. apache sgoop 导入数据到 oracle、导出数据到 oracle 实现
  5. Linux 上 安装 nginx、 阿里云服务器上安装 nginx
  6. linkit-smart-7688-feed 安装笔录
  7. 数据结构比较型排序算法分析及选择
  8. FLEXAIR 界面展示。
  9. STL之string类型
  10. SuperMap iObject入门开发系列之五管线属性查询