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. Educational Codeforces Round 65 (Rated for Div

    D - Bicolored RBS 给定一个括号序列,现在你必须对每一个括号涂成蓝色或红色,要求使得涂完后的红色括号和蓝色括号序列都必须是合法的括号序列,设红色括号形成的的括号序列的深度为\(dep_ ...

  2. Mybatis【11】-- Mybatis Mapper动态代理怎么写?

    目录 1.回顾Mybatis执行sql的流程 2.mapper动态代理怎么写? 3.mapper动态代理怎么做的? 1.回顾Mybatis执行sql的流程 在之前的代码中我们的运行过程再梳理一下,首先 ...

  3. 用VuePress在GitHub Pages上搭建博客

    请先点击链接RobinDevNotes,体验用VuePress搭建博客的效果(logo还没有合适的替换),目前部署在GitHub Pages上,国内访问速度还可以,再阅读本文感受来龙去脉和搭建过程. ...

  4. InheritableThreadLocal 父子线程值传递

    最近项目中使用 @Async 异步远程调用的时候,发现主线程能拿到 token 值,子线程调用的时候 token 为 null.研究了一番,发现可以直接使用 InheritableThreadLoca ...

  5. 李世铭SFE|销售的四种境界-与之匹配的CRM功能

    销售有四种境界,与之匹配的也应有四种不同的CRM系统的功能. 1.服务型销售 这类销售代表人数最为众多,超过半数的销售代表皆属于服务型.他们主要基于客户的需求,来提供相应的解决方案,或者公司所规定的某 ...

  6. 分布式系统架构1:共识算法Paxos

    1.背景 今天开始更新分布式的文章,工作几年后还没系统的学习分布式的内容,趁着还有时间学习沉淀的时候多输出些文章 2.为什么需要分布式共识算法 思考:现在你有一份随时变动的数据,需要确保它正确存储在网 ...

  7. less 常用方法

    介绍 Less 是 CSS 的预处理语言之一,为 CSS 增添了变量.Mixin.函数等特性,使CSS更易于维护扩展. 嵌套(Nesting) .header { .navgation: { font ...

  8. 小程序canvas白屏解决(

    造成canvas白屏的原因(两个原因) 1. 使用网络图片经绘制,没有配置downloadfile域名 ctx.drawImage('https://img1.imgtn.bdimg.com/it/u ...

  9. 推荐 groovy 的 sql 模块

    发现 groovy 的 sql 很好用,写下来代码风格和 d2js 很像,唯一的不足是没有 sql{..} 块的设计,但对 Java 程序员来说它已经非常友好了,来自它的网站的一段示例: Now yo ...

  10. 从 $PGDATA 到文件组:深入解析 PostgreSQL 与 SQL Server 的存储策略

    从 $PGDATA 到文件组:深入解析 PostgreSQL 与 SQL Server 的存储策略 在数据库领域,数据存储和管理的效率与可靠性是决定系统性能.可扩展性和易于管理的关键因素.Postgr ...