Java26 TCP在Java中的实现

Socket 客户端 IO技术
ServerSocket 服务端 IO技术
可以使用转换流
TCP客户端建立
1 建立TCP服务
2 因为是面向连接 就必须有连接才能进行通讯
在创建客户端时,就必须明确目的地址和端口
3 一但连接建立 就有了传输数据的通道 就可以通道中进行数据传输
这个传输其实就是通过流实现的 需要io流
4关闭资源

public class TCP_test1 {
    public static void main(String[] args) throws IOException {
//        创建客户端对象 明确服务端地址和端口
        System.out.println("TCP客户端1启动");
        Socket s=new Socket("192.168.1.6",10003);
//        获取socket流中的输出流 将数据发送到服务端
      OutputStream os=s.getOutputStream();
//      通过输出流写数据
      os.write("TCP客户端1正在传输".getBytes());
//      接收来自服务端的数据
      InputStream is=s.getInputStream();
        byte[] bufin=new byte[1024];
        int len=is.read(bufin);
        String s1=new String(bufin,0,len);
        System.out.println(s1);
//      关闭资源
        s.close();

    }
}

TCP服务端建立

public class TCP_test1server {
    public static void main(String[] args) throws IOException {
//       创建socket服务端服务
        System.out.println("TCP服务端1已启动");
//        明确接收端端口
        ServerSocket ss=new ServerSocket(10003);
//        获取客户端
      Socket s= ss.accept();
//      调用客户端方法
      String ip= s.getInetAddress().getHostAddress();
        System.out.println(ip+"已接入");

//      通过客户端对象获取socket流的读取流
        InputStream is=s.getInputStream();
        byte[] bufin=new byte[1024];
        int len=is.read(bufin);
        String s1=new String(bufin,0,len);
        System.out.println(s1);
        OutputStream os=s.getOutputStream();
//      通过输出流写数据
        os.write("TCP服务端1进行反馈".getBytes());

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

    }
}

TCP客户端向服务端上传文本
IO流读取文本
再调用socket方法进行上传

public class TCP_test2 {
    public static void main(String[] args) throws IOException {
        System.out.println("TCP客户端2已启动");
//        创建客户端服务 明确服务端地址 和 端口
        Socket s=new Socket("192.168.1.6",10004);
//        源文件 文本
        File file=new File("D:\\IO\\TEST.txt");
      BufferedReader bufr=new BufferedReader(new FileReader(file));
//        通过socket客户端调用输出流
//      BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//       一定要自动刷新 否则资源还在本地
        PrintWriter out=new PrintWriter(s.getOutputStream(),true);
//       频繁读写
        String line=null;
        while ((line=bufr.readLine())!=null){
            out.println(line);}
        s.shutdownOutput();
        //      接收来自服务端的数据
        InputStream is=s.getInputStream();
        byte[] bufin=new byte[1024];
        int len=is.read(bufin);
        String s1=new String(bufin,0,len);
        System.out.println(s1);

        bufr.close();
        s.close();
    }
}

TCP服务端接收文本
调用socket方法进行接收
IO流将文本写入本地

public class TCP_test2server {
    public static void main(String[] args) throws IOException {
        System.out.println("TCP2服务端已启动");
//        创建TCP2服务端
        ServerSocket ss=new ServerSocket(10004);
//        接收套接字
       Socket s= ss.accept();
//       获取IP
       String ip=s.getInetAddress().getHostAddress();
//      源 来自网络
        BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
//        目的文本
     BufferedWriter bw=  new BufferedWriter(new FileWriter("D:\\IO\\net.server\\"+ip+" TEST.txt"));
//       频繁读写
        String line=null;
        while ((line=br.readLine())!=null)
        {
            bw.write(line);
            bw.newLine();
        }
        OutputStream os=s.getOutputStream();
//      通过输出流写数据
        os.write("TCP客户端2上传成功".getBytes());
        bw.close();
        s.close();
        ss.close();
    }
}

并发上传图片
客户端

public class TCP_test3 {
    public static void main(String[] args) throws IOException {
        System.out.println("TCP客户端3已启动");
        Socket s=new Socket("192.168.1.6",10005);
         BufferedInputStream bi=new BufferedInputStream(new FileInputStream("D:\\IO\\test.png"));
        OutputStream os=s.getOutputStream();
        byte[] bytes=new byte[1024];
        int len=0;
        while ( (len=bi.read(bytes))!=-1)
        {
            os.write(bytes,0,len);
        }
//        发送完后 给服务端终止指令
        s.shutdownOutput();

        InputStream is=s.getInputStream();
        byte[] bufin=new byte[1024];
        int len1=is.read(bufin);
        String s1=new String(bufin,0,len1);
        System.out.println(s1);
         bi.close();
         s.close();
    }
}

服务端

public class TCP_test3server {
    public static void main(String[] args) throws IOException {
        System.out.println("TCP服务端3已启动");
        ServerSocket ss=new ServerSocket(10005);
//每次读取都需要重新接收一个新的客户端 并重新使用输入流
      while (true) {
          Socket s=ss.accept();//阻塞等待客户端
//          将来访的客户端都封装到一个单独的线程中

          new Thread(new TCP_test3Runnable(s)).start();

      }
//ss.close();
    }
}
public class TCP_test3Runnable implements Runnable {
    private Socket s;

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

    @Override
    public void run() {
        String ip=s.getInetAddress().getHostAddress();
        BufferedInputStream bi= null;
        try {
            bi = new BufferedInputStream(s.getInputStream());
            int count = 1;
            File file = new File("D:\\IO\\net.server\\" + ip + " (" + count + ")test.png");
            while (file.exists()) {
                count++;
                file=new File("D:\\IO\\net.server\\" + ip + " (" + count + ")test.png");
            }
            System.out.println(file);
            BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(file));
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = bi.read(bytes)) != -1)
                bo.write(bytes, 0, len);
            OutputStream os = s.getOutputStream();
//      通过输出流写数据
            os.write("TCP客户端3上传成功".getBytes());
            bo.close();
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

你可能感兴趣的:(Java26 TCP在Java中的实现)