java网络编程之UDP&&TCP

2021/9/11 22:35:00

本文主要是介绍java网络编程之UDP&&TCP,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录:
一、Socket
二、ServerSocket
三、ServerSocket(多线程实现

1、UDP协议实现发送端和接收端(Socket)

  • DatagramSocket类 :定义发送端&&接收端
  • DatagramPacket类:定义数据包,打包数据**
  • 数据是通过流传输的,所有需要定义字节数组接收,当然,也可根据需求转为其他
  • 切记:先启动接收端,在启动发送端,不然找不到接口

发送端代码实现:

package com.yjxxt.oop.basic.Work04.day06;

import java.io.IOException;
import java.net.*;
//实现放送端
public class UdpSendTest04 {
    public static void main(String[] args) throws IOException {
        //1、定义端口
        DatagramSocket datagramSocket = new DatagramSocket(8888);   //端口号
        //2、准备数据
        byte[]  by = "你还好吗?".getBytes();                   //定义字节数组,存储数据

        //3、打包 - 》接收端的IP+端口 DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
        DatagramPacket packet = new DatagramPacket(by,0,by.length, new InetSocketAddress("localhost",8889));
        //发送地址&&接收端的端口号

        //4、发送
        datagramSocket.send(packet);  //通过send()方法   把打包好的数据发送至接收端

        //5、关闭
        datagramSocket.close();        //关闭端口

    }
}

接收端代码实现:

package com.yjxxt.oop.basic.Work04.day06;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceiveTest04 {
    public static void main(String[] args) throws IOException {
        //1、定义我是接口端
        DatagramSocket datagramSocket = new DatagramSocket(8889);     //定义端口号

        //2、定义字节数组
        byte[] by =  new byte[1024];                              //字节数组  存储传过来的流

        //3、打包接收数据
        DatagramPacket d1 = new DatagramPacket(by,0,by.length);       //把接收过来的流  存储在by字节数组里

        //4、接收
        datagramSocket.receive(d1);                                 //接收                 

        //5、处理数据
        System.out.println(new String(by, 0, d1.getLength()));    //简单处理   打印至控制台

        //6、关闭
        datagramSocket.close();                                       //关闭端口
    }
}

TCP协议实行基础客户端&&服务端:

  • 发送数据两端不平等,客户端与服务器端
  • 数据的传输基于IO流
  • 利用多线程可开看客户端

客户端代码实现(非多线程版):

package com.yjxxt.oop.basic.Work04.day06;

import java.io.*;
import java.net.Socket;
/*
    TCP双向登录的客户端
 */
public class TcpTwoWayClientTest07 {
    public static void main(String[] args) throws IOException, InterruptedException {
        System.out.println("-------我是客户端--------");
        //1、定义我是客户端
        Socket socket = new Socket("localhost",9988);    //指定要发送的服务端端口
        System.out.println("-------与服务器之间建立了连接-------");

        //2、准备数据
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));   //通过监听,获取用户名&密码
        System.out.print("请输入用户名:");
        String username = bufferedReader.readLine();
        System.out.print("请输入密码:");
        String password = bufferedReader.readLine();

        //3、获取输出流
        DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());    //定义输出流

        //4、IO操作
        dataOutputStream.writeUTF("username=" + username + "&password=" + password);   //发送流,输出

        //5、刷出
        dataOutputStream.flush();                     

        //6、获取输入流
        DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());   //获取服务端传回的数据

        //7、读取
        System.out.println(dataInputStream.readUTF());             

        //8、关闭
        dataInputStream.close();
        dataOutputStream.close();
        socket.close();
    }
}

服务端代码实现(非多线程版):

package com.yjxxt.oop.basic.Work04.day06;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
/*
    TCP双向登录的服务端
 */
public class TcPTwoWayCleverTest077 {
    public static void main(String[] args) throws IOException {
        System.out.println("--------我是服务器--------");
        //1、定义我是服务器
        ServerSocket serverSocket = new ServerSocket(9988);   //自己的端口号

        //循环读取客户端
        boolean flag = true;
        while (flag){              //循环监听   客户端排队进入

            //2、阻塞监听
            Socket client = serverSocket.accept();
            System.out.println("---------一个客户端连接成功-----------");

            //3、获取输入流
            DataInputStream dataInputStream = new DataInputStream(client.getInputStream());

            //4、IO操作
            String str = dataInputStream.readUTF();         //讲获取的输入流存储进字符串里

            //5、处理数据 ,判断
            String name = "";
            String pwd = "";
            String[] string = str.split("&");
            System.out.println(Arrays.toString(string));

            for (String s: string){
                String[] string2 = s.split("=");
                if("username".equals(string2[0])){
                    name =  string2[1];
                }else if("password".equals(string2[0])){
                    pwd = string2[1];
                }
            }

            //6、获取输出流,结果响应给客户端
            DataOutputStream dos = new DataOutputStream(client.getOutputStream());
            if("kebang".equals(name) && "123456".equals(pwd)){
                dos.writeUTF("登录成功");
            }else {
                dos.writeUTF("登录失败");
            }

            //7、刷出
            dos.flush();

            //8、关闭
            dos.close();
            dataInputStream.close();
            client.close();
        }
        serverSocket.close();
    }
}

