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 + "\n");
        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() + "\n";
            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();
        }
    }
}
复制代码

 

posted on 2018-07-19 02:24  跳刀玛利亚  阅读(105)  评论(0编辑  收藏  举报

导航