Socket套接字学习笔记
套接字Socket
1.IP与端口
IP
IP地址标识Internet上的计算机
(待补充)
端口
端口号标识正在计算机上运行的进程(程序)。
端口号被规定为一个16位的065535($2^{16}-1$)之间的整数,其中01023被预先定义的服务通信占用(如telnet占用端口23、http占用端口80等),除非需要访问这些特定服务,否则应该使用1024~65535这些端口中的某一个进行通信,以免发生端口冲突
2.什么是Socket
当两个程序需要通信时,它们可以通过Socket类建立套接字对象并连接在一起(端口号与IP地址的组合得出一个网络套接字)
3.客户端的套接字对象
Socket构造方法
Socket(String host, int port)
host是服务器的IP地址,port是端口号
异常
建立套接字对象可能发生IOException异常,要处理好异常
try
{
Socket mysocket = new Socket("http://192.168.0.78",1880);
}
catch(IOException e){}
输入输出信息
套接字建立后,可以想象一条通信“线路”已经建立起来
我们可以用getInputStream()
获得一个输入流,然后用这个输入流读取服务器放入“线路”的信息(不能读取自己放入线路的信息)。
我们也可用getOutputStream()
获得一个输出流,然后用这个输出流将信息写入“线路”。
后面把mysocket用方法getInputStream()
得到的输出流连接到一个DataInputStream
流上,向这个流发送信息,因为这个流有更好的向流中写入信息的方法,getOutStream()
同理
4.ServerSocket类
为了使客户成功连接至服务器,服务器必须建立一个ServerSocket对象,该对象将客户端的套接字对象和服务端的一个套接字对象连接。
构造方法
ServerSocket(int port)
port是端口号,该端口号必须和客户呼叫的端口号相同。(这里端口可以理解为通道的编号?)
异常
建立ServerSocket对象时可能发生IOException异常
try
{
ServerSocket server_socket = new ServerSocket(1880);
}
catch(IOException e){}
accept方法
对象建立后,就可以用accept()方法将客户端的套接字和服务器端的套接字连接起来
try
{
Socket sc = server_socket.accept();
}
catch(IOException e){}
accept()
方法会返回一个和客户端Socket对象相连接的Socket对象
服务器端通过accept()
方法得到的这个对象sc使用方法getOutputStream()
获得的输出流将指向客户端的mysocket使用方法getInputStream()
获得的那个输出流。
同样,服务器端的sc使用方法getInputStream()
获得的输出流将指向客户端mysocket使用方法getOutputStream()```获得的输出流
因此,当服务器向这个输出流写入信息时,客户端就能读取,反之亦然。
注意accept()
方法会堵塞线程
accept()
方法会堵塞线程的继续执行,直到接收到客户的呼叫。
在下述代码中,如果没有客户呼叫服务器,那么下述代码中的System.out.println("ok")
就不会执行
try
{
Socket sc = server_socket.accept();
System.out.println("ok");
}
catch(IOException)
获取IP
连接建立后,服务器端的套接字对象调用getInetAddress()
方法可以获取一个InetAddress对象,该对象含有客户端的IP地址和域名
同样,客户端的套接字对象调用getInetAddress()
方法可以获取一个InetAddress对象,该对象含有服务器端的IP地址和域名
关闭套接字连接
通信完毕后,应使用close()
方法关闭套接字连接
5.把套接字连接放在一个线程中
客户使用Socket类不带参数的构造方法Socket()
创建一个套接字对象,该对象调用
public void connect(SocketAddress endpoint) throws IOException
请求和参数SocketAddress
指定地址的套接字对象建立连接
为了使用connect
方法,可以使用SocketAddress
的子类InetSocketAddress
创建一个对象。InetSocketAddress
的构造方法如下:
public InetSocketAddress(InetAddress addr, int port)