文章目录
一.网络通信概念
1.网络通信
 
 2.网络
 
 3.ip地址
 
 
 4.域名和端口
 
 通过ping指令可以查询对应域名的ip
 
 5.网络协议
 人类语言的本身也是一种协议!
 
 
 6.TCP和UDP
 
 7.Socket
 
二.代码
1.InetAddress
 
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
 * @author ZHR
 * @version 1.0
 **/
public class InetAddress_ {
    public static void main(String[] args) throws UnknownHostException {
        //1.获取本机的InetAddress对象
        System.out.println(InetAddress.getLocalHost());//DESKTOP-9GPVRSO/10.165.181.208
        //2.根据指定主机名获取InetAddress对象
        System.out.println(InetAddress.getByName("DESKTOP-9GPVRSO"));//DESKTOP-9GPVRSO/10.165.181.208
        //3.根据域名获取InetAddress对象
        System.out.println(InetAddress.getByName("www.baidu.com"));//www.baidu.com/180.101.49.12
        //4.通过InetAddress对象获取对应IP地址
        System.out.println(InetAddress.getByName("www.baidu.com").getHostAddress());//180.101.49.12
        //5.通过InetAddress对象获取对应的主机名
        System.out.println(InetAddress.getLocalHost().getHostName());//DESKTOP-9GPVRSO
    }
}
 
2.TCP网络编程
 
 
字节流编程
 
服务端代码:
package socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * @author ZHR
 * @version 1.0
 **/
public class Server {
    public static void main(String[] args) throws IOException {
        //1.在本机 端口9999监听 ,等待连接
        //细节:要求本机没有其他服务器监听9999端口
        ServerSocket serverSocket = new ServerSocket(9999);
        //2.当没有客户端连接9999端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回一个socket对象
        //这个serverSocket可以通过accept()返回多个socket[],多个客户端连接服务器
        Socket socket = serverSocket.accept();
        //3.接收服务器传的数据,显示数据
        InputStream inputStream = socket.getInputStream();
        byte[] buf = new byte[1024];
        int readLen = 0;
        while((readLen = inputStream.read(buf))!=-1){
            System.out.println(new String(buf,0,readLen));
        }
        //4.向服务端发送数据
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello client".getBytes());
        socket.shutdownOutput();
        //5.关闭流和socket
        socket.close();
        inputStream.close();
        outputStream.close();
        serverSocket.close();
    }
}
 
客户端代码:
package socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * @author ZHR
 * @version 1.0
 **/
public class Server {
    public static void main(String[] args) throws IOException {
        //1.在本机 端口9999监听 ,等待连接
        //细节:要求本机没有其他服务器监听9999端口
        ServerSocket serverSocket = new ServerSocket(9999);
        //2.当没有客户端连接9999端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回一个socket对象
        //这个serverSocket可以通过accept()返回多个socket[],多个客户端连接服务器
        Socket socket = serverSocket.accept();
        //3.接收服务器传的数据,显示数据
        InputStream inputStream = socket.getInputStream();
        byte[] buf = new byte[1024];
        int readLen = 0;
        while((readLen = inputStream.read(buf))!=-1){
            System.out.println(new String(buf,0,readLen));
        }
        //4.向服务端发送数据
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello client".getBytes());
        socket.shutdownOutput();
        //5.关闭流和socket
        socket.close();
        inputStream.close();
        outputStream.close();
        serverSocket.close();
    }
}
 
注意!
 需要用socket.shutdownOutput() 提示已经发送完成
字符流编程
 
 注意!!!!!!
1.字符流写的时候需要手动刷新!!!! flush!!
2. bufferedWriter.newLine() 表示写入内容结束,相当于socket.shutdownOutput() ,但是要求对方使用readline()方法接受!
3.需要用转换流进行转换
服务端代码:
package zijieliu;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * @author ZHR
 * @version 1.0
 **/
public class Server {
    public static void main(String[] args) throws IOException {
        //1.在本机 端口9999监听 ,等待连接
        //细节:要求本机没有其他服务器监听9999端口
        ServerSocket serverSocket = new ServerSocket(9999);
        //2.当没有客户端连接9999端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回一个socket对象
        //这个serverSocket可以通过accept()返回多个socket[],多个客户端连接服务器
        Socket socket = serverSocket.accept();
        //3.接收服务器传的数据,显示数据
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //需要用readline()方法读
        System.out.println(bufferedReader.readLine());
        //4.向服务端发送数据
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bufferedWriter.write("hello client");
        bufferedWriter.newLine();
        bufferedWriter.flush();
        //socket.shutdownOutput();
        //5.关闭流和socket
        socket.close();
        bufferedWriter.close();
        bufferedReader.close();
        serverSocket.close();
    }
}
 
