java中TCP与UDP协议的使用以及多线程服务器编写

版权声明:最短的时间最核心的知识,有疑问,欢迎进行留言。 https://blog.csdn.net/lizhidefengzi/article/details/79335545

TCP协议使用

客户端服务器代码:

package xdl.day19;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TestServer {

    public static void main(String[] args) {

        try{
        //1.创建ServerSocket类型的对象,并绑定指定的端口
        ServerSocket ss=new ServerSocket(8888);
        System.out.println("等待客户端的连接请求...");
        Socket s=ss.accept();
        System.out.println("客户端连接成功!");

        //2.等待客户端的连接请求,调用accept()方法
        //3.得到Socket类型的对象,使用输入输出流进行通信

        //使用BufferReader类来接受客户端发来的内容
        BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String str=br.readLine();
        System.out.println("客户端发来的数据为:"+str);
        //4.关闭相关的资源
        s.close();
        ss.close();
    }catch(Exception e){
        e.printStackTrace();
        }
    }

}

客户端代码

package xdl.day19;


import java.io.PrintStream;
import java.net.Socket;

public class TestClient {

    public static void main(String[] args) {

        try{
        //1.创建Socket类型的对象,并提供服务器IP地址和端口号
        Socket s=new Socket("169.254.167.40",8888);
        //2.使用输入输出流进行通信
        //使用PrintStream类向服务器发送字符串内容“hello”
        PrintStream ps=new PrintStream(s.getOutputStream());
        ps.println("hello");

        System.out.println("成功发送数据到服务器");
        //3.关闭相关的资源
        ps.close();
        s.close();

    }catch(Exception e){
        e.printStackTrace();
        }
    }

}

练习:

  • 要求客户端发送的内容由用户手动输入,使用BufferedReader类。
  • 要求服务器收到客户端的消息之后,向客户端回发消息“I Receieved!”
  • 要求服务器和客户端可以不断进行通信,当客户端发送“bye”时结束通信。

- 要求服务器能够同时支持多个客户端的连接,而且能够和多个客户端同时聊天,多线程。

服务线程

package xdl.day19;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class ServerThread extends Thread {
    private Socket s;
    public ServerThread(Socket s){
        this.s=s;
    }
    @Override
    public void run(){


        try{
        //只要有客户端连接成功,则应启动一个新线程为之服务,主线程始终接待

                //2.等待客户端的连接请求,调用accept()方法
                //3.得到Socket类型的对象,使用输入输出流进行通信

                //使用BufferedReader类来接受客户端发来的内容
                BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
                PrintStream ps=new PrintStream(s.getOutputStream());

                while(true){
                String str=br.readLine();
                if("bye".equalsIgnoreCase(str))break;
                System.out.println("客户端发来的数据为:"+str);

                //向客户端回发消息
                //使用PrintStream类向服务器发送字符串内容“I Received!”

                ps.println("I Received!");
                System.out.println("成功发送数据到客户端!");
                }

                //4.关闭相关的资源、
                ps.close();
                br.close();
                s.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

服务器

package xdl.day19;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TestServer {

    public static void main(String[] args) {

        try{
        //1.创建ServerSocket类型的对象,并绑定指定的端口
        ServerSocket ss=new ServerSocket(8888);

        while(true){
        System.out.println("等待客户端的连接请求...");
        Socket s=ss.accept();
        System.out.println("客户端"+s.getInetAddress()+"连接成功!");

        //只要有客户端连接成功,则应启动一个新线程为之服务,主线程始终进行接待
        new ServerThread(s).start();

        }
        //ss.close();
    }catch(Exception e){
        e.printStackTrace();
        }
    }

}

客户端

package xdl.day19;


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class TestClient {

    public static void main(String[] args) {

        try{
        //1.创建Socket类型的对象,并提供服务器IP地址和端口号
        Socket s=new Socket("169.254.167.40",8888);
        //2.使用输入输出流进行通信
        //提示用户输入要发送的内容,并使用变量记录


        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        PrintStream ps=new PrintStream(s.getOutputStream());
        BufferedReader br2=new BufferedReader(new InputStreamReader(s.getInputStream()));

        while(true){
        System.out.println("请输入要发送的内容:");
        String str=br.readLine();

        //使用PrintStream类向服务器发送字符串内容“hello”
        ps.println(str);

        System.out.println("成功发送数据到服务器");
        //使用BufferReader类来接受客户端发来的内容
        String str2=br2.readLine();
        if(str2.equalsIgnoreCase(str2))break;
        System.out.println("服务器发来的数据为:"+str2);

        }
        //3.关闭相关的资源
        br.close();
        br2.close();
        ps.close();
        s.close();

    }catch(Exception e){
        e.printStackTrace();
        }
    }

}

UDP协议使用

接收方

package xdl.day19;


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class TestClient {

    public static void main(String[] args) {

        try{
        //1.创建Socket类型的对象,并提供服务器IP地址和端口号
        Socket s=new Socket("169.254.167.40",8888);
        //2.使用输入输出流进行通信
        //提示用户输入要发送的内容,并使用变量记录


        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        PrintStream ps=new PrintStream(s.getOutputStream());
        BufferedReader br2=new BufferedReader(new InputStreamReader(s.getInputStream()));

        while(true){
        System.out.println("请输入要发送的内容:");
        String str=br.readLine();

        //使用PrintStream类向服务器发送字符串内容“hello”
        ps.println(str);

        System.out.println("成功发送数据到服务器");
        //使用BufferReader类来接受客户端发来的内容
        String str2=br2.readLine();
        if(str2.equalsIgnoreCase(str2))break;
        System.out.println("服务器发来的数据为:"+str2);

        }
        //3.关闭相关的资源
        br.close();
        br2.close();
        ps.close();
        s.close();

    }catch(Exception e){
        e.printStackTrace();
        }
    }

}

发送方

package xdl.day19;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class TestSend {

    public static void main(String[] args) {
        try{
        //1.创建DatagramSocket类型的对象
        DatagramSocket ds=new DatagramSocket();
        //2.创建DatagramPacket类型的对象,用于接收数据内容
        byte[] data="hello".getBytes();
        DatagramPacket dp=new DatagramPacket(data,data.length,
                InetAddress.getLocalHost(),8888);

        ds.send(dp);
        System.out.println("成功发送数据内容!");
        //4.关闭套接字
        ds.close();
        ///2.创建DatagramPacket类型的对象,提供接收方的IP地址和端口号
        //3.发送数据内容,使用send()方法
        //4.关闭套接字

    }catch(Exception e){
        e.printStackTrace();}
    }

}

注意事项:

打印格式出现问题:

解决办法:控制字符串长度,是占位符的原因。

        System.out.println("接收到的数据内容是:"+new String(data,0,dp.getLength())+"!");

猜你喜欢

转载自blog.csdn.net/lizhidefengzi/article/details/79335545