网络编程,IP地址,TCP 编程 UDP编程

package cn.socket001;
//网络编程:
/*网络概念
把多台计算机通过物理线路连接起来,就形成了网络。目的在于交换数据和共享信息。

网络通信的三要素
【1】IP地址:唯一标识网络上的每一台计算机。两台计算机之间通信的必备有素
【2】端口号:计算机中应用的标号(代表一个应用程序)
0-1024系统使用或保留端口
常见端口:http:80 stmp: 25 ftp:21
   有效端口0-65536,开发者可以的端口是1025-65536之间。一些第三方引用如mysql:3306 oracle:1251。
【3】通信协议:通信的规则 TCP,UDP
*/
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;

public class Test01 {
public static void main(String[] args) {
    //InetAddress 表示IP地址。( getLocalHost()  返回本地主机。)
    
    try {
        
        InetAddress ine=InetAddress.getLocalHost();
        System.out.println(ine.toString());
        //LATTOP-L0AH1H9U/192.168.6.130
        // 获取主机名称
        System.out.println(ine.getHostName());
        //LAPTTOP-L0AH1H9U
        System.out.println(ine.getHostAddress());
        //获取主机IP地址:192.168.6.130
        
        // 获取局域网指定名称网络主机的IP
        InetAddress ip1 = InetAddress.getByName("LATTOP-L0AH1H9U");
        System.out.println(ip1.toString());
        //LATTOP-L0AH1H9U/192.168.6.130
        
        // 在给定IP地址的情况下,获取主机IP信息
        byte[] ipArr = {(byte)192,(byte)168,(byte)2,(byte)130};
        InetAddress ip2 = InetAddress.getByAddress(ipArr);
        System.out.println(ip2.getHostName());
        //LATTOP-L0AH1H9U
        
        
        
        // 获取广域网指定名称网络主机的IP
        InetAddress ip3 = InetAddress.getByName("www.baidu.com");
        System.out.println(ip3.toString());
            //www.baidu.com/14.215.177.39
        InetAddress ip4 = InetAddress.getByName("www.bjsxt.com");
        System.out.println(ip4.toString());
        //www.bjsxt.com/47.93.94.43
        
    } catch (UnknownHostException e) {
    
        e.printStackTrace();
    }
    
}
}

网络通信模型

IP地址分类

特殊IP

  • 0.0.0.0:本机
  • 127.0.0.1:本机回环地址,用于本机测试
  • 255.255.255.255:当前子网,一般用于向当前子网广播信息
package cn.socket001;
/*TCP编程中,如果要完成通信,通信双方必须要创建socket,通过socket完成通信。
 * 
 * TCP通信步骤
[1] 服务器启动ServerSocket作为通信的Server端,等待客户端链入。
[2] 客户端创建Socket作为通信的Client端
[3] Client端链入Server端后建立可靠的、双向的、持续性的、点对点的通讯连接,即可通信。
*/
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务器server socket
public class Socket01 {
public static void main(String[] args) {
    System.out.println("服务器启动");
    //[1]创建ServerSocket作为通信的Server端(服务器)
    ServerSocket se=null;
    //创建Socket作为通信的Client端,等待连接客户端
    Socket so=null;
    try {
        //serversocket的端点
        se=new ServerSocket(8000);
        //等待连接客户端
        so=se.accept();
        System.out.println(se.getInetAddress().getHostAddress()+"已连接");
        //客户端连接成功后向客户端发送信息
        OutputStream out=so.getOutputStream();
        String a="瓦爱你";
        byte [] buf=a.getBytes("utf8");
        out.write(buf);
        //向客户端表示已发送玩的提示信息
        so.shutdownOutput();
        
        
        //接受来自客户端的信息
        InputStream in=so.getInputStream();
        byte[] buf2=new byte[1024];
        int len=in.read(buf2);
        String st=new String(buf2,0,len,"utf8");
        System.out.println(so.getInetAddress().getHostAddress()+st);
        //向客户端表示已接收完
        so.shutdownInput();
        //关闭通道
        out.close();
        in.close();
    } catch (IOException e) {
        //数据流异常
        e.printStackTrace();
    }
    
}
}

