全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java Socket编程笔记_动力节点Java学院整理

对于即时类应用或者即时类的游戏,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自带的线程池都可以。这里就不说明了。

以上所述是小编给大家介绍的Java Socket编程笔记_,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# java  # socket  # 编程  # Java Socket聊天室编程(一)之利用socket实现聊天之消息推送  # Java Socket聊天室编程(二)之利用socket实现单聊聊天室  # Java Socket编程详解及示例代码  # 简单讲解Java的Socket网络编程的多播与广播实现  # Java基于Tcp协议的socket编程实例  # Java网络编程基础教程之Socket入门实例  # 多线程  # 绑定  # 都是  # 客户端  # 服务端  # 自定义  # 抛出  # 小编  # 的是  # 是一个  # 几个  # 很好  # 我觉得  # 多个  # 在此  # 就不  # 最重要  # 其他的  # 给大家  # 如果没有 


相关文章: 济南企业网站制作公司,济南社保单位网上缴费步骤?  建站之星如何保障用户数据免受黑客入侵?  内网网站制作软件,内网的网站如何发布到外网?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  高端网站建设与定制开发一站式解决方案 中企动力  如何选择高效稳定的ISP建站解决方案?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  建站之星如何一键生成手机站?  宁波免费建站如何选择可靠模板与平台?  h5在线制作网站电脑版下载,h5网页制作软件?  制作网站的模板软件,网站怎么建设?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  ,怎么在广州志愿者网站注册?  重庆市网站制作公司,重庆招聘网站哪个好?  中山网站推广排名,中山信息港登录入口?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  制作宣传网站的软件,小红书可以宣传网站吗?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  建站之星多图banner生成与模板自定义指南  建站之星如何通过成品分离优化网站效率?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  建站VPS推荐:2025年高性能服务器配置指南  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  如何基于云服务器快速搭建个人网站?  制作网站的基本流程,设计网站的软件是什么?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何快速查询域名建站关键信息?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  建站之星如何优化SEO以实现高效排名?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  如何获取上海专业网站定制建站电话?  建站主机无法访问?如何排查域名与服务器问题  想学网站制作怎么学,建立一个网站要花费多少?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  建站主机空间推荐 高性价比配置与快速部署方案解析  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  Python文件管理规范_工程实践说明【指导】  高防服务器租用首荐平台,企业级优惠套餐快速部署  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  网站制作报价单模板图片,小松挖机官方网站报价?  ,柠檬视频怎样兑换vip?  已有域名和空间,如何快速搭建网站?  5种Android数据存储方式汇总  建站主机如何安装配置?新手必看操作指南  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何通过万网虚拟主机快速搭建网站?  电商平台网站制作流程,电商网站如何制作? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。