TCP实现聊天

客户端
  1. 连接服务器Socket

  2. 发送消息

 package com.yeyue.lesson2;
 ​
 import java.io.IOException;
 import java.io.OutputStream;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.net.UnknownHostException;
 ​
 public class TcpCliebtDemo01 {
     public static void main(String[] args) {
 ​
         Socket socket = null;
         OutputStream os = null;
 ​
         try {
             //1、要知道服务器的地址,端口号
             InetAddress serverIP = InetAddress.getByName("127.0.0.1");
             int port = 9999;
             //2、创建一个socket连接
             socket = new Socket(serverIP,port);
             //3、发送消息IO流
             os = socket.getOutputStream();
             os.write("你好啊,我的朋友!".getBytes());
 ​
        } catch (Exception e) {
             e.printStackTrace();
        }finally {
             if (os!=null){
                 try {
                     os.close();
                } catch (IOException e) {
                     e.printStackTrace();
                }
            }
             if (socket!=null){
                 try {
                     socket.close();
                } catch (IOException e) {
                     e.printStackTrace();
                }
            }
 ​
        }
 ​
 ​
    }
 }
服务器
  1. 建立服务的端口ServerSocket

  2. 等待客户的连接 accept

  3. 接收用的消息

 package com.yeyue.lesson2;
 ​
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.ServerSocket;
 import java.net.Socket;
 ​
 public class TcpServerDemo01 {
     public static void main(String[] args) {
 ​
         ServerSocket serverSocket = null;
         Socket socket = null;
         InputStream is = null;
         ByteArrayOutputStream baos = null;
 ​
         try {
             //1、得有一个地址
             serverSocket = new ServerSocket(9999);
             while (true){
                 //2、等待客户端连接过来
                 socket = serverSocket.accept();
                 //3、读取客户端信息
                 is = socket.getInputStream();
 ​
                 //管道流
                 baos = new ByteArrayOutputStream();
                 byte[] buffer = new byte[1024];
                 int len;
                 while((len=is.read(buffer))!=-1){
                     baos.write(buffer,0,len);
                }
                 System.out.println(baos.toString());
            }
 ​
        } catch (IOException e) {
             e.printStackTrace();
        }finally {
             if(baos!=null){
                 try {
                     baos.close();
                } catch (IOException e) {
                     e.printStackTrace();
                }
            }
             if(is!=null){
                 try {
                     is.close();
                } catch (IOException e) {
                     e.printStackTrace();
                }
            }
             if(socket!=null){
                 try {
                     socket.close();
                } catch (IOException e) {
                     e.printStackTrace();
                }
            }
             if(serverSocket!=null){
                 try {
                     serverSocket.close();
                } catch (IOException e) {
                     e.printStackTrace();
                }
            }
        }
 ​
 ​
    }
 }

TCP实现文件上传

客户端
 package com.yeyue.lesson2;
 ​
 import java.io.*;
 import java.net.InetAddress;
 import java.net.Socket;
 ​
 ​
 public class TcpCliebtDemo02 {
     public static void main(String[] args) throws Exception {
         //1、创建一个Socket连接
         Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
         //2、创建一个输出流
         OutputStream os = socket.getOutputStream();
 ​
         //3、读取文件
         FileInputStream fis = new FileInputStream(new File("1.jpg"));
         //4、写出文件
         byte[] buffer = new byte[1024];
         int len;
         while ((len=fis.read(buffer))!=-1){
             os.write(buffer,0,len);
        }
 ​
         //通知服务器我已经结束了
         socket.shutdownOutput(); //我已经传输完了
 ​
         //确认服务端接收完毕了才可以断开
         InputStream inputStream = socket.getInputStream();
         //String byte[]
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         byte[] buffer2 = new byte[1024];
         int len2;
         while((len2=inputStream.read(buffer2))!=-1){
             baos.write(buffer2,0,len2);
        }
         System.out.println(baos.toString());
 ​
         //5、关闭资源
         baos.close();
         inputStream.close();
         fis.close();
         os.close();
         socket.close();
    }
 }
