Java学习笔记【网络编程之TCP】

1.TCP客户端的操作步骤(client)

1.创建客户端的Socket对象

2.获取客户端所在的通道内字节输出流对象

3.写数据到通道的流中

4.释放资源

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

/**
 * @author Cipher
 * @date 2022/2/9 11:43
 */
public class TCPClient {
    public static void main(String[] args) throws IOException {

        ServerSocket ss = new ServerSocket(10086);
        System.out.println("服务器正在连接");

        //2)监听客户端连接
        //返回客户端对象
        Socket socket = ss.accept() ;
        System.out.println("客户端连接成功");

        //获取监听到的客户端的通道内输入流对象
        InputStream inputStream = socket.getInputStream();

        //一次读取一个字节数组
        byte[] bytes = new byte[1024];
        int len = inputStream.read(bytes) ;
        //展示数据
        String msg = new String(bytes,0,len) ;

        //获取ip
        String ip = socket.getInetAddress().getHostAddress() ;
        System.out.println("来自"+ip+",发送的content是"+msg);


        ss.close();
    }
}

2.TCP服务端的实现步骤(Server)

1.创建服务端的Socket对象

2.监听客户端连接

3.获取通道内的字节输入流

3.读取通道内的数据(客户端写过来的数据)

5.展示数据,释放资源

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
/**
 * @author Cipher
 * @date 2022/2/9 11:42
 */
public class TCPServer {
    public static void main(String[] args) throws IOException {

        Socket socket = new Socket("10.12.156.54",10086) ;

        //2)获取客户端所在的通道内字节输出流对象
        OutputStream outputStream = socket.getOutputStream() ;

        //写数据
        outputStream.write("你好!".getBytes());
        //释放资源
        socket.close();
    }
}

运行时:先开启服务端,再开启客户端

3.客户端发送消息,服务器读消息并给客户端反馈数据

客户端代码实现:

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

/**
 * @author Cipher
 * @date 2022/2/9 15:38
 * 客户端发送消息,服务器端读消息并给客户端反馈数据
 */
public class Client {
    public static void main(String[] args) throws IOException {

        //创建客户端的Socket
        Socket socket = new Socket("10.12.156.35",6666) ;

        //获取通道内的输出流对象
        OutputStream outputStream = socket.getOutputStream() ;

        //写数据
        outputStream.write("你好,服务器端套接字".getBytes());

        //获取通道内输入流对象,读取服务器端反馈的数据
        InputStream inputStream = socket.getInputStream();

        //一次读取一个字节数组
        byte[] bytes = new byte[1024] ;
        int length = inputStream.read(bytes) ;
        String info  = new String(bytes,0,length) ;
        System.out.println("反馈的数据是:"+info);

        //释放资源
        socket.close();

服务端代码实现:

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

/**
 * @author Cipher
 * @date 2022/2/9 15:37
 */
public class Server {
    public static void main(String[] args) throws IOException {

        //创建服务器的Socket对象
        ServerSocket ss = new ServerSocket(6666);

        System.out.println("服务器正在等待连接");
        //监听客户端
        Socket socket = ss.accept();
        //获取通道内输入流对象
        InputStream inputStream = socket.getInputStream();
        //一次读取一个字节数组
        byte[] bytes = new byte[1024] ;
        int len = inputStream.read(bytes);
        //获取ip
        String ip = socket.getInetAddress().getHostAddress() ;
        //获取数据
        String data = new String(bytes,0,len) ;
        //展示客户端发送的数据
        System.out.println("数据来自-->"+ip+",它的内容是-->"+data) ;

        //获取客户端所在的通道内的输出流对象
        OutputStream out = socket.getOutputStream();
        out.write("数据我已经收到了".getBytes());

        //服务器端关闭资源
        ss.close() ;
    }
}

4.TCP相关练习

1)客户端不断的发送数据,服务端不断地展示数据

客户端程序----->服务端模拟真实场景,不需要关闭!



public class ClientTest {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("10.12.156.35",2333);

        //创建键盘录入对象---->可以使用BufferedRead字符缓冲输入流 利用一次读取一行内容
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ; //读取录入的数据
        System.out.println("请您输入一个数据:");
        String line = null ;
        //获取通道内的字节输出流OutputStream
        //将通道的字节流--->封装字符缓冲输出流
        //BufferedWriter(Writer out)
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) ;
        while((line=br.readLine())!=null){
            //自定义结束条件
            if("886".equals(line)){
                break ;
            }
            bw.write(line) ; //将键盘录入的数据 写入到封装的通道内的bw流对象中
            bw.newLine();
            bw.flush();
        }
        //释放客户端资源
        socket.close();

    }
}

服务器端代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * @author Cipher
 * @date 2022/2/9 16:20
 */
public class ServerTest {
    public static void main(String[] args) throws IOException {

        //服务器端不断的接收数据,展示出来
        //创建服务器端的Socket
        ServerSocket ss = new ServerSocket(2333) ;

        //监听客户端
        Socket socket = ss.accept();

        //获取通道的内字节输入流
        //封装通道内的字节输入流---->字符缓冲输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
        String line = null ;
        while((line=br.readLine())!=null){
            //展示数据
            String ip = socket.getInetAddress().getHostAddress() ;
            System.out.println("data from--->"+ip+",消息内容是-->"+line);
        }
        //服务器端不关闭
    }
}

2)客户端读取一个当前项目下的文件,然后服务器端将文件内容展示在控制台上

客户端代码实现

import java.io.*;
import java.net.Socket;

/**
 * @author Cipher
 * @date 2022/2/9 17:42
 *  2)客户端读取一个当前项目下的文件,然后服务器端将文件内容展示在控制台上
 */
