知识屋:更实用的电脑技术知识网站
所在位置:首页 > 科技  > 软件

客户端”聊天程序(Tcp版本)

发表时间:2022-03-25来源:网络

一.服务器和客户端

1.客户端

当我们打开百度,输入我们想要查找的某个关键词,之后点击百度一下,我们就收到了一个有着各种链接的网页。

这个过程,作为我们,就是客户端。

2.服务器

我们即发送了信息,也接收了信息。而对于百度网站来说,就像是服务器端,即接收了信息,也发送了信息。

综上,服务器和客户端是一个相对的概念。客户端先发送消息,再收到回复。服务器端先收到消息,然后在发送消息。

二.TCP协议

1.传输层协议
2.有链接
3.可靠协议
4.面向字节流

注意:
可靠协议:消息发送方发送完消息后,一定要确保对方收到消息

不可靠协议:消息发送方只管发消息,不需要知道对方有没有收到消息

三.如何编写“服务器-客户端”聊天程序

把问题抽象一下,就是如何交互 客户端如何发送信息,如何接收信息。 服务器端如何接收信息,如何发送信息。

1.我们从实现服务器开始。Java提供了这样的一个类,ServerSocket。我们通过实例化它的方式来创建一个服务器。注意一下,创建服务器需要一个参数port,port指的是端口号。我们知道一台计算机上运行着许多程序,那么,对于另一台计算机来说,它想要连接到这台计算机的这个程序,该如何做呢?首先当然是根据IP连接到这台计算机,那么,然后呢?就是通过我们的port端口号了。正常情况下,计算机会自动我们创建的程序分配一个port,但是,因为我们创建的是提供给别的计算机连接的服务器,所以我们需要指定一个端口号供给外部计算机来进行连接。注意一下,计算机有的端口号已经被其他程序占用了,要想查看,你可以通过在cmd命令行输入netstat -an来查询。在这里,我们给定我们的端口号为空闲的1234。

2.客户端的创建与服务器的创建差不多,只是要注意一下内容上的匹配。

四.程序代码

1.服务器

package tcp.http1; /* 这个客户端服务器实现了简单的聊天功能,客户端和服务器可以互相发送任意多条消息 客户端:...... 服务器:...... 客户端:...... 服务器:...... */ import java.io.*; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /* 创建服务器套接字用ServerSocket 创建客户端套接字用Socket */ public class Server { public static void main(String[] args) throws IOException { //1.创建绑定到指定端口的服务器套接字 ServerSocket tcpServerSocket=new ServerSocket(1234); Scanner sc=new Scanner(System.in); while(true){ //2.服务器和客户端的链接,如果链接不上一直在这里停留 Socket cilentSocket=tcpServerSocket.accept(); InetAddress cilentAddress=cilentSocket.getInetAddress(); System.out.printf("有客户端 %s :%d 连接上来\n", cilentAddress.getHostAddress(), //客户端的IP cilentSocket.getPort() //客户端的端口号 ); //获取输入字节流 InputStream is=cilentSocket.getInputStream(); //字节流转换为字符流 InputStreamReader isReader=new InputStreamReader(is,"UTF-8"); //字符流转换缓冲字符流(主要是为了用它的 readLine() 方法) BufferedReader reader=new BufferedReader(isReader); //获取输出字节流 OutputStream os=cilentSocket.getOutputStream(); //从客户端得到的输出字节流 //将字节流转换为字符流(主要是为了用它的 println() 方法) PrintStream out=new PrintStream(os); String line; while((line=reader.readLine())!=null){ //从客户端读发来的消息 System.out.println("客户端:"+line); System.out.print("服务器:"); String response=sc.nextLine(); out.println(response); //输出到客户端 } } } }

2.客户端

package tcp.http1; /* 客户端是先写后读(先发出请求,后得到回应) 服务器是先读后写(先收到请求,后发出回应) */ import java.io.*; import java.net.*; import java.util.Scanner; public class Client { public static void main(String[] args) throws IOException { Scanner sc=new Scanner(System.in); //1.创建一个客户端的套接字 Socket tcpClientSocket=new Socket(); //连接本机的IP地址 byte[] ipv4={127,0,0,1}; //服务器的IP地址 InetAddress serverAddress=InetAddress.getByAddress(ipv4); //服务器:IP+端口确定 SocketAddress serverSocketAddress=new InetSocketAddress(serverAddress,1234); //2.客户端连接服务器 tcpClientSocket.connect(serverSocketAddress); while(true){ System.out.print("客户端:"); String request=sc.nextLine(); // 通过字节流直接从客户端向服务器 写入请求 OutputStream os=tcpClientSocket.getOutputStream(); PrintStream out=new PrintStream(os,true,"UTF-8"); out.println(request); // 通过字节流直接从服务器向客户端 读取回复 InputStream is=tcpClientSocket.getInputStream(); InputStreamReader isReader=new InputStreamReader(is,"UTF-8"); BufferedReader reader=new BufferedReader(isReader); String response=reader.readLine(); //写出服务器回复的消息 System.out.println("服务器:"+response); } } }

总结:在以上代码中我们要了解一下几个关键词

1.socket:

举个例子,假如两个人A,B要通信,他们使用一种信件交流的方法,并且规定好了信箱,一方把信件放在信箱里面,另一方就可以去看socket简单来说就是连接两个程序的信箱

2.127.0.0.1

127.0.0.1是回送地址,指本地机,一般用来测试使用。回送地址是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回,不进行任何网络传输。

五.运行结果

1.客户端运行结果

2.服务器端运行结果

收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