zoukankan      html  css  js  c++  java
  • JAVA学习之TCP网络编程篇,Socket使用

     

    ServerSocket 此类实现服务器套接字。 ServerSocket常用的构造方法有以下几个,

    ServerSocket()
    创建非绑定服务器套接字。

    ServerSocket(int port)
    创建绑定到特定端口的服务器套接字。

    ServerSocket(int port, int backlog)
    利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。

    ServerSocket(int port, int backlog, InetAddress bindAddr)
    使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。

    Socket 此类实现客户端套接字(也可以就叫“套接字”)。Socket类常用的构造方法有以下几个
    Socket()
    通过系统默认类型的 SocketImpl 创建未连接套接字

    Socket(InetAddress address, int port)
    创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

    Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
    创建一个套接字并将其连接到指定远程地址上的指定远程端口。

    Socket(Proxy proxy)
    创建一个未连接的套接字并指定代理类型(如果有),该代理不管其他设置如何都应被使用。

    Socket(SocketImpl impl)
    使用用户指定的 SocketImpl 创建一个未连接 Socket。

    Socket(String host, int port)
    创建一个流套接字并将其连接到指定主机上的指定端口号。

    Socket(String host, int port, InetAddress localAddr, int localPort)
    创建一个套接字并将其连接到指定远程主机上的指定远程端口。

    这两个类常用到的方法有
    getInputStream()
    返回InputStream此套接字的输入流。
    getOutputStream()
    返回OutputStream此套接字的输出流。

    JAVA 中利用TCP协议进行通信的应用程序是有主次之分的,一个称为服务端,一个称为客户端,两者的功能编写方法不大一样,
    其中的服务端用的是ServerSocket和Socket类,而客户端用的是Socket。
    它们之间交互的过程大致如下:
    1、服务端程序先创建一个ServerSocket,然后调用该类的accept()方法,侦听并接受到此套接字的连接。
    2、客户端程序创建一个Socket,请求与服务端建立连接。
    3、服务端接收到客户端的连接请求,accept()方法就会返回一个Socket对象,并从中取得客户端发来的数据。

    使用时服务端ServerSocket的accept()方法如果侦听到数据来的时候,返回的Socket对象是与请求连接的客户端的
    Socket相连的,其中服务端Socket对象得到的OutputStream对象是客户端Socket对象的InputStream对象,而
    服务端Socket对象得到的InputStream对象是客户端Socket对象的OutputStream对象,其中的输入输出流对象,是相对
    而说的。就好像打电话一样,你的听筒里面听到的内容,是别人话筒里面说出来的话,而你在话筒里面说话时,
    别人则是在他的听筒里听到你说话的内容的。
    与UDP协议不同,TCP协议是一种可靠的连接协议,TCP可以保证数据从一端送到另一端的时候,能够保证数据的正确性
    而且接收到的数据和发送出来的数据的顺序是一样的。而UDP协议发送的数据则有可以丢失,或者顺序不一定按发出
    时的顺序一样。TCP协议适合那些可靠性要求比较高的场合。应该看使用场合来决定使用TCP还是UDP

    TCP网络编程如果不涉及太多其它业务的话,单只是来回服务端和客户端的数据来回,其实还是挺简单的。
    这里是简单的示例代码,其中一个是客户端的,一个是服务端的程序的代码

    //首先是服务端的
    
    import java.io.*;
    import java.net.*;
    public class Server {
    public static void main(String[] args) throws Exception {
    // 创建绑定到特定端口10000的服务器套接字。
    ServerSocket serverSocket = new ServerSocket(10000);
    System.out.println("Server is open");
    // 侦听并接受对应此套接字的客户端连接。
    Socket socket = serverSocket.accept();
    // 取得输入流对象
    InputStream in = socket.getInputStream();
    byte[] buf = new byte[1024];
    int len = in.read(buf);
    String inData = new String(buf, 0, len);
    String ip = socket.getInetAddress().getHostAddress();
    System.out.println("Client data is:" + inData + " and ip is:" + ip);
    // 取得一个输出流对象
    OutputStream out = socket.getOutputStream();
    // 把信息写到输出流
    out.write("Hi Client I had got you message yeah!".getBytes());
    // 关闭对象
     socket.close();
    serverSocket.close();
    }
    }
    //其次这个是客户端的代码
    
    import java.io.*;
    import java.net.*;
    public class Client {
    public static void main(String[] args) throws Exception {
    // 创建一个流套接字并将其连接到127.0.0.1的指定端口号10000上。
    Socket socket = new Socket("127.0.0.1", 10000);
    // 取得一个输出流
    OutputStream out = socket.getOutputStream();
    // 把数据写入输出流就可以了,不用显式的数据发送方法的,因为一旦连接上了服务端之后
    // 在Socket没有关闭之前,连接都是有效的,并且数据可以在服务端的InputStream取到
    out.write("Hi Server,this is Client.How are you.".getBytes());
    // 取得一个输入流,用以取到服务端发过来的信息
    InputStream in = socket.getInputStream();
    byte[] buf = new byte[1024];
    int len = in.read(buf);
    String inData = new String(buf, 0, len);
    System.out.println("the Server back message is: " + inData);
    socket.close();
    }
    }

    以上的代码都可以直接使用,可以看到,如果只是单纯连接服务端和客户端的话,涉及到的类和方法并不是很多,而且比UDP时更简单,只是输入输出流的地方有点不好理解,不过多写几次就好了。

  • 相关阅读:
    java正则表达式(九)
    java正则表达式(八)
    java正则表达式(十)
    正确理解ThreadLocal
    Class.getResource与ClassLoader.getResource()区别
    seajs中define方法的id和dependencies参数
    seajs研究一二三
    十八年开发经验分享(三)问题解决篇(中)
    EntityModelStudio系列教程4静态建模进阶
    EntityModelStudio系列教程6EMLib框架之Orm
  • 原文地址:https://www.cnblogs.com/fylx/p/3959461.html
Copyright © 2011-2022 走看看