public class clientTest2 {
    public static void main(String[] args) throws IOException {

        //创建客户端Socket对象
        Socket socket = new Socket("10.12.156.35",5555);

        //使用字符缓冲输入流读取当前项目的文件
        //读文件
        BufferedReader br = new BufferedReader(new FileReader("User.txt"));

        //获取通过的字节输入流OutPutStream

        //封装通道内的字节流:字符缓冲输出流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) ;


        //读写复制
        String line = null;
        while((line = br.readLine())!=null){
            //写
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        //关闭资源
        br.close();
        socket.close();
    }
}

服务器端代码实现

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

/**
 * @author Cipher
 * @date 2022/2/9 17:43
 */
public class ServerTest2 {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(5555) ;


        Socket socket = ss.accept();

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        String line ;
        while((line = br.readLine())!= null){
            System.out.println(line);
        }
        ss.close();
        br.close();

    }
}

3)客户端读取一个当前项目下的文件,然后服务器端将文件复制到指定的文件中

客户端代码实现

import java.io.*;
import java.net.Socket;

/**
 * @author Cipher
 * @date 2022/2/9 19:13
 *  3)客户端读取一个当前项目下的文件,然后服务器端将文件复制到指定的文件中
 */
public class ClientTest3 {
    public static void main(String[] args) throws IOException {
        //创建客户端Socket对象
      Socket socket = new Socket("10.12.156.35",6666);

      //创建字符缓冲输入流,读
        BufferedReader br = new BufferedReader(new FileReader("user2.java")) ;
        //封装通道内的字节流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) ;

        //读写复制
        String line = null ;
        while((line = br.readLine()) != null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }


        // 客户端Socket提供 一个特有的方法:就是通知服务器端,没有流数据过去了!
        //public void shutdownOutput()throws IOException
        socket.shutdownOutput();



        //客户端读取服务器端的反馈
        //获取通道内的字节输入流
        InputStream inputStream = socket.getInputStream();

        //一次读取一个字节
        byte[] bytes = new byte[1024] ;
        int length = inputStream.read(bytes) ;
        String info = new String(bytes,0,length) ;
        System.out.println("客户端收到服务器端反馈的数据是:"+info);

        //释放资源
        br.close();
        socket.close();
    }
}

服务器端代码实现

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author Cipher
 * @date 2022/2/9 19:30
 * 服务器端将文件复制到指定的文件中
 */
public class ServerTest3 {
    public static void main(String[] args) throws IOException {
       //创建服务器端的Socket对象
        ServerSocket ss = new ServerSocket(6666);

        //监听客户端的连接
        Socket socket = ss.accept();

        //封装通道内的字节输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;

        //封装目的地文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("user.txt")) ;


        //读写复制
        String line = null ;
        while((line = br.readLine()) != null){

            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("文件复制完成".getBytes());
        outputStream.flush();

        //释放资源
        bw.close();
        ss.close();
    }
}

4)TCP客户端读取当前项目下的高圆圆.jpg—服务器端将它复制到指定的图片文件中

import java.io.*;
import java.net.Socket;

/**
 * @author Cipher
 * @date 2022/2/9 20:14
 * 1.TCP客户端读取当前项目下的高圆圆.jpg---服务器端将它复制到指定的图片文件中
 */
public class ClientTest4 {
    public static void main(String[] args) throws IOException {
        //客户端的套接字对象
        Socket socket = new Socket("10.12.156.35",9876) ;

        //创建字符缓冲输入流,读文件
       // BufferedReader br = new BufferedReader(new FileReader("高圆圆.jpg")) ;
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("高圆圆.jpg")) ;

        //创建字符缓冲输出流-->对通道内的字节输出流进行输出
       // BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) ;
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()) ;


        //上面已经把传输准备好了,开始读写赋值
        //一次读取一个字节数组
        byte[] bytes = new byte[1024] ;
        int len = 0 ;
        while((len=bis.read(bytes))!=-1) {
            bos.write(bytes, 0, len);

            //刷新
            bos.flush();
        }

        //判断是否还有流过来
        socket.shutdownOutput();


       //服务端对客户端进行反馈
        InputStream inputStream = socket.getInputStream() ;//套结字获取反馈过来的内容

        //读取
        byte[] bytes1 = new byte[1024] ;
        int length = inputStream.read(bytes1) ;
        String info = new String(bytes1,0,length) ;
        System.out.println(info);

        socket.close();
        bis.close();

    }
}

文本文件,能用字符流,就用字符流

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author Cipher
 * @date 2022/2/9 20:14
 */
public class ServerTest4 {
    public static void main(String[] args) throws IOException {

        ServerSocket ss = new ServerSocket(9876) ;

        //监听
        Socket socket = ss.accept();

        //封装通道内的字节输入流
       //BufferedReader br = new  BufferedReader(new InputStreamReader(socket.getInputStream())) ;
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());


        //封装目的地文件
        //BufferedWriter bw = new BufferedWriter(new FileWriter("杨桃.png")) ;
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("杨桃2.jpg")) ;
        //读写复制
        //一次读取一个字节数组
        byte[] bytes = new byte[1024] ;
        int len = 0  ;
        while((len = bis.read(bytes))!=-1) {
            //写入
            bos.write(bytes, 0, len);

            //强制刷新
            bos.flush();
        }


        //加入反馈
        //获取通道内的输出流
        OutputStream out = socket.getOutputStream() ;
        out.write("图片已经复制完毕".getBytes());
        //刷新
        out.flush();
        //释放资源
        bos.close();
        socket.close();

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cipher_Xing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值