Java Socket(二) ServerSocket应用 秒速五厘米 2022-08-18 10:48 152阅读 0赞 对于即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求。这会,Socket对于我们来说就非常实用了。下面是本次学习的笔记。主要分异常类型、交互原理、Socket、ServerSocket、多线程这几个方面阐述。 ## 异常类型 ## 在了解Socket的内容之前,先要了解一下涉及到的一些异常类型。以下四种类型都是继承于IOException,所以很多之后直接弹出IOException即可。 <table> <thead> <tr> <th align="center">类型</th> <th align="center">作用</th> </tr> </thead> <tbody> <tr> <td align="center">UnkownHostException</td> <td align="center">主机名字或IP错误</td> </tr> <tr> <td align="center">ConnectException</td> <td align="center">服务器拒绝连接、服务器没有启动、(超出队列数,拒绝连接)</td> </tr> <tr> <td align="center">SocketTimeoutException</td> <td align="center">连接超时</td> </tr> <tr> <td align="center">BindException</td> <td align="center">Socket对象无法与制定的本地IP地址或端口绑定</td> </tr> </tbody> </table> ## 交互过程 ## Socket与ServerSocket的交互,下面的图片我觉得已经说的很详细很清楚了。 ![这里写图片描述][241809453054816.png] ## 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、绑定本地端口。 ### 方法 ### getInetAddress(); 远程服务端的IP地址 getPort(); 远程服务端的端口 getLocalAddress() 本地客户端的IP地址 getLocalPort() 本地客户端的端口 getInputStream(); 获得输入流 getOutStream(); 获得输出流 值得注意的是,在这些方法里面,最重要的就是getInputStream()和getOutputStream()了。 ### 状态 ### 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(); } } } } [241809453054816.png]: /images/20220731/00c0da6f60d8404bbdc07c311a24f3a7.png [InetAddress]: http://blog.csdn.net/u013007900/article/details/50261427
相关 Java网络编程:ServerSocket、Socket通信示例 在Java中,服务器通过Socket通信。以下是一个简单的ServerSocket和Socket通信的示例: 1. 创建ServerSocket(监听客户端连接): ```j 墨蓝/ 2024年09月10日 02:00/ 0 赞/ 19 阅读
相关 Java网络编程基础:Socket与ServerSocket 在Java中,Socket和ServerSocket是两个重要的类,用于实现客户端和服务器端的通信。 1. Socket: Socket是TCP(传输控制协议)层的一个接口。 àì夳堔傛蜴生んèń/ 2024年09月04日 09:33/ 0 赞/ 12 阅读
相关 Java Socket(二) ServerSocket应用 对于即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求。这会,Socket对于我们来说就非常实用了。下面是本次学习的笔记。主要分异常类型、交互原理、Socke 秒速五厘米/ 2022年08月18日 10:48/ 0 赞/ 153 阅读
相关 java网络编程(一)Socket、ServerSocket 1.Socket java都是基于InputStream还有OutputStream实现的。Socket也可以通过输入、输出流进行读写。 客户端 Output 不念不忘少年蓝@/ 2022年03月21日 14:30/ 0 赞/ 208 阅读
相关 【Java】ServerSocket类和Socket类实例化应用 使用流进行信息的传输,注意读写顺序要一致,读写方法具有对象针对性使用正确的的读写方法。如 writeInt readInt 下面的代码使用进程管理的方法实现Server的不 落日映苍穹つ/ 2021年12月21日 16:34/ 0 赞/ 270 阅读
相关 【Java】ServerSocket类和Socket类 ServerSocket类 Socket类代表一个客户端套接字,即任何时候你想连接到一个远程服务器应用的时候你构造的套接字,现在,假如你想实施一个服务器应用,例如一个HTT 系统管理员/ 2021年12月20日 13:11/ 0 赞/ 287 阅读
相关 网络开发Socket和ServerSocket 已经发表个人公众号 Socket和ServerSocket Socket为“孔”或“插座”,创建Socket,打开连接Socket的输入或输出流,对Socke 我就是我/ 2021年09月15日 00:02/ 0 赞/ 325 阅读
相关 java BIO实例——ServerSocket、Socket编程 在使用传统的ServerSocket和Socket的时候很多时候程序是会阻塞的。比如serversocket.accept() , socket.getInputStream( 傷城~/ 2021年06月24日 14:35/ 0 赞/ 470 阅读
相关 Java 实例 - ServerSocket 和 Socket 通信实例 Java 实例 - ServerSocket 和 Socket 通信实例,1、建立服务器端 - 服务器建立通信ServerSocket - 服务器建立Socket接收客户... 灰太狼/ 2020年05月23日 15:41/ 0 赞/ 837 阅读
还没有评论,来说两句吧...