zoukankan      html  css  js  c++  java
  • Socket例子

    javaSE中,如果需要建立服务器与客户端之间的通信,可以使用Socket。

    ServerSocket类:对应服务器

    Socket类:对应客户端

    上面两个类并没有继承关系,它们中都拥有一个SocketImpl类的成员变量,事实上两者的工作都由这个变量去执行。在应用程序中,我们可以通过改变SocketImplFactory来定制特定的SocketImpl类应对本地的防火墙。

    Socket类:

    构造方法:(有多个,只说一个)

    public Socket(String host,int port,InetAddress localAddr,int localPort) throws IOException

    host - 远程地址,为null则表示回环地址。
    port - 远程端口。
    localAddr - 本地地址,会被socket绑定;如果是null,则会选择任意一个本地地址。
    localPort - 本地端口,会被socket绑定;如果是0 ,则系统会选择一个空闲的端口。

    ServerSocket类:

    构造方法:(有多个,只说一个)

    public ServerSocket(int port,int backlog,InetAddress bindAddr) throws IOException

    参数:
    port - 端口。如果是值是0,则会自动分配一个端口号。
    backlog - 在连接队列中所允许的最大连接数目,可限制客户端数目。
    bindAddr - 本地地址,会被服务器绑定。

    重要方法:

    public Socket accept() throws IOException

    解释:这个方法会监听一个向它发来的连接,然后会接受这个连接。这个方法会被阻塞,直到连接产生。并且返回一个客户端的Socket对象实例。该Socket对象绑定了客户程序的IP地址或端口号。

    如何通信:

    客户端工作过程步骤:

    1. 创建Socket(主要是设置远程地址和端口等信息)
    2. 打开连接到Socket的输入/出流
    3. 按照一定的协议对Socket进行读/写操作
    4. 关闭Socket

    服务器工作过程步骤:

    1. 创建ServerSocket(主要是设置本地地址和端口等信息)
    2. 接受连接,获取Socket(调用accept方法,已绑定了客户端的地址和端口,无需设置)
    3. 打开连接到Socket的输入/出流
    4. 按照一定的协议对Socket进行读/写操作
    5. 关闭ServerSocket和Socket

    一个简单例子(没怎么考虑异常)

    客户端代码:

    View Code
     1 import java.io.BufferedReader;
     2 import java.io.IOException;
     3 import java.io.InputStreamReader;
     4 import java.io.PrintWriter;
     5 import java.net.Socket;
     6 import java.net.UnknownHostException;
     7 
     8 public class Client {
     9     public static void main(String[] args) {
    10         Socket client = null;
    11         BufferedReader remoteRead = null;
    12         PrintWriter remoteWriter = null;
    13         BufferedReader reader = null;
    14         try {
    15             client = new Socket((String) null, 10000);// 远程地址参数值为null,则对应回环地址
    16             remoteRead = new BufferedReader(new InputStreamReader(
    17                     client.getInputStream()));
    18             remoteWriter = new PrintWriter(client.getOutputStream(), true);
    19             reader = new BufferedReader(new InputStreamReader(System.in));
    20             System.out.println("client:在控制台输入信息");
    21             String writeMsg = reader.readLine();// 读取控制台输入的信息
    22             remoteWriter.println(writeMsg);// 向远程服务器传送信息
    23             System.out.println("client:已向服务器发送信息-----" + writeMsg);
    24             String readMsg = remoteRead.readLine();// 向远程服务器读取响应信息
    25             System.out.println("client:从服务器获得信息为-----" + readMsg);
    26 
    27             reader.close();
    28             remoteRead.close();
    29             remoteWriter.close();
    30             client.close();
    31             System.out.println("client:关闭");
    32         } catch (UnknownHostException e) {
    33             e.printStackTrace();
    34         } catch (IOException e) {
    35             e.printStackTrace();
    36         }
    37     }
    38 
    39 }

    服务器代码:

    View Code
     1 import java.io.BufferedReader;
     2 import java.io.IOException;
     3 import java.io.InputStreamReader;
     4 import java.io.PrintWriter;
     5 import java.net.ServerSocket;
     6 import java.net.Socket;
     7 
     8 public class Server {
     9 
    10     public static void main(String[] args) {
    11         ServerSocket server = null;
    12         Socket client = null;
    13         BufferedReader remoteRead = null;
    14         PrintWriter remoteWriter = null;
    15         try {
    16             server = new ServerSocket(10000);
    17             System.out.println("server:等待连接");
    18             client = server.accept();// 会阻塞,直到有连接
    19             remoteRead = new BufferedReader(new InputStreamReader(
    20                     client.getInputStream()));
    21             remoteWriter = new PrintWriter(client.getOutputStream(), true);
    22             String readMsg = remoteRead.readLine();// 读取客户端的信息
    23             System.out.println("server:客户端传送来的信息---" + readMsg);
    24             remoteWriter.println("已收到");
    25 
    26             remoteRead.close();
    27             remoteWriter.close();
    28             client.close();
    29             server.close();
    30             System.out.println("server:关闭");
    31         } catch (IOException e) {
    32             e.printStackTrace();
    33         }
    34 
    35     }
    36 
    37 }


  • 相关阅读:
    广域网详解
    无线AP和无线路由器区别
    TRUNK的作用功能.什么是TRUNK
    name after, name for, name as
    让你的情商爆棚吧!
    综合布线系统之7个子系统构成
    网桥和交换机的工作原理及区别
    边界网关协议BGP
    OSPF协议详解
    路由信息协议(RIP)的防环机制
  • 原文地址:https://www.cnblogs.com/dann/p/2743092.html
Copyright © 2011-2022 走看看