首页 > 其他分享 >tcp协议进行传输

tcp协议进行传输

时间:2024-10-19 14:31:58浏览次数:1  
标签:协议 java socket tcp 传输 new import Socket 客户端

一、单个用户进行连接

1.客户端

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/*
    1:建立客户端的Socket服务,并明确要连接的服务器。
    2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.
    3:通过Socket对象的方法,可以获取这两个流
    4:通过流的对象可以对数据进行传输
    5:如果传输数据完毕,关闭资源

 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception{
        // 1:建立客户端的Socket服务,并明确要连接的服务器。
        //Socket(String host, int port)
        //创建流套接字并将其连接到指定主机上的指定端口号。
        Socket socket = new Socket("192.168.22.15", 12345);
        Scanner sc = new Scanner(System.in);

        // 3:通过Socket对象的方法,可以获取这两个流
        //获取通道中的输出流,将数据发送给服务端
        OutputStream outputStream = socket.getOutputStream();
        //获取通道中的输入流
        InputStream inputStream = socket.getInputStream();

        while (true){
            System.out.print("请输入要发送的内容:");
            String info = sc.nextLine();
            if("886".equals(info)){
                break;
            }

            // 4:通过流的对象可以对数据进行传输
            outputStream.write(info.getBytes());
            outputStream.flush(); // 来自于通道中的类


            byte[] bytes = new byte[1024];
            int length = inputStream.read(bytes);
            String s = new String(bytes, 0, length);
            System.out.println(s);
        }


        // 5:如果传输数据完毕,关闭资源
//        outputStream.close();
        socket.close();

    }
}

2.服务端

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

/*
    1:建立服务器端的socket服务,需要一个端口
    2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
    3:通过客户端的获取流对象的方法,读取数据或者写入数据
    4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的

 */
public class ServerDemo1 {
    public static void main(String[] args){
        try {
            // 1:建立服务器端的socket服务,需要一个端口
            //ServerSocket(int port)
            //创建绑定到指定端口的服务器套接字。
            ServerSocket ss = new ServerSocket(12345);

            // 2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
            Socket socket = ss.accept();

            while (true){
                InetAddress inetAddress = socket.getInetAddress();
                String hostName = inetAddress.getHostName();

                // 3:通过客户端的获取流对象的方法,读取数据或者写入数据
                // 获取通道中的输入流
                InputStream inputStream = socket.getInputStream();
                byte[] bytes = new byte[1024];
                int length = inputStream.read(bytes);
                String s = new String(bytes, 0, length);
                System.out.println(hostName+": "+s);

                // 获取通道中的输出流
                OutputStream outputStream = socket.getOutputStream();
                outputStream.write("服务器已接收!".getBytes());
                outputStream.flush();
            }
        }catch (Exception e){
            System.out.println("用户已退出。。。");
        }


    }
}

二、建立多个客户的连接

1.客户端

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/*
    1:建立客户端的Socket服务,并明确要连接的服务器。
    2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.
    3:通过Socket对象的方法,可以获取这两个流
    4:通过流的对象可以对数据进行传输
    5:如果传输数据完毕,关闭资源

 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        // 1:建立客户端的Socket服务,并明确要连接的服务器。
        //Socket(String host, int port)
        //创建流套接字并将其连接到指定主机上的指定端口号。
        Socket socket = new Socket("192.168.22.15", 12345);
        Scanner sc = new Scanner(System.in);



        // 3:通过Socket对象的方法,可以获取这两个流
        //获取通道中的输出流,将数据发送给服务端
        OutputStream outputStream = socket.getOutputStream();
        //获取通道中的输入流
        InputStream inputStream = socket.getInputStream();

        // E:\\李刚的对象.jpg
        BufferedInputStream bis = null;
        while (true){
            try {
                System.out.print("请输入要上传文件的路径:");
                String address = sc.nextLine();
                bis = new BufferedInputStream(new FileInputStream(address));
                break;
            }catch (Exception e){
                System.out.println("路径不存在!重新输入!");
            }
        }
        if(bis!=null){
            byte[] bytes = new byte[2048];
            int length = 0;
            while ((length = bis.read(bytes))!=-1){
                // 4:通过流的对象可以对数据进行传输
                outputStream.write(bytes,0, length);
                outputStream.flush(); // 来自于通道中的类
            }
        }

        //关闭输出流,通知服务端读取结束
        socket.shutdownOutput();

        // 接收服务端的反馈
        byte[] bytes = new byte[1024];
        int length = inputStream.read(bytes);
        String s = new String(bytes, 0, length);
        System.out.println(s);


        // 5:如果传输数据完毕,关闭资源
//        outputStream.close();
        socket.close();

    }
}

2.服务端

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
    1:建立服务器端的socket服务,需要一个端口
    2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
    3:通过客户端的获取流对象的方法,读取数据或者写入数据
    4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的

 */
public class ServerDemo1 {
    public static void main(String[] args)  throws Exception{
        // 1:建立服务器端的socket服务,需要一个端口
        //ServerSocket(int port)
        //创建绑定到指定端口的服务器套接字。
        ServerSocket ss = new ServerSocket(12345);

        while (true){
            // 2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
            Socket socket = ss.accept();

            new TCPThread(socket).start();
        }
    }
}

class TCPThread extends Thread{

