IM菜鸟学习之Socket聊天-简单服务器的搭建


本篇以Socket聊天为例,实现从服务端到客户端的聊天功能
1.服务器端任务如下:
    1.ChatServer类负责开启Server端服务
    2.ReceiveMsg负责接收消息
    3.SendMsg负责发送消息
    4.Server端响应请求,向Client端返回数据
2.实现步骤如下:
    1.首先创建一个java项目,名字就叫做ChatServerDemo
    2.创建项目包名全部小写的server
    3.创建ChatServer类
    4.开始写代码
        package chatserver;

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 org.omg.CORBA.CTX_RESTRICT_SCOPE;

    

//Socket聊天服务器端
//继承Thread类创建一个线程    
public class ChatServerTest extends Thread {
    //定义一个ServerSocket对象
    private ServerSocket server = null;
    //定义一个端口号
    private static final int PORT=5000;
    //定义写的buffer
    private BufferedWriter writer;
    //定义读的buffer
    private BufferedReader reader;
    
    private ChatServerTest() throws IOException{
//创建Socket服务器
        CreateSocket();
    }

    //重写Run方法
    @Override
    public void run() {
        //定义服务客户端的Socket
        Socket client;
        //定义接收的文本
        String text;
        try{
            //始终在监听
            while(true){
                //开启线程,实时监听socket端口
                //获取应答消息
                client=ResponseSocket();
                //响应客户端连接请求
                while(true){
                    //接收客户端消息
                    text=ReceiverMsg(client);
                    System.out.println("客户端消息:"+text);
                    //连接获得客户端发来的消息并将其显示在屏幕上
                    SendMsg(client,text);
                    //向客户端返回消息
                    if(true)break;
                    //中断继续等待连接请求
                }
                //关闭此次连接
                CloseSocket(client);
            }
        }catch(Exception e){
            e.printStackTrace();
            System.out.println(e);
        }
    }
    
    private void CloseSocket(Socket socket) throws IOException{
        reader.close();
        writer.close();
        socket.close();
    }

    //封装发送消息的方法
    private void SendMsg(Socket socket,String Msg) throws IOException{
        //要发送的消息写入BufferedWrite中
        writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        //添加空行分隔符
        writer.write(Msg+"\n");
        //刷新发送
        writer.flush();
    }
    //接收消息的方法
    private String ReceiverMsg(Socket client) throws Exception {
        //保存到读的方法
        reader=new BufferedReader(
                //将接收到的消息保存到缓冲区
                new InputStreamReader(
                        //获取接收到的消息
                        client.getInputStream()));
        //接收到的消息保存到字符串中
        String text="Server Send:"+reader.readLine();
        //以字符串的形式接收返回的信息
        return text;
    }

    //接收消息
    private Socket ResponseSocket() throws IOException{
        Socket client=server.accept();
        return client;
        
        
    }
    //实例化ServerSocket
    private void CreateSocket() throws IOException{
        server=new ServerSocket(PORT,100);
    }
    /**这段代码写的好纠结啊,几个月没写过java代码,竟然把程序执行需要main方法给忘了*/
    /**运行main方法发现报错BindException,查找资料发现是由于端口号被其他程序占用了,
    解决方法是在任务管理器里结束掉占用端口号的进程,具体怎么结束呢,我的办法是先在控制台输入
    netstat -ano  查看端口号和相应的PID 然后去任务管理器-查看-选择列 勾选上PID,找到PID,然后结束相应的进程*
    再次运行程序发现程序运行成功了*/
    
    //启动服务器代码
    public static void main(String[] args) throws Exception{
        ChatServerTest cTest=new ChatServerTest();
        if(cTest != null){
            System.out.println("===========================CTEST.Start=====================");
            cTest.start();
        }
    }
}


到此一个简单的服务器就搭建好了


   

你可能感兴趣的:(笔记)