【网络编程】

网络编程

软件结构

  • Client/Server(C/S结构)
  • Browser/Server(B/S结构)

Windows系统中执行命令:

//查看占用8888端口号的进程PID
netstat -aon|findstr 8888
//显示结果,找到占用8888端口号的PID
TCP 0.0.0.0:8888 0.0.0.0:0 LISTENING 2696
//强制关闭(杀死)
taskkill /F /pid 2696

注意,需要使用管理员的权限来运行命令窗口

Ubuntu系统中执行命令:

//查看占用8888端口号的进程PID
netstat -anp | grep :8888
//显示结果,找到占用8888端口号的PID
tcp 0 0 :::8888 :::* LISTEN 3626/java
//强制关闭(杀死)
kill -9 3626

TCP/IP编程

可靠的,面向右连接的

了解客户端和服务端的步骤;

ServerSocket:服务端

  • 创建客户端对象:serverSocket=new ServerSocket(9909);
  • 等待客户端发送socket:Socket s=serverSocket.accept();
  • 获取输入流输出流:
    • s.getOutputStream();
    • s.getInputStream();
  • 包装流:缓冲流或者对象流
  • 读数据写数据
  • 关闭资源:
    • 关闭流;
    • 关闭severSocket.close();

Socket:客户端

  • 创建客户端对象:Socket s=new Socket("127.0.0.1",9909);
  • 获取输入输出流:
  • 包装流:
  • 读写数据:
  • 关闭资源:

案例

package com.chapter12.classcode;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    //服务器端
    public static void main(String[] args) {
        ServerSocket serverSocket=null;
        BufferedReader br=null;
        BufferedWriter bw=null;
        try {
            serverSocket=new ServerSocket(9909);
            System.out.println("等待客户端");
            //等待客户端发送过来socket
            Socket s=serverSocket.accept();
            System.out.println("拿到客户端的soket" + s);

            //读输入输出流
            InputStream in = s.getInputStream();
            //包装流
            br=new BufferedReader(new InputStreamReader(in));
            //读数据,写数据
            String readLine = br.readLine();//会造成堵塞,一直等着读数据
            System.out.println(readLine);

//            OutputStream out = s.getOutputStream();
//            bw=new BufferedWriter(new OutputStreamWriter(out));
//            bw.write("收到");
//            bw.flush();

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (br!=null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (bw!=null) {
                    try {
                        bw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }if (serverSocket!=null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
package com.chapter12.classcode;

import java.io.*;
import java.net.Socket;

public class TcpClient {
    //客户端
    public static void main(String[] args) {
        BufferedWriter bw=null;
        BufferedReader br=null;
        OutputStream os=null;
        Socket s=null;
        //创建socket
        try {
             s=new Socket("127.0.0.1",9909);
            //给服务器端写数据
             os=s.getOutputStream();
            //包装流 先把字节流转换成字符流
             bw=new BufferedWriter(new OutputStreamWriter(os));
             //读写数据
            bw.write("hello world
            bw.flush();

           /* InputStream in = s.getInputStream();
            br=new BufferedReader(new InputStreamReader(in));
            String s1 = br.readLine();
            System.out.println(s1);*/
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (os!=null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }if (bw!=null) {
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }if (br!=null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (s!=null) {
                try {
                    s.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

先启动服务端,服务端会等待客户端启动然后建立连接,再启动客户端,

结果如下:

UDP编程

面向无连接的,不可靠的,高效率

在UDP通信协议下,两台计算机之间进行数据交互,并不需要先建立连接,客户端直接往指定的IP和端 口号上发送数据即可,但是它并不能保证数据一定能让对方收到。

java.net.DatagramSocketjava.net.DatagramPacket 是UDP编程中使用到的俩个类,客户端 和服务器端都使用这个俩类

java.net.DatagramSocket 负责接收和发送数据

java.net.DatagramPacket 负责封装要发送的数据和接收到的数据

URL

URI(uniform resource identifier),统一资源标识符,用来唯一的标识一个资源。

URL(uniform resource locator),统一资源定位符,它是一种具体的URI,即URL可以用来标识一个资 源,而且还指明了如何定位这个资源。

例如,http://127.0.0.1/hello ,这就是一个URL,它不仅标识了一个资源,还能定位这个资源。

例如,/hello ,这就是一个URI,它只是标识了一个资源。

上一篇:Spring — 自动注入 ?


下一篇:获取系统临时文件目录,生成txt文件