模拟TCP传输的客户端和服务端

一、创建TCP传输的客户端

1、建立TCP客户端的Socket服务,使用的是Socket对象,建议该对象一创建就明确目的地,即要连接的主机; 
2、如果连接建立成功,说明数据传输通道已建立,该通道就是Socket流,是底层建立好的,既然是流,说着这里既有输入流,又有输出流,想要输入流或者输出流对象,可以通过Socket来获取,可以通过getOutputStream()和getInputStream()来获取; 
3、使用输出流,将数据写出; 
4、关闭Socket服务。

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

public class Client {
    public static void main(String[] args) throws IOException {

        // 1、创建客户端的Socket服务
        Socket socket = new Socket("192.168.1.100", 10002);

        // 2、获取Socket流中输入流
        OutputStream out = socket.getOutputStream();

        // 3、使用输出流将指定的数据写出去
        out.write("TCP is coming !".getBytes());

        // 4、关闭Socket服务
        socket.close();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

二、创建TCP传输的服务端

1、建立TCP服务端的的Socket服务,通过ServerSocket对象; 
2、服务端必须对外提供一个端口,否则客户端无法连接; 
3、获取连接过来的客户端对象; 
4、通过客户端对象来获取Socket流,读取客户端发来的数据; 
5、关闭资源,关客户端,关服务端。

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

public class Server {
    public static void main(String[] args) throws IOException {

        // 1、创建客户端对象
        ServerSocket ss = new ServerSocket(10002);

        // 2、获取连接过来的客户端对象
        Socket s = ss.accept();

        String ip = s.getInetAddress().getHostAddress();

        // 3、通过Socket对象获取输入流,读取客户端发来的数据
        InputStream in = s.getInputStream();

        byte[] buf = new byte[1024];

        int len = in.read(buf);
        String text = new String(buf, 0, len);
        System.out.println(ip + ":" + text);

    // 4、关闭资源
        s.close();
        ss.close();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

三、优化TCP传输的客户端和服务端

在本部分,我们对前两部分的内容进行优化,实现TCP传输模式下的客户端和服务端的交互功能。

/**
*优化TCP传输的客户端
*/
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ClientUpdate {
    public static void main(String[] args) throws IOException {

        Socket socket = new Socket("192.168.1.100", 10002);

        OutputStream out = socket.getOutputStream();

        out.write("tcp!".getBytes());

        // 读取服务端返回的数据,使用Socket读取流
        InputStream in = socket.getInputStream();
        byte[] buf = new byte[1024];

        int len = in.read(buf);

        String text = new String(buf, 0, len);

        System.out.println(text);

        socket.close();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
/**
*优化TCP传输的服务端
*/
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerUpdate {
    public static void main(String[] args) throws IOException {

        // 1、创建服务端对象
        ServerSocket ss = new ServerSocket(10002);

        // 2、获取连接过来的客户端对象
        Socket s = ss.accept();  //accept方式为阻塞式方法

        String ip = s.getInetAddress().getHostAddress();

        // 3、通过Socket对象获取输入流,要读取客户端发来的数据
        InputStream in = s.getInputStream();

        byte[] buf = new byte[1024];

        int len = in.read(buf);
        String text = new String(buf, 0, len);
        System.out.println(ip + ":" + text);

        // 使用客户端的Socket对象的输出流给客户端返回数据
        OutputStream out = s.getOutputStream();
        out.write("收到".getBytes());

        s.close();
        ss.close();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

四、创建英文大写转换服务器

应用TCP(Transmission Control Protocol,传输控制协议)的相关性质,创建一个基于TCP传输下的英文大写转换服务器,要求:客户端输入字母数据,发送给服务端;服务端收到数据后显示在控制台,并将该数据转成大写字母返回给客户端;直到客户端输入“over”为止,转换结束。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class TransClient {
    public static void main(String[] args) throws IOException {
        /**
         * 思路:创建客户端
         * 1、创建Socket客户端对象
         * 2、获取键盘录入的数据
         * 3、将录入的信息发送给Socket输出流
         * 4、读取服务端的数据并返回的大写数据
         */

        // 1、创建Socket客户端对象
        Socket s = new Socket("192.168.1.100", 10004);

        // 2、获取键盘录入
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

        // 3、Socket输出流
        PrintWriter out = new PrintWriter(s.getOutputStream(), true);

        // 4、Socket输入流,读取服务端的数据并返回的大写数据
        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

        String line = null;

        while ((line = bufr.readLine()) != null) {

            if ("over".equals(line))
                break;
            out.println(line);

            // 读取服务端返回的一行大写数据
            String upperStr = bufIn.readLine();
            System.out.println(upperStr);
        }
        s.close();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TransServer {
    public static void main(String[] args) throws IOException {
        /**
         * 思路:创建服务端
         * 1、创建SeverSocket客户端对象
         * 2、获取Socket流
         * 3、通过Socket,  读取客户端发过来的需要转换的数据
         * 4、显示在控制台上
         * 5、将数据转换成大写返回给客户端
         */

        // 1、创建SeverSocket对象
        ServerSocket ss = new ServerSocket(10004);

        // 2、获取Socket对象
        Socket s = ss.accept();

        // 获取IP地址
        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip + "......connected");

        // 3、获取Socket读取流,并装饰
        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

        // 4、获取Socket的输出流,并装饰
        PrintWriter out = new PrintWriter(s.getOutputStream(), true);

        String line = null;
        while ((line = bufIn.readLine()) != null) {
            System.out.println(line);
            out.println(line.toUpperCase());
        }

        s.close();
        ss.close();
    }
}

你可能感兴趣的:(java,socket)