服务器
 package com.yeyue.lesson2;
 ​
 import java.io.*;
 import java.net.ServerSocket;
 import java.net.Socket;
 ​
 public class TcpServerDemo02 {
     public static void main(String[] args) throws Exception {
         //1、创建服务器
         ServerSocket serverSocket = new ServerSocket(9000);
         //2、监听客户端的连接
         Socket socket = serverSocket.accept(); //阻塞式监听,会一直等待客户端连接
         //3、获取输入流
         InputStream is = socket.getInputStream();
 ​
         //4、文件输出
         FileOutputStream fos = new FileOutputStream(new File("2.jpg"));
         byte[] buffer = new byte[1024];
         int len;
         while ((len=is.read(buffer))!=-1){
             fos.write(buffer,0,len);
        }
 ​
         //通知客户端接收完毕了
         OutputStream os = socket.getOutputStream();
         os.write("我接收完毕了,你可以断开了".getBytes());
 ​
 ​
         //关闭资源
         fos.close();
         is.close();
         socket.close();
         serverSocket.close();
    }
 }
 ​

UDP发送消息

发送端
 package com.yeyue.lesson3;
 ​
 import com.sun.org.apache.xml.internal.dtm.ref.DTMNodeListBase;
 ​
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.InetAddress;
 ​
 public class UdpClientDemo1 {
     public static void main(String[] args) throws Exception {
         //1、建立一个socket
         DatagramSocket socket = new DatagramSocket();
         //2、建个包
         String msg = "你好啊,我的朋友";
 ​
         //发送给谁
         InetAddress localhost = InetAddress.getByName("localhost");
         int port = 9000;
         //数据,数据的起始,要发送给谁
         DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
         //3、发送包
         socket.send(packet);
 ​
         //4、关闭流
         socket.close();
    }
 }
接收端
 package com.yeyue.lesson3;
 ​
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.SocketException;
 //等待客户端的连接
 public class UdpServerDemo01 {
     public static void main(String[] args) throws Exception {
         //开放端口
         DatagramSocket socket = new DatagramSocket(9000);
         //接收数据包
         byte[] buffer = new byte[1024];
         DatagramPacket packet =  new DatagramPacket(buffer,0,buffer.length);
 ​
         socket.receive(packet); //阻塞接收
 ​
         System.out.println(packet.getAddress().getHostAddress());
         System.out.println(new String(packet.getData(),0,packet.getLength()));
         //关闭连接
         socket.close();
    }
 }
 ​

自定义发送消息

发送端
 package com.yeyue.chat;
 ​
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.InetSocketAddress;
 import java.net.SocketException;
 import java.nio.charset.Charset;
 ​
 public class UdpSenderDemo01 {
     public static void main(String[] args) throws Exception {
         DatagramSocket socket = new DatagramSocket(8888);
 ​
         //准备数据:控制台读取system.in
         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
 ​
         while (true){
             String data = reader.readLine();
             byte[] datas = data.getBytes();
 ​
             DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));
 ​
             String data1 = new String(datas,0,datas.length,"UTF-8");
             System.out.println(data1);
 ​
             socket.send(packet);
 ​
             if (data.equals("bye")){
                 break;
            }
        }
 ​
         socket.close();
 ​
    }
 }
接收端
 package com.yeyue.chat;
 ​
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 ​
 ​
 public class UdpReceiveDemo01 {
     public static void main(String[] args) throws Exception {
         DatagramSocket socket = new DatagramSocket(6666);
 ​
         while (true) {
             //准备接收包裹
             byte[] container = new byte[1024];
             DatagramPacket packet = new DatagramPacket(container, 0, container.length);
             socket.receive(packet); //阻塞式接收包裹
 ​
             //断开连接 bye
             byte[] data = packet.getData();
             String receiveData = new String(data, 0, data.length);
 ​
             System.out.println(receiveData);
             System.out.println(data.length);
 ​
 //           for (int i = 0; i < data.length; i++) {
 //               System.out.println(data[i]);
 //           }
 ​
 ​
             //断开连接 bye
             if (receiveData.equals("bye")) {
                 break;
            }
        }
         socket.close();
    }
 }

老师与学生对话

老师
 package com.yeyue.chat;
 ​
 public class TalkTeacher {
     public static void main(String[] args) {
         //开启两个线程
         new Thread(new TalkSend(5555,"localhost",8888)).start();
         new Thread(new TalkReceive(9999,"老师")).start();
    }
 }
