网络编程之TCP、UDP和URL

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();
    }
 }

 

posted @ 2021-07-01 17:38  深夜暗月  阅读(130)  评论(0)    收藏  举报