简单的TCP程序服务器与客户端的简单通信
目录
简单的TCP程序:服务器与客户端的简单通信
操作系统:Windows10
编译器:IDEA 2021
JDK版本:jdk11
本文会一步一步的带领大家编写一个简单的TCP程序,并实现简单的服务器与客户端的通信。
编写TCP程序时,一般都会编写两个Demo,一个是服务器端,一个是客户端。二者想要通信需要用到Socket:套接字。套接字的作用类似于手机,两个人想要通电话必须都得有手机,服务器与客户端之间的通信都是基于Socket进行的。
1.搭建一个简单的服务器
搭建服务器使用的是ServerSocket类,需要传入参数port,也就是端口号。端口号范围为0~65535,但一般使用的时候都会从1025开始使用,因为前面的端口号几乎已经被知名的软件或者操作系统给占用了。
/*ServerDemo*/
ServerSocket server = new ServerSocket(12345);
这样子我们就搭建了一个最基础的服务器,IP地址为:localhost或者说是127.0.0.1,端口号:12345。
2.使服务器能够被客户端连接
服务器想要被客户端连接需要用到 public Socket accept()方法,返回值为Socket套接字,这个套接字就是服务器与客户端通信的站点。
/*ServerDemo*/
Socket socket = server.accept();
3.创建一个客户端并连接到已搭建的服务器
客户端连接服务器的过程就是新建一个Socket对象的过程,需要传入服务器的IP地址以及端口号。
/*ClientDemo*/
Socket socket = new Socket("127.0.0.1",12345);
4.服务器与客户端的通信
二者之间通信用到的方法是Socket类中的 public InputStream getInputStream()方法与public OutputStream getOutputStream()方法。前者的返回值是InputStream字节输入流,后者返回值是OutputStream字节输出流。这里的输入输出的概念是相对的,对于服务器来说,如果想要给客户端发送信息需要用到输出流,如果想要接收来自客户端的信息需要用到输入流。对于客户端来说也是如此。
还需要我们注意的是,服务器发送信息与之对应的客户端必须要有接收动作,二者之间的通信必须交替进行。
下面我们要从服务器向客户端发送一条信息,与此同时,客户端需要接收这条信息。
/*ServerDemo*/
/*首先需要获得一个字节输出流*/
OutputStream os = socket.getOutputStream();
/*
将字节输出流转换为字符打印流
这里也可以将其转换为字符打印流,不过字符打印流在打印消息之后需要使用flush()方法强制刷新缓冲区才能将消息发送出去。比较麻烦,所以我们还是选择字节打印流。
*/
PrintStream ps = new PrintStram(ps);
ps.println("欢迎连接服务器。")
/*下面我们需要在客户端接收这条消息*/
/*
ClientDemo
*/
/*首先需要获取一个字节输入流*/
InputStream is = socket.getInputStream();
/*将字节输入流转换为缓存流(参数应该是一个Reader对象,所以我们应该将InputStream转换为Reader)*/
BufferedReader br = new BufferedReader(new InputStreamReader(is));
/*将接收到的消息打印出来*/
String text = br.readLine();
System.out.println("来自服务器的消息:" + text);
5.关闭服务器与套接字,释放端口号
/*ServerDemo*/
socket.close();
server.close();
/*ClientDemo*/
socket,close();
6. 完整代码
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(12345);
System.out.println("服务器已启动,等待客户端连接...");
Socket socket = server.accept();
System.out.println("客户端已连接。");
//向客户端发送一条消息
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("你好,我是Server。");
//接收客户端的信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String text = br.readLine();
System.out.println("来自客户端的信息:" + text);
//关闭服务器
System.out.println("服务器关闭。");
socket.close();
server.close();
}
}
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",12345);
//接收来自服务器的消息。
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String text = br.readLine();
System.out.println("来自服务器的信息:" + text);
//向服务器发送一条消息
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("你好,我是Client。");
//关闭客户端
System.out.println("客户端退出。");
socket.close();
}
}