Java socket 网络通信

Java Socket ServerSocket TCP/IP UDP/IP HTTP

基本概念

  1. 在Java原生的API中,客户端与服务器是通过Socket通信的。
  2. Socket指的是两台主机之间的连接。

基本原理

在服务器,你需要编写一个ServerSocket,该ServerSocket用于监听服务器上的某个端口。当客户端的Socket尝试连接服务器端的ServerSocket时,服务器就会被唤醒,并且返回一个Socket对象(这个Socket对象就是客户端的Socket),因为SocketgetInputStreamgetOutputStream方法,因此我们可以通过Socket在客户端和服务器之间交换数据。一般的执行过程如下:

  1. 服务器监听相应端口的请求
  2. 客户端发起一个请求
  3. 服务器接收到请求
  4. 服务器处理请求,并把结果返回给客户端

简单样例

在下面这个样例中,客户端Client将向服务器Server发送String类型的数据,服务器读取数据并输出。

客户端

public class Client implements Runnable{

    @Override
    public void run() {

        try {
            //客户端Socket发起请求,服务器地址为本机地址,服务器端口为8080端口,如果服务器响应成功,将返回socket
            Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(),8080);

            //获取socket的输出流对象
            OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());

            BufferedWriter bufferedWriter = new BufferedWriter(writer);

            //向socket写入数据
            bufferedWriter.write("A message from client.");
            
            //刷新输入流
            bufferedWriter.flush();

            //关闭输入流
            socket.shutdownOutput();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务器

public class Server implements Runnable{
    
    @Override
    public void run() {
        try{
            //将要返回给客户端的Socket
            Socket connection;

            ServerSocket serverSocket = new ServerSocket(8080);

            System.out.println("Server is waiting..");
            //服务器ServerSocket等待客户端发起请求,阻塞线程
            connection=serverSocket.accept();

            //获取Socket的输出流对象
            InputStreamReader reader = new InputStreamReader(connection.getInputStream());

            BufferedReader bufferedReader = new BufferedReader(reader);
            System.out.print("server get message: ");
            //读取从客户端发来的数据
            System.out.println(bufferedReader.readLine());

            //关闭输出流
            connection.shutdownInput();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

开始测试

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Runnable serverTask = new Server();
        Runnable clientTask = new Client();

        Thread server = new Thread(serverTask);
        Thread client = new Thread(clientTask);

        server.start();

        //保证服务器先于客户端启动
        Thread.sleep(1000);

        client.start();
    }
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值