学生
 package com.yeyue.chat;
 ​
 public class TalkStudent {
     public static void main(String[] args) {
         //开启两个线程
         new Thread(new TalkSend(7777,"localhost",9999)).start();
         new Thread(new TalkReceive(8888,"老师")).start();
    }
 }
发送服务器
 package com.yeyue.chat;
 ​
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.InetSocketAddress;
 import java.net.SocketException;
 ​
 public class TalkSend implements Runnable{
     DatagramSocket socket = null;
     BufferedReader reader = null;
 ​
     private int fromPort;
     private String toIp;
     private int toPort;
 ​
     public TalkSend(int fromPort, String toIp, int toPort) {
         this.fromPort = fromPort;
         this.toIp = toIp;
         this.toPort = toPort;
 ​
         try {
             socket = new DatagramSocket(fromPort);
             reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
             e.printStackTrace();
        }
    }
 ​
     @Override
     public void run() {
 ​
         while (true){
             String data = null;
             try {
                 data = reader.readLine();
                 byte[] datas = data.getBytes();
                 DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIp,this.toPort));
 ​
                 socket.send(packet);
 ​
                 if (data.equals("bye")){
                     break;
                }
            } catch (IOException e) {
                 e.printStackTrace();
            }
        }
         socket.close();
    }
 }
接收服务器
 package com.yeyue.chat;
 ​
 import java.io.IOException;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.SocketException;
 ​
 public class TalkReceive implements Runnable{
     DatagramSocket socket = null;
     private int port;
     private  String msgFrom;
 ​
     public TalkReceive(int port,String msgFrom) {
         this.port = port;
         this.msgFrom = msgFrom;
         try {
             socket = new DatagramSocket(port);
        } catch (SocketException e) {
             e.printStackTrace();
        }
    }
 ​
     @Override
     public void run() {
         try {
             while (true) {
                 //准备接收包裹
                 byte[] container = new byte[1024];
                 DatagramPacket packet = new DatagramPacket(container, 0, container.length);
                 socket.receive(packet); //阻塞式接收包裹
 ​
                 //断开连接 bye
                 byte[] data = packet.getData();
                 String receiveData = new String(data, 0, data.length);
 ​
                 System.out.println(msgFrom + " :" + receiveData);
 ​
                 //断开连接 bye
                 if (receiveData.equals("bye")) {
                     break;
                }
            }
        }catch(IOException e){
                 e.printStackTrace();
            }
         socket.close();
    }
 }

URL

统一的资源定位符:定位资源,定位互联网上的某一个资源

 协议://IP地址:端口/项目名/资源
实例
 package com.yeyue.lesson4;
 ​
 import java.net.MalformedURLException;
 import java.net.URL;
 ​
 public class UrlDemo01 {
     public static void main(String[] args) throws MalformedURLException {
         URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=yeyue&password=123");
         System.out.println(url.getProtocol());  //协议
         System.out.println(url.getHost()); // 主机IP
         System.out.println(url.getPort()); //端口
         System.out.println(url.getPath()); //全路径
         System.out.println(url.getFile()); //文件
         System.out.println(url.getQuery()); //参数
    }
 }
URL下载文件
 package com.yeyue.lesson4;
 ​
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
 ​
 public class UrlDownLoad {
     public static void main(String[] args) throws IOException {
         //下载地址
         URL url = new URL("https://webfs.ali.kugou.com/202107011721/73be3332d43d20451d1143678abe97d5/KGTX/CLTX001/270df47a81871158c5846debbfc573f1.mp3");
 ​
         //链接到这个地址
         HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
 ​
         InputStream inputStream = urlConnection.getInputStream();
 ​
         FileOutputStream fos = new FileOutputStream("3f1.mp3");
 ​
         byte[] buffer = new byte[1024];
         int len;
         while ((len=inputStream.read(buffer))!=-1){
             fos.write(buffer,0,len);
        }
 ​
         fos.close();
         inputStream.close();
         urlConnection.disconnect();
    }
 }

