Java Socket之TCP/IP交互入门详解

引言

Java Socket编程,主要有SocketServerSocket两个类,其中客户端(Client)通过构造Socket 实例,向服务端(Server)ServerSocket发起请求。 ServerSocket 在接受到来自客户端的请求后,构建一个Socket,并将响应内容通过这个Socket实例返回。

建立客户端和服务端

分别建立ClientServer两个java类,在Client类中声名Socket对象,在Server类声名ServerSocketSocket对象,并实例化。服务端监听10086端口,并打印log。

Client.java

package org.hjc.socket;

import java.io.IOException;
import java.net.Socket;

public class Client {
    static Socket socket;
    // 为了方便起见,Socket对象设为静态,IO异常在方法签名中抛出
    public static void main(String[] args) throws IOException {
        // 连接IP地址为“localhost”,端口号为10086的服务器
        // 因为目前服务器和客户端都跑在同一台设备中,地址就填localhost
        // 端口号的取值范围是1024到65535
        socket=new Socket("localhost",10086); 
    }
}

Server.java

package org.hjc.socket;

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

public class Server {
    static ServerSocket serverSocket;
    static Socket socket;
    // 为了方便起见,Socket对象设为静态,IO异常在方法签名中抛出
    public static void main(String[] args) throws IOException {
        System.out.println("启动服务器...");
        serverSocket=new ServerSocket(10086);// 创建ServerSocket,监听10086端口
        System.out.println("开始监听10086端口");
        socket=serverSocket.accept();// 接收连接请求
        System.out.println("已连接上来自IP为"+socket.getInetAddress().getHostAddress()+"的连接请求");
    }
}

目前客户端和服务端就创建好了,运行代码试试看看效果,注意先运行Server.java,再运行Client.java

启动Server.javaServer控制台的输出:

启动服务器…
开始监听10086端口

启动Client.javaServer控制台的输出:

启动服务器…
开始监听10086端口
已连接上来自IP为127.0.0.1的连接请求
Process finished with exit code 0

客户端向服务端发送数据

这里需要用到IO流操作,通过socket对象,调用getInputStream()getOutputStream()分别获取输入流和输出流,进行数据读取和写入操作。

Client.java

package org.hjc.socket;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
    static Socket socket;

    //为了方便起见,Socket对象设为静态,IO异常在方法签名中抛出
    public static void main(String[] args) throws IOException {
        //连接IP地址为“localhost”,端口号为10086的服务器
        //因为目前服务器和客户端都跑在同一台设备中,地址就填localhost
        //端口号的取值范围是1024到65535
        socket = new Socket("localhost", 10086);
        //向服务端发送数据
        OutputStream os = socket.getOutputStream();//构造输出流
        os.write("你好,我是客户端\n".getBytes());//向输出流写入数据,末尾必须加上换行符
    }
}

Server.java

package org.hjc.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    static ServerSocket serverSocket;
    static Socket socket;

    //为了方便起见,Socket对象设为静态,IO异常在方法签名中抛出
    public static void main(String[] args) throws IOException {
        System.out.println("启动服务器...");
        serverSocket = new ServerSocket(10086);//创建ServerSocket,监听10086端口
        System.out.println("开始监听10086端口");
        socket = serverSocket.accept();//接收连接请求
        System.out.println("已连接上来自IP为" + socket.getInetAddress().getHostAddress() + "的连接请求");
        //接收客户端的数据
        InputStream is =socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        System.out.println("接收到客户端发来的数据:\n"+br.readLine());
    }
}

Server控制台输出结果如下:

启动服务器…
开始监听10086端口
已连接上来自IP为127.0.0.1的连接请求
接收到客户端发来的数据: 你好,我是客户端
Process finished with exit code 0

服务端响应客户端

服务器响应客户端的操作其实和客户端向服务器发送数据一样,都是通过输出流进行传输。

Client.java

package org.hjc.socket;

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

public class Client {
    static Socket socket;

    //为了方便起见,Socket对象设为静态,IO异常在方法签名中抛出
    public static void main(String[] args) throws IOException {
        //连接IP地址为“localhost”,端口号为10086的服务器
        //因为目前服务器和客户端都跑在同一台设备中,地址就填localhost
        //端口号的取值范围是1024到65535
        socket = new Socket("localhost", 10086);
        //向服务端发送数据
        OutputStream os = socket.getOutputStream();//构造输出流
        os.write("你好,我是客户端\n".getBytes());//向输出流写入数据,末尾必须加上换行符
        // 接收服务器响应的数据
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        System.out.println("服务器的响应:\n" + br.readLine());
    }
}

Server.java

package org.hjc.socket;

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

public class Server {
    static ServerSocket serverSocket;
    static Socket socket;

    //为了方便起见,Socket对象设为静态,IO异常在方法签名中抛出
    public static void main(String[] args) throws IOException {
        System.out.println("启动服务器...");
        serverSocket = new ServerSocket(10086);//创建ServerSocket,监听10086端口
        System.out.println("开始监听10086端口");
        socket = serverSocket.accept();//接收连接请求
        System.out.println("已连接上来自IP为" + socket.getInetAddress().getHostAddress() + "的连接请求");
        //接收客户端的数据
        InputStream is =socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        System.out.println("接收到客户端发来的数据:\n"+br.readLine());
        //响应数据给客户端
        OutputStream os = socket.getOutputStream();//构造输出流
        os.write("welcome!欢迎连接!\n".getBytes());//向输出流写入数据,末尾必须加上换行符
    }
}

Server控制台输出结果如下:

启动服务器…
开始监听10086端口
已连接上来自IP为127.0.0.1的连接请求
接收到客户端发来的数据:
你好,我是客户端
Process finished with exit code 0

Client控制台输出结果如下:

服务器的响应:
welcome!欢迎连接!
Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/qq_33829547/article/details/80775970