    Socket socket;

    public TCPThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        InetAddress inetAddress = socket.getInetAddress();
        String hostName = inetAddress.getHostName();
        System.out.println("用户:"+hostName+" 已上线! ");

        try {
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\target\\" + hostName + "-" + System.currentTimeMillis() + ".jpg"));
            while (true) {
                // 3:通过客户端的获取流对象的方法,读取数据或者写入数据
                // 获取通道中的输入流
                InputStream inputStream = socket.getInputStream();
                byte[] bytes = new byte[2048];
                int length = 0;
                while ((length = inputStream.read(bytes))!=-1){
                    // 4:通过流的对象可以对数据进行传输
                    bos.write(bytes,0, length);
                    bos.flush(); // 来自于通道中的类
                }

                // 获取通道中的输出流
                OutputStream outputStream = socket.getOutputStream();
                outputStream.write("图片已上传!!".getBytes());
                outputStream.flush();
            }
        }catch (Exception e){
            System.out.println("-----------------------");
            System.out.println(hostName+" 用户已下线....");
            System.out.println("-----------------------");
        }
    }
}

标签:协议,java,socket,tcp,传输,new,import,Socket,客户端
From: https://www.cnblogs.com/ndmtzwdx/p/18475860

相关文章

  • 一款能让产品兼容所有快充协议的快充取电芯片
    XSP06芯片简介XSP06是一款集成USBPowerDelivery(PD2.0/3.0)快充协议、QC2.0/3.0快充协议、华为FCP协议和三星AFC快充协议(兼容BC1.2)的USBType-C多功能取电芯片,支持从充电器/车充等电源上取电给产品供电应用场景 小家电、小型加热器智能家居、音响卷......
  • 从零开始精通RTSP之深入理解RTP协议
    一、RTP协议概述1.定义   RTP(RealTimeTransportProtocol)即实时传输协议,它是一种用于在IP网络上对多媒体数据进行实时传输的标准协议。在RTSP(RealTimeStreamingProtocol)的应用场景中,RTP起到了至关重要的作用,负责传输实际的音视频数据。2.协议结构   RTP头部......
  • flume传输数据报错“Space for commit to queue couldn‘t be acquired. Sinks are li
        最近在写一个数据量比较大的项目时候,需要使用flume将kafka中的数据传输到HDFS上进行存储,方便后续的数仓搭建,但是flume在传输数据中却报错如下日志org.apache.flume.ChannelFullException:Spaceforcommittoqueuecouldn'tbeacquired.Sinksarelikelynot......
  • ARP协议超详细知识点详解入门攻略总结
    章节目录一、ARP协议概述二、ARP协议的工作原理三、ARP缓存及其管理四、ARP报文格式及类型五、ARP协议的应用场景六、ARP协议的安全性及防御措施七、如何学习ARP协议知识八、资源简介一、ARP协议概述重点详细内容知识点总结:ARP(AddressResolutionProtocol)地址解析协议......
  • TCP-UDP-Socket调试工具以及使用教程(亲测好用!)
    前言TCP-UDP老程序都不陌生吧,面试常问。所以在网络编程与网络应用开发的过程中,调试是一个至关重要的环节,它帮助开发者确保数据能够准确无误地在不同节点之间传输。尤其当涉及到TCP/IP、UDP等底层网络通信协议时,面对复杂的连接建立、数据流控制及错误处理等问题,拥有一款强大且专业......
  • 查看Linux下软件的开源许可证协议
    [root@sre01~]#rpm-qikernelName:kernelVersion:3.10.0Release:1062.el7Architecture:x86_64InstallDate:Sat13Apr202403:44:00PMCSTGroup:SystemEnvironment/KernelSize:67060903License:GPLv2......
  • 一文说清楚http、tcp、socket、websocket区别
    写在开头阅读本文,需要您对tcp/ip协议簇协议有一定的了解,本文旨在带你了解Socket到底是啥,他与tcp/ip协议簇、WebSocket、Http等协议之间的关系OSI网络七层模型第一层:应用层,定义了用于在网络中进行通信和传输数据的接口;(Http协议位于该层)第二层:表示层,定义不同系统中数......
  • DeviceNet转Profibus DP总线协议转换网关
    一,设备主要功能捷米特JM-DP-DNT网关实现DeviceNet从站设备接入到ProfibusDP网络;也可作为DeviceNet从站,将DeviceNet主站设备接入到Profibus网络。应用广泛:捷米特JM-DP-DNT广泛应用于支持DeviceNet接口的罗克罗尔,欧姆龙,基恩士PLC等主站控制器等等。DeviceNet从站转ProfibusD......
  • VU9P处理板设计原理图:412-基于单XCVU9P+双DSP C6678的双FMC接口 100G光纤传输加速计算
    基于单XCVU9P+双DSPC6678的双FMC接口100G光纤传输加速计算卡  一、板卡概述板卡包括一片Xilinx FPGA  XCVU9P,两片 TI 多核DSP TMS320C6678及其控制管理芯片CFPGA.设计芯片满足工业级要求。FPGA VU9P 需要外接4路QSFP+(100Gbps)及其两个FMC HPC接......
  • 计算机网络基础(2)---网络传输基本流程与Socket编程预备
    个人主页:C++忠实粉丝欢迎点赞......