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. Sublime之快捷操作

    列举常用的Sublime操作,涉及操作 1.每行默认需要统一添加逗号 1)全选 ctrl + a 2) 组合键 ctrl + shift + l 即可进行操作 (这里是L哦) 之后也可以使用HOME键 ...

  2. 如何使用docsify搭建自己的github文档?

    安装前提 确认电脑已经安装好 node 和 npm 环境. 如果还没有装好,那需要执行下面的步骤: 1.进入官网:https://nodejs.org/zh-cn/ , 下载长期支持版. 2.安装就直 ...

  3. 限流中间件IpRateLimitMiddleware的使用

    前言 IpRateLimitMiddleware(Github: AspNetCoreRateLimit) 是ASPNETCore的一个限流的中间件,用于控制客户端调用API的频次, 如果客户端频繁访 ...

  4. Simple FOC内置通信接口学习(二):电机命令接口

    本文参(zhao)考(chao)至官方文档https://docs.simplefoc.com/docs_chinese/commander_interface Commander 接口 Comman ...

  5. 鸿蒙应用开发从入门到入行 - 篇3:ArkUI布局基础与制作可交互页面

    鸿蒙应用开发从入门到入行 - 篇3:ArkUI布局基础与制作可交互页面 导读:在本篇文章里,您将掌握事件.装饰器.双向绑定等相关知识,并利用所学知识做一个待办列表的案例. 练手案例:登录界面 开始之前 ...

  6. 用Python让两组数据纵向排序

    一.引言 在数据处理和分析中,排序是一项非常基础且重要的操作.排序可以帮助我们更好地理解数据,发现数据中的模式和规律.在Python中,我们可以使用多种方法对数据进行排序.本文将详细介绍如何使用Pyt ...

  7. pip 安装 Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1123)'))

    1.问题 1.1 问题截取 pip install redis -i https://pypi.tuna.tsinghua.edu.cn/simple Looking in indexes: http ...

  8. 组件漏洞测试工具---Dependency-Check

    目录 文章综述 Dependency-Check简介 工作原理 常用命令 报告解读 使用场景 缺点 文章综述 本文主要介绍Dependency-Check工具的工作原理和使用方法,并提供一个开源方案帮 ...

  9. Qt数据库应用23-个人信息报表

    一.前言 自从上次做完的图文报表,又新来了个需求需要实现个人信息报表,类似个人简历一样的格式,数据从数据库中取出来,然后一个人的信息就打印一张,传入查询的多个人员信息,自动分页打印个人信息报表,报表可 ...

  10. Qt音视频开发39-人脸识别在线版

    一.前言 关于人脸识别这块,前些年不要太火,哪怕是到了今天依然火的一塌糊涂,什么玩意都要跟人脸识别搭个边,这东西应该只是人工智能的一个很小的部分,人脸识别光从字面上理解就是识别出人脸区域,其实背后真正 ...