TCP通信,保姆级详讲,含6个练习,看完就会

TCP通信协议

  • TCP是一种可靠的网络协议,它在通信的两端各建一个Socket对象,从而在通信的两端形成网络通信链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信
  • Java对基于TCP协议的网络提供了良好的封装,使用Socket对象代表两端的通信端口,并通过Socket产生的IO流进行网络通信
  • Java为客户端提供了Socket类,为服务端提供了SeveerSocket类

TCP发送数据

  • 创建客户端的Socket对象
  • 获取输出流写数据
  • 释放资源
//		创建Socket对象,这里第一个参数可以是主机IP地址的字符串,底层会帮我们自动处理,第二个参数还是端口号
	    Socket socket = new Socket("10.5.219.110",42789);

//     OutputStream  getOutputStream()通过此方法可以获取输出流写数据
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello,tcp,俺老孙来也".getBytes());
//		最后释放资源
        socket.close();

TCP接收数据

  • 创建服务器端的Socket对象(SeverSocket)
  • 获得输入流读数据,并把数据显示在控制台
  • 释放资源
//SeverSocket创建对象,参数为端口号
	    ServerSocket serverSocket = new ServerSocket(42789);
//因为SeverSocket类中没有getInputStream()方法,但是有返回倾听到此套接字的accept()方法
//监听客户端连接,返回Socket()对象
        Socket accept = serverSocket.accept();
//通过accept.getInputStream()方式可以获取输入流
        InputStream inputStream = accept.getInputStream();
        byte[] bytes = new byte[1024];
        int len=inputStream.read(bytes);
        System.out.println("接受的数据是 :"+new String(bytes,0,len));

TCP通信程序练习

练习一

  • 客户端:发送数据,接收服务器反馈
  • 服务端:接收数据,给出反馈
客户端
  • 先写后接受反馈
        Socket socket = new Socket("10.5.219.110",42789);
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello啊,TCP,俺老孙现在来找你啦!".getBytes());
        //接收服务器反馈
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        System.out.println("客户端 :"+new String(bytes,0,inputStream.read(bytes)));
        socket.close();
服务器端
  • 先接受数据,后给出反馈
        ServerSocket serverSocket = new ServerSocket(42789);
        Socket accept = serverSocket.accept();
        InputStream inputStream = accept.getInputStream();
        byte[] bytes = new byte[1024];
        int len=inputStream.read(bytes);
        System.out.println("服务器 :"+new String(bytes,0,len));

        //给出反馈
        OutputStream outputStream = accept.getOutputStream();
        outputStream.write("数据已收到".getBytes());

练习二

  • 客户端数据来源于键盘录入
客户端
public class InetAddressDemo {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("10.5.219.110",42789);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        //封装输出流对象
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        String line;
        while((line=bufferedReader.readLine())!=null){
            if("886".equals(line)){
                break;
            }

            bufferedWriter.write(line);
            bufferedWriter.newLine();
            bufferedWriter.flush();
        }
        socket.close();
    }
}
接收端
public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(42789);
        Socket accept = serverSocket.accept();
        BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream()));
        String line;
        while ((line=br.readLine())!=null){
            System.out.println(line);
        }
        serverSocket.close();
    }
}

练习三

  • 客户端:数据来自于键盘录入,知道输入的数据是886,发送数据结束
  • 服务器端:接收到的数据写入文本文件
客户端
//客户端源码和练习二的一摸一样,这里不重复写
接收端
public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(42789);
        Socket s = ss.accept();
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java.code\\File\\Cx_330.txt"));
        String line;
        while ((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
            bw.close();
            ss.close();
    }
}

练习四

  • 客户端:数据来自于文本文件
  • 服务器端:接收到的数据写入文本文件
客户端
        Socket ss = new Socket("10.5.219.110",42789);
        BufferedReader br = new BufferedReader(new FileReader("D:\\java.code\\File\\Cx_330.txt"));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(ss.getOutputStream()));
        String line;
        while ((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        ss.close();
        br.close();
服务器端
//这里的服务器端和练习三的一摸一样,这里不再重复

练习五

  • 客户端:数据来自于文本文件,接收服务器反馈
  • 服务器端:收到的数据写入文本文件,给出反馈
客户端
        Socket ss = new Socket("10.5.219.110",42789);
        BufferedReader br = new BufferedReader(new FileReader("D:\\java.code\\File\\Cx_330.txt"));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(ss.getOutputStream()));
        String line;
        while ((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //给出信息结束标志
        ss.shutdownOutput();
        //接受反馈
        BufferedReader bfr = new BufferedReader(new InputStreamReader(ss.getInputStream()));
        System.out.println("客户端 :"+bfr.readLine());
        ss.close();
        br.close();
服务器端
  ServerSocket ss = new ServerSocket(42789);
        Socket s = ss.accept();
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java.code\\File\\Cx.txt"));
        String line;
        while ((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //给出反馈
        BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bfw.write("数据上传成功");
        bfw.newLine();
        bfw.flush();

        bw.close();
        ss.close();

练习六

  • 客户端:数据来自文本文件,接收服务器反馈
  • 服务器端:收到的数据写入文本文件,给出反馈,代码用线程进行封装,为每一个客户端开启一个线程
客户端
//代码同练习五,这里不再重复代码
服务器端
public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(42789);
        while (true){
            Socket s = ss.accept();
            new Thread(new ServerThread(s)).start();
        }
    }
}
线程类
public class ServerThread implements Runnable {
    private Socket s;

    public ServerThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {

        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            int count=0;
            File file = new File("D:\\java.code\\File\\Cx[" + count + "].txt");
            while (file.exists()) {
                count++;
                file = new File("D:\\java.code\\File\\Cx[" + count + "].txt");
            }

            BufferedWriter bw = new BufferedWriter(new FileWriter(file));

            String line;
            while ((line = br.readLine()) != null){
                bw.write(line);
                bw.newLine();
                bw.flush();
            }
            BufferedWriter bfw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            bfw.write("数据上传成功");
            bfw.newLine();
            bfw.flush();
            s.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_x_330

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值