网络编程之TCP、UDP和URL的更多相关文章

  1. 4.Java网络编程之TCP/UDP

    常见传输协议: UDP , TCP UDP协议:    特点:         1.将数据及源和目的封装成数据包中,不需要建立连接         2.每个数据包的大小限制在64K内         ...

  2. 网络编程之TCP/UDP及其流程比较(转)

    TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式TCP保证数据正确性,UDP可能丢包TCP保证数据顺序,UDP不保证 具体编程 ...

  3. Java网络编程之TCP、UDP

    Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载.   ...

  4. 网络编程之TCP/IP各层详解

    网络编程之TCP/IP各层详解 我们将应用层,表示层,会话层并作应用层,从TCP/IP五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议,就理解了整个物联网通信的原理. 首先,用户感知到的只 ...

  5. java网络编程之TCP通讯

    java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...

  6. 网络编程之TCP编程

    网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...

  7. Python网络编程之TCP套接字简单用法示例

    Python网络编程之TCP套接字简单用法示例 本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而jav ...

  8. Java网络编程之TCP

    Java网络编程之TCP ​ TCP主要需要两个类:Socket和ServerSocket,Socket是客户端连接服务器时创建,参数需要指定服务器的ip和端口,ServerSocket是服务器端创建 ...

  9. 应聘复习基础笔记1:网络编程之TCP与UDP的优缺点,TCP三次握手、四次挥手、传输窗口控制、存在问题

    重要性:必考 一.TCP与UDP的优缺点 ①TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供 ...

  10. J2SE网络编程之 TCP与UDP

    1.什么是TCP TCP(Transmission Control Protocol传输控制协议)是一种面向连接的.可靠的.基于字节流的通信协议,位于传输层.这三个特点中,面向连接就如同打电话,双方的 ...

随机推荐

  1. nginx之日志

    1)耗时问题定位 这几天在优化服务器的响应时间,在根据 nginx 的 accesslog 中 requesttime进行程序优化时,发现有个接口,直接返回数据,平均的requesttime进行程序优 ...

  2. OpenTelemetry 101:面向 IT 领导者和爱好者的非技术指南

    如果您从事软件开发. SRE或DevOps工作,您可能听说过可观察性.遥测和跟踪等术语.这些概念对于理解应用程序在生产环境中的行为至关重要,并且它们是现代软件开发实践的重要组成部分. 您可能还听说过在 ...

  3. Java基础面试:关键字与注释

    Java 中的关键字 什么是关键字 Java 关键字是 Java 语言中预先定义好的.具有特殊含义的标识符.这些标识符在程序中有固定的用途,不能用作变量名.方法名或类名.Java 中共有 53 个特殊 ...

  4. 构造SLR语法分析表

    构造SLR语法分析表 方法: 1)构造G'的规范LR(0)项集族 2)根据规则生成动作 3)生成转换 4)设置报错 /** * P157 规范LR(0)项集族 * @param grammar */ ...

  5. 02C++顺序结构(1)

    1.C++程序的样子 2.流 输出流 COUT<< 3.一个实例及解析 4.小结 头文件的解释 头文件是C++程序对其他程序的引用,就是让编译器的预处理器把这个输入输出流的标准文件iost ...

  6. 数据万象AVIF图片压缩 - 小程序省流量利器

    导语 微信小程序因其便捷的开发环境和天然的微信生态,使得越来越多企业平台通过小程序建立自己的业务.在小程序上使用图片非常广泛,但传统格式图片(如 JPG/PNG)占用空间大,加载速度慢,可能导致昂贵的 ...

  7. 动态 import()

    动态 import() https://v8.dev/features/dynamic-import Dynamic import() 引入了一个新的类似函数的功能,相比静态的 import 提供了新 ...

  8. javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplicati

    把这两个勾选去掉

  9. Qt开源作品35-秘钥生成器

    一.前言 在很多商业软件中,需要提供一些可以试运行的版本,这样就需要配套密钥机制来控制,纵观大部分的试用版软件,基本上采用以下几种机制来控制. 远程联网激活,每次启动都联网查看使用时间等,这种方法最完 ...

  10. Slate文档编辑器-Decorator装饰器渲染调度

    Slate文档编辑器-Decorator装饰器渲染调度 在之前我们聊到了基于文档编辑器的数据结构设计,聊了聊基于slate实现的文档编辑器类型系统,那么当前我们来研究一下slate编辑器中的装饰器实现 ...