Java TCP 编程


接上一篇的内容,下面是TCP编程的步骤:
TCP

TCP分为客户端和服务端,其中:

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

客户端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) throws InterruptedException {
        new TCPClient().start();
    }

}

class TCPClient extends Thread {
    @Override
    public void run() {
        Socket client = null;
        BufferedReader read = null;
        PrintStream write = null;
        Scanner sc = new Scanner(System.in);

        try {
            // 客户端指向服务器的ip和端口,TCP连接必须准确
            client = new Socket("127.0.0.1", 2332);
            // 获得输入流并转成字符处理流,方便读取服务端返回的整行数据
            read = new BufferedReader(new InputStreamReader(client.getInputStream()));
            // 获得输出流并转成打印流,方便向服务端发送的整行数据
            write = new PrintStream(client.getOutputStream());

            // 从标准输入流读取一行字符发送到服务端,当输入内容为quit时结束
            while (true) {
                String line = sc.nextLine();
                if (!line.equals("quit")) {
                    // 向服务器发送数据
                    write.println(line);
                    System.out.println("[Client] 正在发送:" + line);
                    // read.readLine()方法读取从服务器返回的一行数据
                    System.out.println("[Client] 发送成功:" + read.readLine());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {            // 关闭相关的流
            try {
                sc.close();
                read.close();
                write.close();
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

服务端

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 Server {

    public static void main(String[] args) throws IOException {
        // 使用ServerSocket类绑定一个端口,客户端应和它一样
        ServerSocket serverSocket = new ServerSocket(2332);
        // 服务端应该是多线程的
        while (true) {
            // 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
            Socket server = serverSocket.accept();
            // 开始
            new TCPServer(server).start();
        }
    }

}

class TCPServer extends Thread {
    private Socket mServer;

    TCPServer(Socket server) {
        mServer = server;
    }

    @Override
    public void run() {
        try {
            // 获得和客户端相连的输入输出IO流
            BufferedReader read = new BufferedReader(new InputStreamReader(mServer.getInputStream()));
            PrintStream write = new PrintStream(mServer.getOutputStream());
            // 读取从客户端发来的一行字符串
            String line = read.readLine();
            if (line.equals("quit")) {
                mServer.close();
            }

            System.out.println("[Server] 现在收到:" + line);
            // 向客户端发送一行字符串
            write.println(line + "已被Server收到");
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果:
Client

Server



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值