Java网络编程基本知识点

  • 创建服务器(ServerSocket)
  • Socket
  • InetAddress 描述IP地址的类
  • URL类(统一资源定位符)


创建服务器(ServerSocket)

1.用于创建服务器,创建完毕会绑定一个端口号。
2.等待客户端连接
3.每连接一个客户端。服务器就会得到一个新的Socket对象,用于跟客户端通信

// 常用构造方法
// 创建一个基于TCP/IP协议的服务器,prot的范围是0-65535(建议1025-65535)
ServerSocket(int prot)

// 常用方法、
// 等待客户端连接
// 次方法会导致线程阻塞
//直到一个新的客户端连接成功。return Socket对象后,线程在继续执行。
Socket accept();

// void close()
// 释放占用的端口号,关闭服务器

Socket

两台计算机之间通信的端点,是网络驱动提供应用程序的一一种接口,一套标准,一种机制

// 构造方法 
Socket(String ip,int port)
//ip地址,服务器软件端口号

// 常用方法
//返回指向通信的另一端点的输出流
OutputStream getOutputStream();

//返回指向通信的另一端点的输入流
InoutStream getInputStream();

// 关闭套接字
void close();

注意
在网络编程时, 获取输入输出流的操作 ,对于客户端与服务器来说是相对的
客户端的输入流, 输入的是服务器的输出流 输出的内容.
客户端的输出流, 输出到了服务器的输入流中.
所以 在使用时, 需要注意以下一点规则:
客户端与服务器获取流的顺序必须是相反的:
例如:客户端先得到了输入流 , 那服务器必须先获取输出流

案例:echo程序
客户端:

//1.连接服务器
Socket socket = new Socket("192.168.102.228",8888);

//2.得到输出流
//2.1 得到输出流
OutputStream os = socket.getOutputStream();
//2.2 将输出流, 转换为打印流
PrintStream ps = new PrintStream(os);

//3.得到输入流
//3.1 得到输入流
InputStream is = socket.getInputStream();
//3.2 将字节输入流, 转换为字符输入流 , 并转换为逐行读取流
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

//4.循环接收用户输入
Scanner input = new Scanner(System.in);
while(true) {
    System.out.println("请输入要发送给服务器的内容:");
    String text1 = input.nextLine();
    
    //5.用输出打印流 将用户输入的内容, 发送给服务器
    ps.println(text1);
    
    //6.逐行读取流 接收服务器回复的消息
    String text2 = br.readLine();
    System.out.println(text2);
    
    
}

服务器端:

public static void main(String[] args) throws Exception {
    //1.启动服务器, 并侦听8888端口号
    ServerSocket server = new ServerSocket(8888);
    
    //*2.打印提示
    System.out.println("服务器已启动 , 等待客户端连接中...");
    
    //3. 等待客户机连接
    Socket socket = server.accept();
   System.out.println("一个客户机连接成功:"+socket.getInetAddress().toString());
  
   //4.获取输入流
   //4.1 获取输入流
   InputStream is = socket.getInputStream(is);
   //4.2 将输入的字节流 ,转换为字符流
   InputStreamReader isr = new InputStreamReader(is);
   //4.3 将字符流, 转换为逐行读取流 
   BuffereReader br = new BuffereReader(isr);
   
    //5. 获取输出流 
    //5.1 获取输出流 
    OutputStream os = socket.getOutputStream(); 
    //5.2 将字节输出流, 转换为打印流 
    PrintStream ps = new PrintStream(os); 
    while(true) { 
        //6. 循环读取一行行的数据 ,读取操作会导致线程的阻塞, 直到客户端真的发送了数据, 
        //服务器才能接到, 顺序继续执行下面的代码 
        String text = br.readLine(); 
        //7. 将这个文字, 再打印给客户端 
        ps.println("服务器"+text); 
        if("886".equals(text)) { 
            break; 
        } 
}

InetAddress 描述IP地址的类

得到InetAddress对象的方法:
InetAddress ip = InetAddress.getByName(“192.168.102.228”);

在UDP协议中. 通过数据包DatagramPacket的getAddress方法, 可以得到数据包来自哪个ip
在TCP协议中, 通过套接字Socket的getInetAddress方法, 可以得到套接字连接的ip地址.

//常用方法
String getHostAddress();
//获取Ip地址字符串

String getHostName()
//计算机名称,当无法获取时,获取Ip地址

URL类(统一资源定位符)

//3.1 创建一个网址对象(统一资源定位符) 
URL url = new URL(urlString); 
//3.2 打开链接 , 并得到链接对象 
URLConnection conn = url.openConnection();