TCP协议实行基础客户端&&服务端:

客户端代码实现(多线程版):

package com.yjxxt.oop.basic.Work04.day06;

import java.io.*;
import java.net.Socket;
/*
    TCP实现多用户登录的服务端
 */
public class TcpLulSocketTest08 {
    public static void main(String[] args) throws IOException {
        System.out.println("-------我是客户端--------");
        //1、定义我是客户端
        Socket socket = new Socket("localhost",8888);    //指定要发送的服务端端口
        System.out.println("-------与服务器之间建立了连接-------");

        //2、准备数据
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));   //通过监听,获取用户名&密码
        System.out.print("请输入用户名:");
        String username = bufferedReader.readLine();
        System.out.print("请输入密码:");
        String password = bufferedReader.readLine();

        //3、获取输出流
        DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());    //定义输出流

        //4、IO操作
        dataOutputStream.writeUTF("username=" + username + "&password=" + password);   //发送流,输出

        //5、刷出
        dataOutputStream.flush();

        //6、获取输入流
        DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());   //获取服务端传回的数据

        //7、读取
        System.out.println(dataInputStream.readUTF());

        //8、关闭
        dataInputStream.close();
        dataOutputStream.close();
        socket.close();
    }
}

服务端代码实现(多线程版):

package com.yjxxt.oop.basic.Work04.day06;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;

/*
    TCP实现多用户登录的服务端
        通过多线程实现服务器端的多用户登录
        一个客户端就要开启一个 线程为当前客户端服务
 */
public class TcpLulServerSocketTest09 {
    public static void main(String[] args) throws IOException {
        System.out.println("--------我是服务器--------");
        //1、定义我是服务器
        ServerSocket serverSocket = new ServerSocket(8888);   //自己的端口号

        //循环接收多个客户端
        boolean flag = true;
        while (flag){              //循环监听   客户端排队进入
            //2、阻塞监听
            Socket client = serverSocket.accept();
            System.out.println("---------一个客户端连接成功-----------");
            //开启多线程
            new Thread(new Channel(client)).start();
        }
        serverSocket.close();
    }
    //把执行过程封装一个静态内部内里面
    static class Channel implements Runnable{
        //属性 //把局部变量的作用域提上来
        private Socket client = null;
        private DataInputStream  dis = null;
        private DataOutputStream dos = null;

        //空参构造器
        public Channel() {
        }

        //构造器
        public Channel(Socket client) {
            this.client = client;
            try {
                //3、获取输入流
                dis = new DataInputStream(client.getInputStream());
                //6、获取输出流,结果响应给客户端
                dos = new DataOutputStream(client.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        //IO流,读入操作
        public String read(){
            String str = "";
            try {
                str = dis.readUTF();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str;
        }

        //获取输出流,响应给客户端
        public void write(String str){
            try {
                dos.writeUTF(str);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        //关闭进程
        public void close(){
            if(client!=null){
                try {
                    client.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(dis!=null){
                try {
                    dis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (dos!=null){
                try {
                    dos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
        @Override
        public void run() {
            //3、获取输入流
            //4、IO操作
            String str =  read();         //讲获取的输入流存储进字符串里

            //5、处理数据 ,判断
            String name = "";
            String pwd = "";

            String[] string = str.split("&");
            System.out.println(Arrays.toString(string));

            for (String s: string){
                String[] string2 = s.split("=");
                if("username".equals(string2[0])){
                    name =  string2[1];
                }else if("password".equals(string2[0])){
                    pwd = string2[1];
                }
            }

            //6、获取输出流,结果响应给客户端

            if("kebang".equals(name) && "123456".equals(pwd)){
                write("登录成功");
            }else {
                write("登录失败");
            }
//            //7、刷出
//            dos.flush();
            //8、关闭
            close();
        }
    }
}



这篇关于java网络编程之UDP&&TCP的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程