网络编程

来源:互联网 发布:vmware mac os 10.12 编辑:程序博客网 时间:2024/06/02 04:07

网络编程之Soctet基础


积少成多,全靠自觉


注:我也是一个小白,在IT的路上我们一起向前进步。

说明:最近毕业设计需要做一个聊天软件,很需要复习下java网络编程中的Socket知识,由此,写下学习记录,方便自己,方便他人。

Socket类

  • Socket是Java网络应用程序的一个基本的构造模块,它实现了程序之间的双向通信。
  • Socket是一个通信端点,当一个Socket连接建立以后,用户就可以从该Socket类的对象中获取输入输出流。


  • Socket类的构造方法有下面几种形式:

    • 1.Sicket(InetAddress address, int port)
    • 2.Sicket(InetAddress address, int port,InetAddress localAddr,int localPort)
    • 3.Sicket(String host, int port)
    • 4.Sicket(String host,InetAddress localAddr, int localPort)
    • 参数说明:
      • address:主机地址
      • Host:主机地址
      • localAddress:本机地址
      • localPort:本地端口
      • port:主机监听端口

  • Socket类中的一些常用方法

    • void close() //关闭Socket
    • InetAddress getInetAddress() //获取当前连接的Internet地址
    • InputStream getInputStream() //获取该Socket的输入流
    • InetAddress getLocalAddress() //获取本地地址
    • int getLocalPort() //获取本地端口号
    • OutputStream getOutputStream() //获取该Socket的输出流
    • int getPort() //获取远地端口号
    • int getSoLinger() //获取连接关闭后的发送数据延迟时间
    • int getSoTimeout() //获取读数据时的最长等待时间
    • void setSoLinger(Boolean on, int linger) //设置连接关闭后的发送数据延迟时间
    • void setSoTimeout(int timeout) //设置读数据时的最长等待时间
    • void shutdownInput() //关闭输入流
    • void shutdownOutput() //关闭输出流

上边Socket的常用方法(用到的时候再查询就好)

  • 所谓socket通常也称为“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求
  • ServerSocket和Socket类位于java.net包中
  • ServerSocket:用户服务器端
  • Socket:建立网络连接时使用
  • 在连接成功后,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。

  • 服务器

    • 使用ServerSocket监听指定的端口,等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
  • 客户端
    • 使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。

说了这么多理论,不如敲一遍代码测试一下

  • Client代码:
public class Client {    public static void main(String[] args) throws UnknownHostException,            IOException {        // 向本机的5525端口发出客户请求  (InetAddress.getLocalHost:获取本地主机名)        //创建一个流套接字,并将其与指定的IP地址中的指定端口号连接起来。        Socket socket = new Socket(InetAddress.getLocalHost(), 5525);        // 由Socket对象得到输入流,并构造相应的BufferReader对象        BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));        // 由Socket对象得到输出流,并构造PrintWriter对象        PrintWriter os = new PrintWriter(socket.getOutputStream());        // 由系统标准输入设备构造BufferedReader对象        BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));        while (true) {            String str = sin.readLine();// 从系统标准输入读入一字符串            os.println(str);            os.flush(); // 刷新输出流,使Server马上收到该字符串            String s = is.readLine();            System.out.println("Server : " + s);// 在标准输出上打印从Server读入的字符串            if (str.equals("end")) {                break;            }        }        is.close();// 关闭Socket输入流        os.close();// 关闭Socket输出流        socket.close();// 关闭Socket    }}
  • Server代码:
public class MyServer {    public static void main(String[] args) throws Exception {        ServerSocket server = new ServerSocket(5525);// 创建一个ServerSocket在端口5525监听客户请求        Socket client = server.accept();// 使用accept()阻塞等待客户请求        BufferedReader is = new BufferedReader(new InputStreamReader(client.getInputStream()));//获取客户端发送的流        PrintWriter os = new PrintWriter(client.getOutputStream());        BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));        while (true) {            String str = is.readLine();            System.out.println("Client : " + str);// 在标准输出上打印从Client读入的字符串            os.println(sin.readLine());            os.flush();// 刷新输出流,使Client马上收到该字符串            if (str.equals("end")) {                break;            }        }        is.close();        os.close();        client.close();        server.close();    }}
  • test步骤:

    • 1.run Server
    • 2.run Client
    • 3.如果run后都没有报错,那说明客户端和服务器连接成功
    • 4.开始会话
  • Client/Server会话示例:

  • Client
    Client
  • Server:
    Seiver:
0 0