java 服务端,实现服务端与客户端之间的通信以及客户端之间的通信

此服务端是利用socket进行通信

ServerSocket serversocket = new ServerSocket(12333);
使用本机的12333端口进行通信,可以自己选择
一般选择10000以后的端口不会与其他服务冲突

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JOptionPane;

public class ServerListener extends Thread {

    public void run() {
        try {
            ServerSocket serversocket = new ServerSocket(12333);
            while (true) {
                // 多个客户端连接用while循环
                Socket socket = serversocket.accept();
                // 建立连接
                System.out.println("连接成功");
                // 将socket传递给新的线程
                ChatSocket cs = new ChatSocket(socket);
                cs.start();
                ChatManager.getChatManager().add(cs);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

``其中的System.out.println("连接成功");这条语句是为了能在控制台看到是否已经连接成功


在定义一个新的类继承Thread,用来接收消息,

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

import mysqlserver.SqlHelper;

public class ChatSocket extends Thread {
    Socket socket;

    public ChatSocket(Socket s) {
        this.socket = s;
    }

    public void out(String out) {
        try {
            socket.getOutputStream().write(out.getBytes("utf-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            BufferedReader read = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
            String line = null;
            while ((line = read.readLine()) != null) {
                System.out.println(line);

            }
            read.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
System.out.println(line);

这句代码是为了能够在服务端看到客户端传来的消息
会将所有客户端发来的消息都显示到控制台上
其中line就是一个客户端单次发送过来的消息,只需要对其进行判断就能对对客户端进行操作

服务端只可以有一个所以需要对其进行单例化,定义一个ChatManager类将其getChatManager函数的返回值设为ChatManager,使其能通过此方法获得ChatManager的对象

import java.util.Vector;

public class ChatManager {
    // 实现单例化
    private ChatManager() {
    };

    private static final ChatManager cm = new ChatManager();

    public static ChatManager getChatManager() {// 返回值为ChatManager
        return cm;
    }

    // 单例化完成
    Vector<ChatSocket> vector = new Vector<ChatSocket>();

    public void add(ChatSocket cs) {// 为当前集合添加chatsocket对象
        vector.add(cs);
    }

    // 某一个线程向其他的客户端发送信息
    public void publish(ChatSocket cs, String out) {
        for (int i = 0; i < vector.size(); i++) {// 遍历所有的线程
            ChatSocket csChatSocket = vector.get(i);
            if (csChatSocket != cs)// 判断不是当前线程就发送此消息
                csChatSocket.out(out + "\n");
        }
    }

    // 向当前线程发信息
    public void publish_present(ChatSocket cs, String out) {
        cs.out(out + "\n");
    }
}

publish函数为想除了当前线程之外得到所有客户端发送消息
而publish_present是向当前客户端发送消息(在登录时验证密码等多个地方可以用到)

最终只要在主函数中调用new ServerListener().start();
就能运行此服务器

事例:实现客户端的登录

在类ChatSocket的run方法中

    @Override
    public void run() {
        try {
            BufferedReader read = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
            String line = null;
            while ((line = read.readLine()) != null) {
                System.out.println(line);
                customerlogin(line);
            }
            read.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

定义customerlogin方法

public void customerlogin(String s) {
        String[] a = s.split(" ");
        //将读取的数据用空格分开,并存在字符串数组中
        //其中头两个字符串为自己定义的序列
        if (a[0].equals("customer") && a[1].equals("login")) {
            if (SqlHelper.verify_customer(a)) {
//这条if是与数据库中的数据进行对比,实现登录            
ChatManager.getChatManager().publish_present(this, "customer login true");

            }
        }
    }

客户端只需要连接服务端的ip和端口就能与服务端进行通讯

服务端源码下载

附上github地址:点击进入

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值