Java基础—socket--TCP-客户端服务器模式

时间:2023-02-16 20:02:46

1、先看下API:

涉及到的类:Socket 、ServerSocket 、InetSocketAddress

Socket 类

java.lang.Object
   java.net.Socket 
直接已知子类: SSLSocket
public class Socket extends Object
 

此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。


ServerSocket 类

java.lang.Object
  java.net.ServerSocket
直接已知子类: SSLServerSocket
public class ServerSocket extends Object
 

此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。


  InetSocketAddress 类

java.lang.Object
  java.net.SocketAddress 
    java.net.InetSocketAddress
所有已实现的接口: Serializable
public class InetSocketAddress extends SocketAddress
 

此类实现 IP 套接字地址(IP 地址 + 端口号)。它还可以是一个对(主机名 + 端口号),在此情况下,将尝试解析主机名。如果解析失败,则该地址将被视为未解析 地址,但是其在某些情形下仍然可以使用,比如通过代理连接。

它提供不可变对象,供套接字用于绑定、连接或用作返回值。


2、需求1:实现一个TCP Client,向服务器发送文本数据

TCPDemo.java---创建Socket服务

package com.Train;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.io.OutputStream;

import org.omg.CORBA.portable.OutputStream;

//TCP--------面向连接
/**客户端-服务器模式
 * 1、连接 
 * 2、发送数据
 * 3、断开连接
 * */

//需求1:程序实现客户端,给服务器发送文本数据

public class TCPDemo {

    public static void main(String[] args) throws Exception { 
        /**方法一:创建客户端的Socket服务--  一创建Socket就连接目地服务器
         * Socket sok = new Socket(InetAddress.getByName("192.168.1.150"), 2000);
         * */
        /**方法二:==分步
         * 1、创建客户端的Socket服务
         * 2、连接目地服务器
         * 3、获取通路中的输出流,写送数据
         * 4、关闭Socket服务
         * */
         Socket sok = new Socket(); 
         
         sok.connect(new InetSocketAddress(InetAddress.getByName("192.168.1.150"), 2000)); //连接服务器
         
             //通路一建立,流就有了
             //为了发送数据,要获取Socket流中的输出流
            OutputStream outS = sok.getOutputStream();
          outS.write("this is data".getBytes());
         
          sok.close();
    } 
}

服务器: 接收数据并显示

Java基础—socket--TCP-客户端服务器模式

3、需求2:实现一个TCP Server,接收客户端的数据并打印,把接收到的数据发送回去

TCPDemo.java

package com.Train;
 
import java.net.ServerSocket;
import java.net.Socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
 

//TCP--------面向连接
/**客户端-服务器模式
 * 1、连接 
 * 2、发送数据
 * 3、断开连接
 * */

//需求2:程序实现服务器 ,TCP server,监听连接,连接,通过流读取数据,发送数据


public class TCPDemo {

    public static void main(String[] args) throws Exception { 
        
        /**ServerSocket服务=======================
         * */
        //1、建立服务
         ServerSocket svSok = new ServerSocket(9000);
         
         //2、阻塞监听,并负责接受连接-------------返回值:Socket
         Socket sok = svSok.accept();   
         
         //3、已连接,获取对方ip及端口,获取通道的流管道读取数据,发送数据
         // 3.1 得到客户端的流,使用输入流进行读取  ------> new BufferedReader(new InputStreamReader(sok.getInputStream())).readline()
         //         读取数据
         // 3.2 将读取到的数据原文发送回去
         System.out.println("【Receive from "+sok.getInetAddress().getHostAddress()+": "+sok.getPort()+"】");
          
         BufferedReader brReader = new BufferedReader(new InputStreamReader(sok.getInputStream()));
         String recvStrs = brReader.readLine(); //阻塞读--|-->
         System.out.println(recvStrs);
          
         //BufferedWriter brWriter = new BufferedWriter(new OutputStreamWriter(sok.getOutputStream()));
         //brWriter.write("received");
         OutputStream outS = sok.getOutputStream();
         outS.write(recvStrs.getBytes());
    } 
}

<console>TCP Server:

Java基础—socket--TCP-客户端服务器模式

TCP Client:

Java基础—socket--TCP-客户端服务器模式