zoukankan      html  css  js  c++  java
  • java基础----->TCP和UDP套接字编程

      这里简单的总结一下TCP和UDP编程的写法,另外涉及到HttpUrlConnection的用法 。

    TCP套接字

    一、项目的流程如下说明:

    1、客户输入一行字符,通过其套接字发送到服务器。
    
    2、服务器从其连接的套接字中选取一行字符。
    
    3、服务器将该行字符转换成大写并通过连接的套接字返回给客户
    
    4、客户机从套接字中读取修改后的行,将其打印。

    二、客户端的代码如下:

    public class TCPClient {
        public static void main(String[] args) throws Exception {
            String sentence;
            String modifiedSentence;
            BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
            Socket clientSocket = new Socket("localhost", 9999);
            DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
            BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            sentence = inFromUser.readLine();
            outToServer.writeBytes(sentence + "
    ");
            modifiedSentence = inFromServer.readLine();
            System.out.println("FROM SERVER: " + modifiedSentence);
            clientSocket.close();
        }
    }

    三、服务器的代码如下:

    public class TCPServer {
        public static void main(String[] args) throws Exception {
            String clientSentence;
            String capitalzedSentence;
            ServerSocket serverSocket = new ServerSocket(9999);
            while (true) {
                Socket connectionSocket = serverSocket.accept();
                BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
                DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
                clientSentence = inFromClient.readLine();
                capitalzedSentence = clientSentence.toUpperCase() + "
    ";
                outToClient.writeBytes(capitalzedSentence);
            }
        }
    }

    四、运行的效果如下:

    UDP套接字

    项目的流程和上述的一样,这里不再赘述。

    一、UDP客户端的代码:

    public class UDPClient {
        public static void main(String[] args) throws Exception {
            BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
            DatagramSocket clientSocket = new DatagramSocket();
            InetAddress IPAddress = InetAddress.getByName("localhost");
            byte[] sendData = new byte[1024];
            byte[] receiveData = new byte[1024];
            String sentence = inFromUser.readLine();
            sendData = sentence.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9999);
            clientSocket.send(sendPacket);
    
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            clientSocket.receive(receivePacket);
            String modifiedSentence = new String(receivePacket.getData());
            System.out.println("FROM SERVER: " + modifiedSentence);
            clientSocket.close();
        }
    }

    二、UDP服务器的代码:

    public class UDPServer {
        public static void main(String[] args) throws Exception {
            DatagramSocket serverSocket = new DatagramSocket(9999);
            byte[] sendData = new byte[1024];
            byte[] receiveData = new byte[1024];
            while (true) {
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                serverSocket.receive(receivePacket);
                String sentence = new String(receivePacket.getData());
    
                InetAddress IPAddress = receivePacket.getAddress();
                int port = receivePacket.getPort();
                String capitalizedSentence = sentence.toLowerCase();
                sendData = capitalizedSentence.getBytes();
    
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
                serverSocket.send(sendPacket);
            }
        }
    }

    和TCP不同的是,UDP可以先运行客户端,然后再运行服务器。这是因为当你执行客户端时,客户端进程并没有试图和服务器发起连接。

    URLConnection的使用

    一、从urlconnection中读取数据:

    public class ReadFromUrlConn {
        public static void main(String[] args) throws Exception {
            URL url = new URL("https://www.baidu.com/");
            URLConnection connection = url.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null)
                System.out.println(inputLine);
            in.close();
        }
    }

     二、HttpURLConnection的post请求数据

    public void login() {
        HttpURLConnection httpURLConnection = null;
        InputStream inputStream = null;
        DataOutputStream out = null;
        try {
            URL url = new URL("http://localhost:9999/CsiiLearn/request/postTest.action");
            httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST"); // 大小写是有区别的
            httpURLConnection.setConnectTimeout(8000);
            httpURLConnection.setReadTimeout(8000);
            httpURLConnection.setDoOutput(true); // 这个需要在getOutputStream之前调用
            out = new DataOutputStream(httpURLConnection.getOutputStream());
            String params = "username=huxh&password=123456"; // post方法的请求参数
            out.writeBytes(params);
    
            inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder stringBuilder = new StringBuilder();
            String line = "";
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line);
            }
            System.out.println("response: " + stringBuilder.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    一个多线程的例子

    一、客户端的代码,请求得到一个随机产生的字符串

    public class MainClient {
        public static void main(String[] args) {
            try {
                Socket socket = new Socket("localhost", 9999);
                BufferedReader inFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String line = inFromServer.readLine();
                System.out.println(line);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    二、服务器的代码,服务于客户端的请求

    public class MainServer {
        public static void main(String[] args) {
            try {
                ServerSocket serverSocket = new ServerSocket(9999);
                ExecutorService executorService = Executors.newFixedThreadPool(10);
                while (true) {
                    Socket socket = serverSocket.accept();
                    System.out.println("request has accept");
                    executorService.execute(new MulitpleThread(socket));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    三、服务器开启的服务线程

    public class MulitpleThread implements Runnable {
        private Socket socket;
    
        MulitpleThread(Socket socket) {
            this.socket = socket;
        }
    
        @Override
        public void run() {
            try {
                DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                out.writeBytes("L。 " + new Random().nextInt(10));
                socket.close(); // 这个是需要的,要不然客户端没有得到数据。
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    友情链接

  • 相关阅读:
    Javascript之DOM的三大节点及部分用法
    Javascript之全局变量和局部变量部分讲解
    《TCP/IP详解 卷1:协议》系列分享专栏
    说一说MySQL的锁机制
    《TCP/IP详解 卷1:协议》第3章 IP:网际协议
    PHP连接MySql闪断自动重连的方法
    关于MySQL的锁机制详解
    React 源码中的依赖注入方法
    《Mysql高级知识》系列分享专栏
    《AngularJS学习整理》系列分享专栏
  • 原文地址:https://www.cnblogs.com/huhx/p/basejavausesocket1.html
Copyright © 2011-2022 走看看