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. php之编译安装

    1. 安装所需环境 yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng ...

  2. javascript的一些API接口的使用

    1.blob http URL 在编辑器中,有的情况下插入图片,会讲图片转成 blob:http://localhost/*** 的这种形式.这种形式的URL实际数据是存放在浏览器的内存中. 这种情况 ...

  3. Git 克隆部分文件

    使用 sparse-checkout (推荐) git clone \ -b master \ --depth=1 \ --filter=blob:none \ --sparse \ <repo ...

  4. Conda + JuiceFS :增强 AI 开发环境共享能力

    Conda 是当前 AI 应用开发领域中非常流行的环境和包管理系统,因其能够简单便捷地创建与系统资源相隔离的虚拟环境广受欢迎. Conda 支持在不同的操作系统上重建相同的工作环境,但在环境共享复用方 ...

  5. (系列十四)Vue3+WebApi 搭建动态菜单

    说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...

  6. flutter安装过程中 flutter doctor 出现错误 cmdline-tools component is missing

    进入Android studio的settings添加tool工具

  7. openEuler欧拉安装Jenkins并修改构建workspace路径

    ​一.系统优化 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 关闭selinux sed -ri 's/SELINUX=enfo ...

  8. PM的正交解调法

    1.PM的模拟调制过程 ​ PM信号是一种相位调制信号,其携带的信息保存在其信号的相位中,通过改变载波的相位来实现基带数据的传输. 其函数表达式如下: \[s(t) = A*cos(w_c*t + K ...

  9. 【Linux】课堂练习作业

    # 作业Day01-关机练习作业 查询在线用户 who -H 查询服务状态 systemctl status sshd 停止服务 systemctl stop sshd 停止后再次检查服务状态 方法一 ...

  10. Base64解码、Base64编码、Base64加密解密规则

    转换规则:进行Base64转换的时候,将3个byte(3*8bit = 24bit)的数据,先后放入一个24bit的缓冲区中,先来的byte占高位.数据不足3byte的话,于缓冲器中剩下的bit用0补 ...