Java编写一个简单的“服务器—客户端”聊天程序(Tcp版本)

一.服务器和客户端

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.客户端运行结果
Java编写一个简单的“服务器—客户端”聊天程序(Tcp版本)_第1张图片
2.服务器端运行结果
Java编写一个简单的“服务器—客户端”聊天程序(Tcp版本)_第2张图片

你可能感兴趣的:(Java,网络)