文章目录
前言
注:此文章更多还是为个人学习知识归纳,写的比较赶,可能有众多错误
在上一篇文章里我们讲了如何进行最简单的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
总结
非常感谢你能看到最后,如果你想看更多我的文章,还可以去我的个人博客整洁无广告