Java之TCP服务——Socket/ServerSocket

说明

  java中TCP与UDP不同,UDP的DatagramSocket类既可以接收也可以发送,而TCP传输分为客户端Socket类和服务端ServerSocket类。
  不了解UDP的朋友请参考这篇文章

Socket

  1. Socket类实现客户端套接字。 套接字是两台机器间通信的端点。
  2. Tcp传输,客户端建立的过程。
    (1)创建tcp客户端socket服务。使用的是Socket对象。建议该对象一创建就明确目的地。要连接的主机。
    (2)如果连接建立成功,说明数据传输通道已建立。该通道就是socket流 ,是底层建立好的。 既然是流,说明这里既有输入又有输出。想要输入或者输出流对象,可以找Socket来获取。可以通过getOutputStream()和getInputStream()来获取两个字节流。
    (3)使用输出流,将数据写出。
    (4)关闭资源。

客户端测试程序

public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getByName("192.168.0.106"),10000);
        OutputStream outputStream = socket.getOutputStream();
        //发送数据给服务端,后面加\r\n是给服务端的readLine方法一个结束标记,否则会出现程序阻塞
        outputStream.write("测试数据\r\n".getBytes());
        
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        String s = bufferedReader.readLine();
        System.out.println(s);
        socket.close();
    }

  1. 建立tcp服务端的思路:
    (1)创建服务端socket服务。通过ServerSocket对象。
    (2)服务端必须对外提供一个端口,否则客户端无法连接。
    (3)获取连接过来的客户端对象。
    (4)通过客户端对象获取socket流读取客户端发来的数据
    并打印在控制台上。
    (5)关闭资源。关客户端,关服务端。

服务端测试程序

  public static void main(String[] args) throws IOException {
  		//服务端在监听一个号为10000的端口
        ServerSocket serverSocket = new ServerSocket(10000);
        //阻塞式方法,用于接收客户端发来的Socket对象
        Socket accept = serverSocket.accept();
        //服务端本身没有流,流是从客户端获取的(拿着客户端的Socket获取流)
        BufferedReader bufferedReader = new BufferedReader(
        						new InputStreamReader(accept.getInputStream()));
        String s = bufferedReader.readLine();
        String ip = accept.getInetAddress().getHostName();
        System.out.println("ip:"+ip+s);
        
		//给客户端一个回执信息
        OutputStream outputStream = accept.getOutputStream();
        outputStream.write("你好客户端,我收到了\r\n".getBytes());
        serverSocket.close();
    }

构造方法说明
构造方法名称 说明
Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字,后期可通过connect方法进行指定连接。

其他重要提示

  一定要留意流中的阻塞式方法,如果使用不当就会导致程序挂起,如缓冲区没有刷新或给对方发送的数据没有结束标记等。因此java提供了两个方法用于告诉对方,本方已经结束的,你可以关闭进行下一步操作了。

方法名称 说明
shutdownInput() 此套接字的输入流置于“流的末尾”。
shutdownOutput() 禁用此套接字的输出流。

发布了51 篇原创文章 · 获赞 20 · 访问量 1555

猜你喜欢

转载自blog.csdn.net/qq_39711439/article/details/100898227