记一次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。。。哎,期望下一次回头看这个博客,能有很大的提高。
阅读全文
0 0
- 记一次java socket学习(简单实用多线程,实现多对多群聊)
- java多线程socket实现简单的聊天
- 简单实现多线程Socket
- JAVA SOCKET 实现多线程文件传输(Server端的多线程,Client一次只有一个)
- JAVA多线程Socket实现
- Java Socket实现一个简单的多线程回显服务器。
- 简单实用的多线程学习实例
- java socket简单实现
- Java Socket学习---nio实现阻塞多线程通信
- Java 多线程IO简单实用Demo
- java多线程基本概念与简单实用
- java实现socket多线程代码
- socket ( java ) 简单多个客户端、服务端通信(多线程)
- socket ( java ) 简单多个客户端、服务端通信(多线程)
- Java多线程实用篇之实现Runnable接口,简单的线程池。
- Java多线程学习--超实用详解
- C#学习——简单socket、多线程
- 对JAVA学习的一次小小总结
- 【OpenFace】
- hdu3642-Get The Treasury 线段树+扫描线+离散化 求三维体积并
- 在Mac OS上搭建Python的开发环境
- SpringMvc学习笔记(一)配置
- JavaWeb项目的开发步骤
- 记一次java socket学习(简单实用多线程,实现多对多群聊)
- pip install
- 【Android】音效配置文件 audio_effects.conf
- java / java web学习线路图 最重要!最基础!!
- css样式使用
- HDU 4565 so easy ! 矩阵快速幂
- 微信小程序 获取openid 存入数据库 C#
- 百度Intern面试题之二叉树的网络传输及恢复--二叉树的文件存储和读取
- DOM编程-属性操作