简单的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();
   }
}
  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值