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)
posted @ 2021-11-28 20:45  cheng_zhi  阅读(137)  评论(0)    收藏  举报