• 实现多人聊天


    服务器端代码

    package Zn200611wzyfb;

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Scanner;

    public class ServerThread extends Thread{
    static final Map <String,Socket> mp = new HashMap<String,Socket>();

    static final List<Socket> li = new ArrayList<Socket>();
    OutputStream output;//输出流
    InputStream input;//输入流
    Socket socket;//定义一个socket接收对象的属性
    //线程创建方法


    public void addUser(Socket ss) {
    li.add(ss);
    }

    Scanner sca = new Scanner(System.in);
    public synchronized void run() {
    try {
    System.out.println("已启动一个线程来处理~");

    System.out.println("增加用户成功");

    System.out.println("当前用户"+li.size());




    //为输入输出流赋值
    output=socket.getOutputStream();
    input=socket.getInputStream();



    PrintWriter pw = new PrintWriter(socket.getOutputStream());
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    //接收
    Thread t1 = new Thread(new Runnable() {
    PrintWriter pw;
    @Override
    public synchronized void run() {
    while(true){
    try {
    String st = br.readLine();
    System.out.println(st); //这里不会造成死循环,这个readline会等待接受


    for (int i = 0; i < li.size(); i++) {

    if(socket.equals(li.get(i))) {
    li.remove(i);
    }

    }
    for (Socket socket : li) {

    // System.out.println("当前用户为"+socket);
    PrintWriter pw = new PrintWriter(socket.getOutputStream());
    //stt = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    pw.println(st);
    pw.flush();
    }

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

    }
    });

    t1.start();


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

    //定义一个建立服务器的方法

    private void setUpServer(int port) throws IOException {
    //将输入的端口设置为服务器
    ServerSocket server=new ServerSocket(port);
    //输出当前服务器的端口号
    System.out.println("服务器创建成功,端口号:"+server.getLocalPort());

    while(true) {
    ServerThread ts=new ServerThread();
    //为对象的socket属性赋值。 server.accept(); 进入阻塞状态,可以在控制台写入
    Socket sk = server.accept();
    // mp.put("eee",sk);

    addUser(sk);

    ts.socket= sk;

    //启动线程
    ts.start();

    }

    }


    //主函数入口
    public static void main(String[] args) throws IOException {

    //创建一个通信类的对象
    ServerThread server=new ServerThread();

    server.setUpServer(9013);

    }
    }

    客户端代码(每执行一下客户端,增加一个人聊天)

    package Zn200611wzyfb;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Scanner;

    public class Clils {

    public static void main(String[] args) throws Exception {

    //张三客户端
    Scanner sca = new Scanner(System.in);
    System.out.println("----------这里是客户端,请输入用户名------------");

    String name = sca.next();

    System.out.println("欢迎"+name);

    Socket sc = new Socket("127.0.0.1",9013);

    PrintWriter pw = new PrintWriter(sc.getOutputStream());
    BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));

    //接收
    Thread t1 = new Thread(new Runnable() {
    @Override
    public void run() {
    while(true){
    try {
    System.out.println(br.readLine()); //这里不会造成死循环,这个readline会等待接受
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    }
    });

    t1.start();

    //写

    Thread t2 = new Thread(new Runnable() {

    Scanner sca = new Scanner(System.in);
    @Override
    public void run() {
    while(true) {
    String speak = Thread.currentThread().getName();
    pw.println(speak+"说:"+sca.next());
    pw.flush();
    }

    }
    });
    t2.setName(name);
    t2.start();
    }

    }

  • 相关阅读:
    帝国cms字母导航功能制作教程
    HTML 学习
    DOM
    C# DataTable 使用原创
    GridView中编辑状态下实现DropDownList默认值(原创)
    C#精髓 GridView72大绝技(清清月儿)
    SQL注入攻击<收藏>
    Web网页安全色谱<收藏>
    GridView根据linkButton值不同跳转不同页面(原创)
    解决"Failed to access IIS metabase"
  • 原文地址:https://www.cnblogs.com/1306962984wei/p/13097302.html
Copyright © 2020-2023  润新知