Socket

Socket用法

Socket是一种网络通信的编程接口,通过TCP/IP协议将数据传输到网络上

在使用Socket进行编程时,其本质就是俩个进程之间的网络通信。分别为服务器端和客户端,其中服务器端会监听某个指定的端口,客户端连接服务器端的Ip和指定端口

服务器端

  1. 创建服务器端Socket对象,来监听端口
  2. 当服务器段启动时会进去等待状态;
    若没有客户端连接,accpet()处于等待阻塞状态
    若有客户端连接,accpet()则返回当前正在连接的Socket
  3. 服务器端通过BufferedReader读取客户端信息
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        //创建服务端Socket对象,监听1128端口
        try(ServerSocket serverSocket = new ServerSocket(1128)){
            while(true){
                Socket accept = serverSocket.accept();
                InetAddress inetAddress = accept.getInetAddress();
//                System.out.printf("客户端%s正在输入~",inetAddress.getHostAddress());
//                System.out.println();
                //服务端读取客户端信息
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(accept.getInputStream(),"GBK"));
                String s = bufferedReader.readLine();
                System.out.printf("客户端%s说:%s",inetAddress.getHostAddress(),s);
                System.out.println();
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

客户端

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

public class Client {
    public static void main(String[] args) {
        try(Socket socket = new Socket("192.168.199.148",1128)) {
            //客户端向向服务端发送信息
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //创建输出流
            bufferedWriter.write("999");
            bufferedWriter.flush();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

flush()方法会强制将所有缓冲区中的数据立即写入到输出流中,并清空缓冲区,确保数据及时地输出到目的地在我们写入网络数据时,如果不调用该方法,我们可能会发现客户端及服务器端都收不到数据,因为以流的形式写入数据时,是先存入内存的缓冲区中,等到缓冲区满了以后才会一次性发送,所以当我们想要在缓冲区数据不满的情况下发送数据就必须调用flush()方法

当客户端需要连续对服务器端发送信息时需要使用到shutdownOutput()方法来短暂的关闭输出流

示例:

import java.io.*;
import java.net.InetAddress;;
import java.net.Socket;
import java.util.Scanner;

public class SzClient {
    public static void main(String[] args) {
        try(Scanner sc = new Scanner(System.in)){
            String question = sc.nextLine();
            //创建Socket
            try(Socket socket = new Socket(InetAddress.getLocalHost(),1128);
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))
            ){
                //发送问题
                bufferedWriter.write(question);
                bufferedWriter.flush();

                //暂时关闭输出流
                socket.shutdownOutput();

                //接受答案
                String ans = bufferedReader.readLine();
                System.out.println("回答:"+ans);

            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值