Java之Socket实现网络通信

简介

网络编程,其实质是实现两台不同计算机之间的数据传递,将其分为客户端和服务器端。
客户端:如手机App、浏览器、QQ等
服务器端:主要是存储和处理数据


image.png

IP地址:唯一标识某一台电脑
端口号:唯一标识电脑的某一个进程(程序)80

网络中的数据传输:Socket实现->套接字
Socket类:客户端
ServerSocket类:服务器端

目录

1.网址解析

2.Socket和ServerSocket的简单使用

3.Socket实现对话聊天

详解

1.网址解析

在浏览器中输入网址:http://www.baidu.com.search?code=android,这个网址(即URL:统一的资源定位)就包含以下几个部分:
1.http/https :传输协议 TCP/IP
2.www.baidu.com: 域名 ,表示一台网络中的电脑
 域名其本质是 IP(ipv4、ipv6)地址:唯一标识一台网络中的电脑
 一个域名只能对应一个IP地址,而一个IP地址可对应多个域名
3.search :对应的后台程序文件,如 php、java、jsp
4.?:表示运行这个程序需要传递的参数
5.code=android ,code是服务器端规定的字段,如果有多个参数使用&符号连接

2.Socket和ServerSocket的简单使用

创建两个类,分别模拟Client(客户端)和Server(服务器端)
1.在Server里创建ServerSocket对象,确定端口号,并记录连接的Client

class Server {
    public static void main(String[] args) throws IOException {
        // 创建服务器端的ServerSocket
        ServerSocket serverSocket = new ServerSocket(9999);

        // 监听客户端连接
        // 当有客户端来连接这个服务器 就可以得到对应的socket
        // 当没有客户端来连接   服务器一直在这里等待
        Socket clientSocket = serverSocket.accept();
    }
}

2.在Client里面创建Socket对象,模拟客户端连接服务器
注意:127.0.0.1是自己电脑的本地回路

class Client {
    public static void main(String[] args) throws IOException {
        // 连接服务器 获取socket
        Socket socket = new Socket("127.0.0.1", 9999);
    }
}

3.连接成功后向Client客户端返回一句话,然后客户端向服务器上传一张图片,服务器将传递来的图片以文件形式储存
Client客户端

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

class Client{
    public static void main(String[]args) throws IOException {
        // 连接服务器 获取socket
        Socket socket = new Socket("127.0.0.1",9999);

        // 创建服务器端对应的输入流   用于接收服务器端传递来的数据
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(br.readLine());

        // 向服务器端发送文件(图片)
        // 1.将文件读取进内存
        FileInputStream fis = new FileInputStream("C:\\Users\\Inuyasha\\Desktop\\yan.jpg");

        // 2.将文件输出到服务器端
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());

        // 3.将文件的内容一点一点的传输给服务器
        byte[] data = new byte[1024];
        int len = -1;
        while ((len = fis.read(data)) != -1){
            bos.write(data, 0, len);
        }
        // 关闭输出
        socket.shutdownOutput();
    }
}

Server服务器端

class Server{
    public static void main(String[]args) throws IOException {
        // 创建服务器端的ServerSocket
        ServerSocket serverSocket = new ServerSocket(9999);

        // 监听客户端连接
        // 当有客户端来连接这个服务器 就可以得到对应的socket
        // 当没有客户端来连接   服务器一直在这里等待
        Socket clientSocket = serverSocket.accept();

        // 创建客户端对应的输出流  用于向客户端发送数据
        PrintStream ps = new PrintStream(clientSocket.getOutputStream());
        ps.println("连接成功!!!");

        
        // 创建客户端对应的输入流  用于接收客户端传递来的数据
        BufferedInputStream bis = new BufferedInputStream(clientSocket.getInputStream());
        
        // 文件对应的输出流
        FileOutputStream fos = new FileOutputStream("C:\\Users\\Inuyasha\\Desktop\\ServerReceive\\yan.jpg");
        byte[]data = new byte[1024];
        int len = -1;
        while ((len = bis.read(data)) != -1){
            fos.write(data, 0, len);
        }
        clientSocket.shutdownOutput();
    }
}

3.Socket实现对话聊天

1.一个类实现Runnable接口,用于接收对方传来的数据

// 创建一个子线程处理socket对应端接收服务器端的数据
class ReceiveThread implements Runnable{
    // 保存操作的socket对象
    private Socket socket;

    public ReceiveThread(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        BufferedReader br = null;
        try {
            // 获取socket对应的的输入流对象
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            // 读取数据
            String receiveStr = new String();
            while ((receiveStr = br.readLine()) != null){
                System.out.println(receiveStr);
            }
        } catch (IOException e) {
            System.out.println("网络出错");
            System.exit(-1);
        } finally {
            try {
                if (br != null){
                    br.close();
                }

                if (socket != null){
                    socket.close();
                }
            } catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}

2.创建Server服务器端

class Server{
    public static void main(String[]args) throws IOException {
        // 创建服务器
        ServerSocket serverSocket = new ServerSocket(9999);

        // 监听连接了的客户端
        Socket cliertSocket = serverSocket.accept();

        //创建子线程  处理客户端传递来的数据
        new Thread(new ReceiveThread(cliertSocket)).start();

        // 终端输入流对象
        BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));

        // 客户端输出流
        PrintStream ps = new PrintStream(cliertSocket.getOutputStream());

        // 读取终端的输入  将输入传递给客户端
        String sendStr = new String();
        while ((sendStr = keyin.readLine()) != null){
            ps.println(sendStr);
        }
    }
}

3.创建Client客户端

class Client{
    public static void main(String[]args) throws IOException {
        // 连接服务器端
        Socket socket = new Socket("127.0.0.1",9999);

        // 用一个子线程处理服务器端传递来的数据
        new Thread(new ReceiveThread(socket)).start();

        // 从终端接收数据 发送个服务器端
        BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));
        PrintStream ps = new PrintStream(socket.getOutputStream());
        String sendStr = new String();
        while ((sendStr = keyin.readLine()) != null){
            ps.println(sendStr);
        }
    }
}

将两个两个类同时运行,实现效果:


效果

总结
网络实现的功能神奇,但其使用却是不难,只是需要灵活地运用。当传递大的视频等文件时,通常都需要创建Thread子线程来完成,以免阻塞主线程。以上介绍的只是简单使用,想要深入了解,还需要学习许多。


image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。 按照计算机网络的定义,通过一定...
    蛋炒饭_By阅读 5,080评论 0 10
  • 1 网络编程----TCPNo24 【 public class Server { public static...
    征程_Journey阅读 5,092评论 0 4
  • 7.2 面向套接字编程我们已经通过了解Socket的接口,知其所以然,下面我们就将通过具体的案例,来熟悉Socke...
    lucas777阅读 4,929评论 0 2
  • 对于即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求。这会,Socket对于我们来说就非常实用...
    育树凌峰阅读 6,167评论 0 1
  • 1.网络编程1.1计算机网络概述网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。按照计算机网络的...
    任振铭阅读 3,180评论 0 1

友情链接更多精彩内容