客户端代码:
package zijieliu;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * @author ZHR
 * @version 1.0
 **/
public class Client {
    public static void main(String[] args) throws IOException {
        //客户端发送hello server送给服务端
        //1.连接服务器(服务器ip,端口),连接本机的9999端口
        Socket socket = new Socket(InetAddress.getLocalHost(),9999);
        //2.连接上后,得到和该socket关联的输出流,通过该流发送内容
        //使用字符流
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bufferedWriter.write("hello server");
        bufferedWriter.newLine();//表示写入内容结束,要求对方使用readline()方法读!
        bufferedWriter.flush();
        //提示已经发送完成
        //socket.shutdownOutput();
        //3.接受服务端发送的数据
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(bufferedReader.readLine());
        //4.关闭流和socket
        bufferedReader.close();
        bufferedWriter.close();
        socket.close();
    }
}
 
上传文件
 
采取边读边写的方法
客户端代码:
        //提供端口
        ServerSocket serverSocket = new ServerSocket(8888);
        //接受socket
        Socket socket = serverSocket.accept();
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("src/copy.jpg"));
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        //边读边写
        byte[] buf = new byte[1024];
        int readLen = 0;
        while((readLen = bis.read(buf))!=-1){
            bos.write(buf,0,readLen);
            bos.flush();
        }
        //关闭流
        serverSocket.close();
        socket.close();
        bos.close();
        bis.close();
 
客户端代码:
        //连接服务端
        Socket socket = new Socket(InetAddress.getLocalHost(),8888);
        //设置客户端传入文件的路径
        String filePath = "c:/io/copy.jpg";
        //讲数据送到通路,边读边写
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        int readLen = 0;
        byte[] buf = new byte[1024];
        while((readLen = bis.read(buf))!=-1){
            bos.write(buf,0,readLen);
            bos.flush();
        }
        //告诉客户端已经写完
        socket.shutdownOutput();
        //关闭流
        bos.close();
        bis.close();
        socket.close();
 
3.netstat
 
 4.UDP网络编程
 
 
 
 
 发送端代码:
package UDP;
import java.io.IOException;
import java.net.*;
/**
 * @author ZHR
 * @version 1.0
 **/
public class Server {
    public static void main(String[] args) throws IOException {
        //1.创建 DatagramSocket 对象,准备在9998端口数据 接受/发送数据
        DatagramSocket socket = new DatagramSocket(9998);
        //2.讲需要发送的数据封装到DatagramPacket对象
        byte[] data = "明天吃火锅吗".getBytes();
        //new DatagramPacket(byte内容数组,数组长度,ip地址,端口)
        DatagramPacket packet =
                new DatagramPacket(data,data.length, InetAddress.getByName("10.165.181.208"),9999);
        //3.发送数据
        socket.send(packet);
        byte[] receiveData = new byte[1024];
        DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);
        socket.receive(receivePacket);
        int length = receivePacket.getLength();
        receiveData = receivePacket.getData();
        System.out.println(new String(receiveData,0,length));
        
        socket.close();
    }
}
 
接收端代码:
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
 * @author ZHR
 * @version 1.0
 **/
public class Client {
    public static void main(String[] args) throws IOException {
        //1.创建一个 DatagramSocket 对象,在9999端口接受对象
        DatagramSocket socket = new DatagramSocket(9999);
        //2.创建一个 DatagramPacket 对象 , 准备接收数据
        //  UDP中,一个数据包最大传送的大小为64k
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf,buf.length);
        //3.调用接收方法,讲网络上传输的 DatagramPacket 对象填充到 socket对象
        //  当有数据包发送到本机的9999端口时,就会接收到数据,否则,就会阻塞等待
        socket.receive(packet);
        //4.讲packet进行拆包,取出数据,并提示
        int length = packet.getLength();
        byte[] data = packet.getData();
        System.out.println(new String(data,0,length));
        byte[] dataSend = "收到".getBytes();
        DatagramPacket sendPacket =
                new DatagramPacket(dataSend,dataSend.length, InetAddress.getLocalHost(),9998);
        socket.send(sendPacket);
        socket.close();
    }
}