package cn.socket001;
/*TCP编程中,如果要完成通信,通信双方必须要创建socket,通过socket完成通信。
 * 
 * TCP通信步骤
[1] 服务器启动ServerSocket作为通信的Server端,等待客户端链入。
[2] 客户端创建Socket作为通信的Client端
[3] Client端链入Server端后建立可靠的、双向的、持续性的、点对点的通讯连接,即可通信。
*/
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
//客户端Socket
public class Socket02 {
public static void main(String[] args) {
    //创建Socket作为通信的Client端
    Socket so=null;
    try {
        //连接服务器(服务器地址,端口)
        so=new Socket("192.168.2.130",8000);
        //接收来自服务器的信息
        InputStream in=so.getInputStream();
        byte [] buf=new byte[1024];
        int len=in.read(buf);
        String st=new String(buf,0,len,"utf8");
        System.out.println(st);
        //接受完成
        so.shutdownInput();
        
        
        String st2="我也爱你";
            byte[] buf2=st2.getBytes("utf8");
            //向服务器发送信息
        OutputStream out=so.getOutputStream();
        out.write(buf2);
        //向服务器表示已发送完信息的提示信息
        so.shutdownOutput();
        //关闭通道
        out.close();
        in.close();
    } catch (IOException e) {
        //数据流异常
        e.printStackTrace();
    }
}
}



常见异常

 端口被占用

java.net.BindException: Address already in use: JVM_Bind

服务器未启动

java.net.ConnectException: Connection refused: connect

 连接超时异常

 SocketTimeoutException  当网速很慢时,可能发生连接超时异常。

UDP

package cn.cn01;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

import sc.IO.while01;


/*UDP 编程(音频,视频)
 * UDP编程中,如果要完成通信,通信双方必须要创建DatagramSocket,通过DatagramSocket完成通信。
数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器

UDP步骤:
[1] 创建一个DatagramSocket用于表示发送端,通过send方法发送数据报
[2] 创建一个DatagramSocket用于表示接收端,通过receive方法发送数据报
 * */
public class Client01 {
    //需求:写一个可以互相聊天的编程
public static void main(String[] args) throws IOException {
    // 发送端:主动发送信息
    System.out.println("发送端开始发送信息...");
    Scanner sc=new Scanner(System.in);
    // 【1】创建socket并指定发送数据的端口
    DatagramSocket so=new DatagramSocket(8000);
InetAddress i=InetAddress.getByName("192.168.2.235");
    // 【2】创建数据报包
    while(true){
        
    System.out.print("A说:");
    String msg=sc.nextLine();
    byte[] buy=msg.getBytes();
    
    DatagramPacket dp=new DatagramPacket(buy,buy.length,i,9000);
    so.send(dp);
    
    
    // 接收消息
    byte [] buy01=new byte[1024];
    DatagramPacket dp01=new DatagramPacket(buy01, buy.length);
    so.receive(dp01);
    String str=new String(buy01,0,dp01.getLength());
    System.out.println(dp01.getAddress().getHostName()+":"+str);
    
    }

    
}
}


package cn.cn01;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Scanner;

//需求:写一个可以互相聊天的编程
public class Client02 {
public static void main(String[] args) throws IOException {
    // 接收端:接收信息
    System.out.println("启动接收端...");
    Scanner sc=new Scanner(System.in);
    
    // 【1】创建一个 DatagramSocket
    DatagramSocket so=new DatagramSocket(9000);
    // 【2】接收消息
    while(true){    
    byte[] buy =new byte[1024];
    DatagramPacket dp=new DatagramPacket(buy, buy.length);    
    so.receive(dp);
    String msg=new String(buy,0,dp.getLength());
    System.out.println(dp.getAddress().getHostName()+":"+msg);
    
    
    // 发送信息
    System.out.println("B说:");
    String str=sc.nextLine();
    byte [] bye=str.getBytes();
    DatagramPacket dd=new DatagramPacket(bye,0, bye.length, dp.getAddress(), dp.getPort());
    so.send(dd);
}
}
}


 
原文地址:https://www.cnblogs.com/406070989senlin/p/10846376.html