TCP协议分为客户端和服务端

  • 客户端
    • 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
    • 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
    • 输入流可以读取服务端输出流写出的数据
    • 输出流可以写出数据到服务端的输入流
  • 2.服务端
    • 创建ServerSocket(需要指定端口号)
    • 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
    • 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
    • 输入流可以读取客户端输出流写出的数据
    • 输出流可以写出数据到客户端的输入流

      基本演示

      ```java package cn.giteasy.tcp;

import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;

/* 服务端

  • 创建ServerSocket(需要指定端口号)
  • 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
  • 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
  • 输入流可以读取客户端输出流写出的数据
  • 输出流可以写出数据到客户端的输入流 */ public class Demo01Server {
  1. public static void main(String[] args) throws IOException {
  2. ServerSocket server = new ServerSocket(8888);
  3. Socket socket = server.accept(); //接受客户端的请求
  4. InputStream is = socket.getInputStream(); //获取客户端输入流
  5. OutputStream os = socket.getOutputStream(); //获取客户端的输出流
  6. os.write("百度一下你就知道".getBytes()); //服务器向客户端写出数据
  7. byte[] arr = new byte[1024];
  8. int len = is.read(arr); //读取客户端发过来的数据
  9. System.out.println(new String(arr,0,len)); //将数据转换成字符串并打印
  10. socket.close();
  11. }

}

```java
package cn.giteasy.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 客户端
 *  创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
 *  调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
 *  输入流可以读取服务端输出流写出的数据
 *  输出流可以写出数据到服务端的输入流
 */
public class Demo01Client {


    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket = new Socket("localhost", 8888);

        InputStream is = socket.getInputStream();            //获取客户端输入流
        OutputStream os = socket.getOutputStream();            //获取客户端的输出流

        byte[] arr = new byte[1024];
        int len = is.read(arr);                                //读取服务器发过来的数据
        System.out.println(new String(arr,0,len));           //将数据转换成字符串并打印

        os.write("hello world!".getBytes());                    //客户端向服务器写数据

        socket.close();
    }

}

TCP协议直接发送和接收字符串

package cn.giteasy.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务端
 * 每次可以读取一行
 * 每次可以直接写出字符串
 */
public class Demo02Server {


    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8888);

        //接受客户端的请求
        Socket socket = server.accept();

        //将字节流包装成了字符流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //PrintStream中有写出换行的方法
        PrintStream ps = new PrintStream(socket.getOutputStream());

        ps.println("你要听什么歌曲?");
        //readLine是以\r\n为结束标记,如果读不到\r\n会一直读,卡在这里
        System.out.println(br.readLine());
        ps.println("谁唱的?");
        System.out.println(br.readLine());
        socket.close();
    }
}
package cn.giteasy.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 *  客户端
 *
 *  将字节流包装成了字符流
 *  每次可以读取一行数据,并且可以直接写出字符串
 *
 */
public class Demo02Client {


    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket = new Socket("localhost", 8888);
        //将字节流包装成了字符流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //PrintStream中有写出换行的方法
        PrintStream ps = new PrintStream(socket.getOutputStream());

        System.out.println(br.readLine());
        //写出时,println()自带\r\n
        ps.println("青花瓷");
        System.out.println(br.readLine());
        ps.println("周杰伦");

        socket.close();
    }

}

多线程服务端

package cn.giteasy.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务端
 *  多线程服务端
 */
public class Demo02ServerThread {


    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8888);

        while(true) {
            final Socket socket = server.accept();
            //可使用线程池
            new Thread() {
                @Override
                public void run() {
                    try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        PrintStream ps = new PrintStream(socket.getOutputStream());

                        ps.println("你要听什么歌曲?");
                        System.out.println(br.readLine());
                        ps.println("谁唱的?");
                        System.out.println(br.readLine());
                        socket.close();
                    } catch (IOException e) {

                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }

}