记一次java socket学习(简单实用多线程,实现多对多群聊)

来源:互联网 发布:广州多迪网络靠谱吗 编辑:程序博客网 时间:2024/06/05 05:27

学习过程是艰苦,学习结束是快乐的

目录

[TOC]来生成目录:

  • 学习过程是艰苦学习结束是快乐的
      • 目录
      • 代码块

本来想写一些文字描述描述,可是想不出来说啥。。。所以直接记录代码了。。。

代码块

因为喜欢把常量都提取出来 所以上来就是常量类:

public class Constant {    //这个端口要提示一下,有的时候你占用系统的端口,所以当启动服务端的时候,直接就有客户端链接    public static final int PORT_NUM =8887;    public static final String LOCALHOST="localhost";}

服务端:

package com.gs.socket2;import java.io.IOException;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.List;import static com.gs.constant.Constant.PORT_NUM;/** * Created with GaoShan. * Description: * Date: 2017-07-24 * Time: 8:29 */public class Server {       public static void main(String[] args) {        new Server().service();    }    void service(){        //声明服务端socket        ServerSocket serverSocket =null;        //声明链接到服务器的客户端        Socket client =null;        //声明客户端集合,用于群发        List<Socket> clients = new ArrayList<>();        try {            serverSocket = new ServerSocket(PORT_NUM);            System.out.println("服务器启动,等待客户端链接!");            int count = 0;            while (true){                client = serverSocket.accept();                clients.add(client);                InetAddress inetAddress = client.getInetAddress();                System.out.println("客户端:"+inetAddress.getHostName()+"链接服务器,当前连接数:" +clients.size());                ServerThread serverThread = new ServerThread(client, clients);                serverThread.setName("客户端"+count++);                serverThread.start();            }        } catch (IOException e) {            e.printStackTrace();            clients.remove(client);        }    }}

服务器的线程类:

package com.gs.socket2;import java.io.IOException;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.List;import static com.gs.constant.Constant.PORT_NUM;/** * Created with GaoShan. * Description: * Date: 2017-07-24 * Time: 8:29 */package com.gs.socket2;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.util.List;/** * Created with GaoShan. * Description: * Date: 2017-07-24 * Time: 8:29 */public class ServerThread extends Thread {    private Socket client;    private List<Socket> clients;    private BufferedReader bufferedReader;    private PrintWriter printWriter;    public ServerThread(Socket client, List<Socket> clients) {        this.client = client;        this.clients = clients;    }    @Override    public void run() {        super.run();        try {            bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream()));            while (true) {                String readLine = bufferedReader.readLine();                System.out.println("来自客户端的消息:" + readLine);                if (readLine.equals("exit"))                    break;                for (Socket socket:clients){                    //不给客户端本身转发消息                    if(client.equals(socket))                        continue;                    printWriter = new PrintWriter(socket.getOutputStream());                    printWriter.println(getName()+"发来消息:" + readLine);                    printWriter.flush();                }            }        } catch (IOException e) {            e.printStackTrace();            clients.remove(client);            if (client != null) {                try {                    client.close();                } catch (IOException a) {                    a.printStackTrace();                }            }        }    }}
写服务器线程的时候有个问题,就是不知道,应该在哪里判断客户端是否断开链接,或者,异常关闭了,也不知道怎么处理。纠结,现在就想到一种就是不处理  e.printStackTrace(); 直接删掉,但是感觉肯定不是这样。

客户端:

package com.gs.socket2;import java.io.IOException;import java.net.InetAddress;import java.net.Socket;import static com.gs.constant.Constant.LOCALHOST;import static com.gs.constant.Constant.PORT_NUM;/** * Created with GaoShan. * Description: * Date: 2017-07-24 * Time: 8:29 */public class Client {    public static void main(String args[]) {        new Client().service();    }    void service() {        //声明链接到的服务器        Socket server = null;        System.out.println("正在链接服务器。。。");        try {            server = new Socket(LOCALHOST, PORT_NUM);            InetAddress inetAddress = server.getInetAddress();            System.out.println("成功连接:" + inetAddress.getHostName() + ",ip地址为:" + inetAddress.getHostAddress());            new ClientThreadReceive(server).start();            new ClientThreadSend(server).start();        } catch (IOException e) {            e.printStackTrace();            if (server != null) {                try {                    server.close();                } catch (IOException aaa) {                    aaa.printStackTrace();                }            }        }    }}

客户端的接收线程:

package com.gs.socket2;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.Socket;/** * Created with GaoShan. * Description: * Date: 2017-07-24 * Time: 8:29 */public class ClientThreadReceive extends Thread {    private Socket server;    public ClientThreadReceive(Socket server) {        this.server = server;    }    @Override    public void run() {        BufferedReader br = null;        try {            br = new BufferedReader(new InputStreamReader(server.getInputStream()));            while (true) {                String readLine = br.readLine();                System.out.println(readLine);            }        } catch (IOException e) {            e.printStackTrace();        }    }}

客户端发送线程:

package com.gs.socket2;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;/** * Created with GaoShan. * Description: * Date: 2017-07-21 * Time: 13:39 */public class ClientThreadSend extends Thread {    private Socket server;    public ClientThreadSend(Socket server) {        this.server = server;    }    @Override    public void run() {        super.run();        try {            PrintWriter printWriter = new PrintWriter(server.getOutputStream());            BufferedReader clientBr = new BufferedReader(new InputStreamReader(System.in));            while (true) {                String readLine = clientBr.readLine();                printWriter.println(readLine);                printWriter.flush();                if (readLine.equals("exit")) {                    System.out.println("您断开了与服务器的链接!");                    break;                }            }        } catch (IOException e) {            e.printStackTrace();        }    }}

本来写个socket 挺简单的,可是,优化来优化去,竟给自己挖了坑,比如咋finally用错地方,直接导致,socket close。。。哎,期望下一次回头看这个博客,能有很大的提高。

原创粉丝点击