对于即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求。这会,套接字对于我们来说就非常实用了。下面是本次学习的笔记。主要分异常类型,交互原理,插座,考察一下,多线程这几个方面阐述。
在了解套的内容之前,先要了解一下涉及到的一些异常类型。以下四种类型都是继承于IOException,所以很多之后直接弹出IOException即可。
UnkownHostException:,,,主机名字或IP错误
ConnectException:,,,服务器拒绝连接,服务器没有启动,(超出队列数,拒绝连接)
SocketTimeoutException:,,,,,连接超时
BindException:,,,套接字对象无法与制定的本地IP地址或端口绑定,
插座与ServerSocket的交互、下面的图片我觉得已经说的很详细很清楚了只
插座()
套接字(int InetAddress地址,端口)抛出UnknownHostException, IOException
套接字(InetAddress地址,int港口,InetAddress localAddress, int localPort)抛出IOException
套接字(字符串主机,int端口)抛出UnknownHostException, IOException
套接字(String主机,int港口,InetAddress localAddress, int localPort)抛出IOException
除去第一种不带参数的之外,其它构造函数会尝试建立与服务器的连接。如果失败会抛出IOException错误。如果成功,则返回插座对象。
InetAddress是一个用于记录主机的类,其静态getHostByName(字符串味精)可以返回一个实例,其静态方法getLocalHost()也可以获得当前主机的IP地址,并返回一个实例.Socket(字符串主机,int港口,InetAddress localAddress, int localPort)构造函数的参数分别为目标IP,目标端口,绑定本地IP,绑定本地端口只
getInetAddress (),,,,远程服务端的IP地址
getPort (),,,,远程服务端的端口
getLocalAddress (),,,本地客户端的IP地址
getLocalPort (),,,本地客户端的端口
getInputStream (),,,,获得输入流
getOutStream (),,,,获得输出流
值得注意的是,在这些方法里面,最重要的就是getInputStream()和getOutputStream()了只
关闭(),,,,,,,,//连接是否已关闭,若关闭,返回真的,否则返回假
isConnect ();//如果曾经连接过,返回真的,否则返回假
isBound (),,,,,,,,//如果插座已经与本地一个端口绑定,返回真的,否则返回假
如果要确认插座的状态是否处于连接中、下面语句是很好的判断方式。
布尔isConnection=socket.isConnected (),,! socket.isClosed ();,,//判断当前是否处于连接
很多时候,我们并不知道在获得的输入流里面到底读多长才结束。下面是一些比较普遍的方法:
-
<李> & # 61548;,自定义标识符(譬如下面的例子,当受到“再见”字符串的时候,关闭插座)李>
<李> & # 61548;,告知读取长度(有些自定义协议的,固定前几个字节表示读取的长度的)李>
<李> & # 61548;,读完所有数据李>
<李> & # 61548;,当插座调用近的时候关闭的时候,关闭其输入输出流,
李>
考察一下()抛出IOException 考察(int端口)抛出IOException 考察(int, int积压)抛出IOException 考察(int, int积压,InetAddress bindAddr)抛出IOException
<强> 强>
1。港服务端要监听的端口,积压客户端连接请求的队列长度;bindAddr服务端绑定IP
2。如果端口被占用或者没有权限使用某些端口会抛出BindException错误。譬如1 ~ 1023的端口需要管理员才拥有权限绑定。
3。如果设置端口为0,则系统会自动为其分配一个端口;
4。bindAddr用于绑定服务器IP,为什么会有这样的设置呢,譬如有些机器有多个网卡。
5。考察一旦绑定了监听端口,就无法更改.ServerSocket()可以实现在绑定端口前设置其他的参数只
公共空间服务(){ 而(真){ Socket套接字=零; 尝试{ 套接字=serverSocket.accept();//从连接队列中取出一个连接,如果没有则等待 System.out.println(“新增连接:“+ socket.getInetAddress () +“:”+ socket.getPort ()); …//接收和发送数据 }捕捉(IOException e) {e.printStackTrace();}{终于 尝试{ 如果(套接字!=null) socket.close();//与一个客户端通信结束后,要关闭插座 }捕捉(IOException e) {e.printStackTrace ();} } } }Java Socket编程笔记_动力节点Java学院整理