聪聪工作室---Socket编程---聊天室初步

今天是 java 中 Socket 编程的第一课
在cmd 中运行 java.class 程序遇到点问题,之后改了环境变量就解决了

在今后一周中,将初步实现 类似 QQ 聊天室的功能

思维导图:

聪聪工作室---Socket编程---聊天室初步_第1张图片
Socket.png

Server.java 代码


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {
    
    public static int port = 3222;

    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(port);//服务器端的  Socket  port是端口
            System.out.println("开始在"+ port +"端口启动服务器...");
            
        
            String serverMsg="";//先定义服务器端的msg为空
            
            Scanner sc = new Scanner(System.in);//输入
            
            while(!"bye".equals(serverMsg)){//当服务器的msg不是bye的时候,执行以下操作
                
                Socket socket = ss.accept();//socket 等待接收
                System.out.println("链接已建立");
                
                BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));  //Buffer存入缓存     inputStream是桥    socket.getInputStream是从对方获得输入流
                /*
                
                BufferedReader这个类就是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了或者你flush的时候,再读入内存,就是为了提供读的效率而设计的
                InputStreamReader 只是一个字符输入流,system.in是获取键盘输入而已
                Socket  连接对象 
                                                        给你个很形象的比喻

                                                       客户端  服务器端  本身是两台相对独立的计算机,  客户端打开一个端口, 服务器端通过IP 端口 在 客户端 与 服务器端 建立一条桥 Socket 
                                                      双方通过这条桥实现数据的交换 socket 的 getinputstream 方法 就是从对方获得 输入流,返回一个inputstream 其实很简单啦,一个方法有一个返回值,
                                                      返回的对象就是inputstream 咯,呵呵 ,通过inputstream就可以在客户机上显示inputstream里面的信息了咯
                
                */
                BufferedWriter output = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//Buffer 是存入缓存,OutputStream是桥   getOutStream 是从对方得到数据
                
                Thread tInput=new InputReader(input); //定义一个线程   等于新建的 InputReader类的一个对象
                tInput.start();//运行线程,自动读取缓存的下一句话
                
            
            
            //因为数据是存入缓存的,所以有延迟  当bye的时候执行的操作写在!bye里面,当线程读取下一句话的时候执行以下操作
                while(("bye".equals(serverMsg))){  //当服务器的msg不是bye的时候,执行以下操作
                    
                    serverMsg = sc.nextLine();//服务器msg是获取 扫描器的下一行
                    output.write(serverMsg +"\r\n");//output写入  servermsg
                    output.flush();
                    /*
                    
                    flush() 是清空,而不是刷新啊。
                                                         一般主要用在IO中,即清空缓冲区数据,就是说你用读写流的时候,其实数据是先被读到了内存中,然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,
                                                         因为还有一部分有可能会留在内存这个缓冲区中。这时候如果你调用了 close()方法关闭了读写流,那么这部分数据就会丢失,所以应该在关闭读写流之前先flush(),先清空数据。 
                    
                    */
                    
                }
            
            System.out.println("断开连接。。。");
            socket.close();//这个连接的一端称为一个socket。Socket的英文原义是“孔”或“插座”。关闭连接
            
            }
            sc.close();//关闭扫描器
            ss.close();//关闭数据连接1
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
聪聪工作室---Socket编程---聊天室初步_第2张图片
Server01.png
聪聪工作室---Socket编程---聊天室初步_第3张图片
Server02.png

Client.java 代码



import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) {
        try {
            Socket s = new Socket("localhost", 3222);//建立连接
        
            String serverMsg;
            String clientMsg;//定义msg
            
            Scanner sc = new Scanner(System.in);//扫描输入
            clientMsg=sc.nextLine();//客户端msg是获得输入的内容
            
            while(clientMsg != "bye"){    //当输入的不是bye的时候   执行以下操作
                
                BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));//Buffer是记录缓存  ,inputStream是桥,getInputStream 是得到对方的数据流
                BufferedWriter output = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                
                
                Thread tInput=new InputReader(input);//建立线程等于执行读取缓存的下一行的操作
                tInput.start();//执行读取缓存的下一行的操作
                
                output.write(clientMsg +"\r\n");//输出的内容写入缓存
                output.flush();//清空缓存
                
                serverMsg = input.readLine();//服务器msg  是读取得到对方流的内容的内容
                System.out.println("server says : "+ serverMsg+ "\r\n");
                
                clientMsg = sc.nextLine();//客户端的msg是扫描输入的内容
            }
            sc.close();//关闭扫描器
            s.close();//关闭端口连接
            
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        
    }
    
}


聪聪工作室---Socket编程---聊天室初步_第4张图片
Client.png

InputReader.java 代码


import java.io.BufferedReader;

class InputReader extends Thread{
    BufferedReader br;//定义一个缓存功能
    InputReader(BufferedReader br){ //构造函数,变量是br
        this.br=br;
    }
    public void run(){  //运行
        try {  //try catch 是返回异常处理
            
            while(true){    //当是true的时候   
                String msg=br.readLine(); //定义msg是自动读取缓存的下一行
                System.out.println(msg);
            }
        } catch (Exception e) {
            
        }
    }
}

在 cmd 中运行实现:


聪聪工作室---Socket编程---聊天室初步_第5张图片
cmd01.png
聪聪工作室---Socket编程---聊天室初步_第6张图片
cmd02.png

作者: 聪聪工作室
业务合作: 18758171751
微信: 18758171751
Email: [email protected]

聪聪工作室---Java---独家制作
版权所有,盗版必究!

你可能感兴趣的:(聪聪工作室---Socket编程---聊天室初步)