zoukankan      html  css  js  c++  java
  • Java 网络编程 之 TCP协议

    TCP协议 (服务器端程先启动,等待客户端连接)

    TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据

    保证传输数据的全性安,文件数据不易丢失

    JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端。

    首先创建代表服务器端的ServerSocket对象,并等待客户端的连接,

    然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,客户端再次向服务器端发送确认信息,确认连接

     

     

    public class TCPClient {//客户端

    public static void main(String[] args) throws IOException {

    Socket socket=new Socket("127.0.0.1",8888);//客户端对象 建连接

    //Socket socket=new Socket(inet,8888);//(地址对象,端口号)

    OutputStream out=socket.getOutputStream();//客户端的 输出流

    //写数据

    Scanner sc=new Scanner(System.in);

    String str=sc.nextLine();

    out.write(str.getBytes());

    //明确数据源

    FileInputStream fis=new FileInputStream("F:\java\1.jpg");

    //BufferedInputStream bis = new BufferedInputStream(fis);

    //写数据

    int len=0;

    byte[] bytes=new byte[1024];

    while((len=fis.read(bytes))!=-1){ //bis.read(bytes)

    out.write(bytes,0,len); //写入 socket的 输出流

    }

    socket.shutdownOutput();//socket对象 的输出流 写入结束符

    //接收服务器端的响应

    InputStream in=socket.getInputStream();

    byte[] bytes=new byte[1024];

    int len=in.read(bytes);

    System.out.println(new String(bytes,0,len));

    socket.close();//释放内存

    fis.close();//关闭数据源

    }

    }

    int port=socket.getPort();//获取端口号

    InetAddress inet=getLocalAddress();//获取本地地址对象

     

    public class TCPServer {//服务器端

    public static void main(String[] args) throws IOException {

    ServerSocket server=new ServerSocket(8888);//服务端对象(端口号)

    Socket socket=server.accept();//创建连接  获取客户端对象

    InputStream in=socket.getInputStream();//客户端的 输入  不关

    //读出数据

    byte[] bytes=new byte[1024];

    int len=in.read(bytes);

    System.out.println(new String(bytes,0,len));

     

    //明确目的地

    File file=new File("F:\aaa");

    if(!file.exists()){ file.mkdirs(); }//文件夹不存在  创建

    String fn="oracle"+System.currentTimeMillis()//域名+毫秒值

              +new Random().nextInt(999999)+".jpg";//+六位随机数+后缀

    FileOutputStream fos=new FileOutputStream(file+File.separator+fn);

    //BufferedOutputStream bos = new BufferedOutputStream(fos);

    //开始复制

    byte[] bytes=new byte[1024];

    int len=0;

    while((len=in.read(bytes))!=-1){

    fos.write(bytes,0,len); //bos.write(bytes,0,len);

    }

    //发送给客户端响应

    OutputStream out=socket.getOutputStream();//输出流

     

    Scanner sc=new Scanner(System.in);

    String str=sc.nextLine();

    out.write(str.getBytes());//写数据 

    out.write("上传成功".getBytes());//写数据

     

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

    fos.close(); //bos.close();

    }

    }

    InetAddress address = socket.getInetAddress();//获取地址对象

    String ip=address.getHostAddress(); //ip地址

    String name=address.getHostName(); //主机名

    System.out.println("来自IP:"+ip+"主机名:"+name);

     

    多线程(多人同时访问服务器)
    public class Upload implements Runnable{
        private Socket socket;
        public Upload(){}
        public Upload(Socket socket){this.socket=socket;}
        public void run() {
            FileOutputStream fos=null;
            try{
            InputStream in=socket.getInputStream();//客户端 输入流
            //明确目的地
            File file=new File("F:\aaa");
            if(!file.exists()){ file.mkdirs(); }//文件夹不存在  创建
            String filename="oracle"+System.currentTimeMillis()//域名+毫秒值
                        +new Random().nextInt(999999)+".jpg";//+六位随机数+后缀
            fos=new FileOutputStream(file+File.separator+filename);
            //开始复制
            byte[] bytes=new byte[1024];
            int len=0;
            while((len=in.read(bytes))!=-1){fos.write(bytes,0,len);}
            //发送给客户端响应
            OutputStream out=socket.getOutputStream();//输出流
            out.write("上传成功".getBytes());//写数据
            }catch(IOException ex){ex.printStackTrace();}
         finally{ if(fos!=null){fos.close();//点try...catch} }
        }
    }       
    
    public class TCPThreadServer {//服务器端 多线程  (客户端不变)
        public static void main(String[] args) throws IOException {
            ServerSocket server=new ServerSocket(8888);//服务端对象(端口号)
            while(true){
                Socket socket=server.accept();//创建连接  获取客户端对象 
    new Thread(new Upload(socket)).start();
    //创建并开启线程 } } }

     

  • 相关阅读:
    【ROC曲线】关于ROC曲线、PR曲线对于不平衡样本的不敏感性分析说引发的思考
    MathJax测试
    现有C2B模式小总结
    语音识别技术简介
    Spark运行调试方法与学习资源汇总
    [Apache Spark源码阅读]天堂之门——SparkContext解析
    对三维数据集的K-means聚类研究
    根据《关于“k-means算法在流式细胞仪中细胞分类的应用”的学习笔记总结》撰写的中期报告
    关于《k-means算法在流式细胞仪中细胞分类的应用》的学习笔记总结
    用shell脚本自动化安装hadoop
  • 原文地址:https://www.cnblogs.com/javscr/p/10252744.html
Copyright © 2011-2022 走看看