Java Socket、ServerSocket类简单介绍


前言

注:此文章更多还是为个人学习知识归纳,写的比较赶,可能有众多错误
在上一篇文章里我们讲了如何进行最简单的socket 服务端和客服端通信,但他们只能对话一次,这次我来讲如何让服务端和客户端不断进行对话,并且也来讲讲socket类和ServerSocket的一些功能


一、Socket类

Socket类中提供了众多的方法

Socket构造器方法

socket类还提供了很多构造器方法,但我只列出几个常用的,想详细去看可以鼠标对着Socket类按Ctrl+鼠标左击
Socket(InetAddress address, int port)
创建⼀个流套接字并将其连接到指定 IP 地址的指定端⼝号。

Socket(String host, int port)
创建⼀个流套接字并将其连接到指定主机上的指定端⼝号。

Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
创建⼀个套接字并将其连接到指定远程地址上的指定远程端⼝。

Socket(String host, int port, InetAddress localAddr, int localPort)
创建⼀个套接字并将其连接到指定远程主机上的指定远程端⼝。

address:连接到主机的地址
host:也是连接到主机的地址,不过是string类型,直接传入一个地址字符串就可以了
localAddr:本机地址
port:连接的主机端口
localPort:本机端口(也就是设置本机连接主机的端口)


Sokcet方法

注意:我上面介绍的构造器方法都是创建套接字并连接主机的,所以不用手动再连接了
connect(SocketAddress endpoint)
将此套接字连接到服务器。

connect(SocketAddress endpoint, int timeout)
将此套接字连接到服务器,并指定⼀个超时值。


getInetAddress()
返回套接字连接的地址。

getInputStream()
返回此套接字的输⼊流。

getLocalPort()
返回此套接字绑定到的本地端⼝。

getOutputStream()
返回此套接字的输出流。

getPort()
返回此套接字连接到的远程端⼝。

close()
关闭此套接字。


二、ServerSocket类

ServerSocket构造器方法

ServerSocket(int port)
创建绑定到指定端口的服务器套接字。

ServerSocket(int port, int backlog)
创建服务器套接字并将其绑定到指定的本地端口号,并指定了积压。

ServerSocket(int port, int backlog, InetAddress bindAddr)
创建一个具有指定端口的服务器,侦听backlog和本地IP地址绑定。


ServerSocket方法

public Socket accept()
侦听要连接到此套接字并接受它。 该方法将阻塞直到建立连接。


三、代码

服务端代码

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

public class Server {
    public static void main(String[] args) {

        try{
            System.out.println("服务端已启动");
            //1、定义一个ServerSoket对象进行服务端的端口注册
            ServerSocket ss = new ServerSocket(5555);
            
            //2、监听客户端的Socket链接请求
            Socket socket = ss.accept();
            
            //从socket中获取输入流以读取客户端发过来的数据
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            String msg = "";
            //br.readLine()会进行阻塞直到收到消息
            //如果接收到的消息不为空就一直通信(就等于客户端还一直处于连接状态)
            //如果如果收到的数据为空那就退出循环(就等于客户端断开了连接)
            while((msg = br.readLine())!=null){
                System.out.printf("服务端接收到%s,%d : %s \n",socket.getInetAddress(),socket.getPort(),msg);
            }

            //客户端断开连接后就会结束while循环,也就知道对方断开连接了
            System.out.println("结束通信");

            //关闭链接
            socket.close();
            ss.close();
        }catch(Exception e){
            //客户端如果没有手动调用close()来关闭连接,而是中途处于连接状态时强行关闭程序,这就会使服务端br.readLin()发生错误
            System.out.println("对方强行断开连接");
            e.printStackTrace();
        }
    }
}

客户端代码

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        // 创建一个套接字并连接主机
        Socket socket = new Socket("127.0.0.1", 5555);

        // 获取socket输出流
        PrintStream ps = new PrintStream(socket.getOutputStream());

        // 创建扫描输入文本类
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入:");
            // 接收键盘的字符
            String sendMsg = sc.nextLine();

            // 把数据发送到主机上
            ps.println(sendMsg);
            ps.flush();

            System.out.printf("已发送:“%s”,%d\n", sendMsg, sendMsg.length());

            // 如果接收到quit字符就退出循环
            if (sendMsg.equals("quit")) {
                break;
            }
        }
        // 关闭所有连接
        sc.close();
        socket.close();
    }
}

代码结果

注意:先运行服务端再运行客户端,然后使用客户端发送消息
服务端结果

服务端已启动
服务端接收到/127.0.0.1,58548 : 你好服务端 
服务端接收到/127.0.0.1,58548 : 准备断开连接 
服务端接收到/127.0.0.1,58548 : quit 
结束通信

客户端结果

请输入:
你好服务端
已发送:“你好服务端”,5
请输入:
准备断开连接
已发送:“准备断开连接”,6
请输入:
quit
已发送:“quit”,4

总结

非常感谢你能看到最后,如果你想看更多我的文章,还可以去我的个人博客整洁无广告

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值