小程序局域网通信,java实现局域网聊天室
本文分享Java局域网聊天的具体代码,供大家参考。具体内容如下
开发环境:
IDEA 2018.2集成开发工具。
00-1010 1.用户上线,通知服务器,注册。
2.在同一个局域网下,所有注册用户都可以进行群聊。
3.在同一个局域网下,所有用户都可以与任何注册用户进行私聊。
4.当用户注销时,通知服务器,服务器更新信息。
00-1010 1.服务器实例化一个ServerSocket对象并调用accept方法来等待客户端连接到服务器。
2.客户端实例化套接字对象,并通过使用构造方法建立与服务器的链接。
3.服务器根据客户端输入的信息,识别客户端请求的功能,并做出相应的响应。
00-1010为了有效地处理客户端的请求,在服务器端使用多线程来处理客户端的请求。并使用ConcurrentHashMap来存储所有注册的客户端。
实现功能:
服务器端:
导入Java . io . io exception;导入Java . io . printstream;导入Java . net . server socket;导入Java . net . socket;导入Java . util . map;导入Java . util . scanner;导入Java . util . set;导入Java . util . concurrent . *;导入Java . util . regex . matcher;导入Java . util . regex . pattern;classmanythreadserver {//存储所有注册的客户端私有静态映射字符串,socket client map=newconcurrenthashmapstring,socket();//具体处理每个客户端的请求:私有静态类Exclude Client实现Runnable { Private Socket Clientpublic execute client(Socket client){ this . client=client;} @ override public void run(){ try {//获取客户端的输出流,读取客户端消息,处理scannerin=new scanner(client . getinputstream());字符串strFromClientwhile(true){ if(in . has nextline()){ strFromClient=in . nextline();//在Windows中,默认的换行符是:rn,所以r要转换成空字符串Pattern=Pattern . pile( r );matcher matcher=pattern . matcher(strFromClient);strFromClient=matcher . replace all();//注册过程if(strfromclient . starts with( usename ){ string usename=strfromclient . split( 3360 )[1];registerUser(用户名,客户端);继续;}//群聊函数if(strfromclient . starts with( g ){ string msg=strfromclient . split( 3360 )[1];groupChat(消息,客户端);继续;
} //私聊功能 if(strFromClient.startsWith("P")){ String userName = strFromClient.split("\:")[1].split("-")[0]; String msg = strFromClient.split("\:")[1].split("-")[1]; privateChat(userName,msg,client); continue; } //用户退出 if(strFromClient.startsWith("B")){ String userName = null; //根据Socket找到UserName for(String keyName : clientMap.keySet()){ if(clientMap.get(keyName).equals(client)){ userName = keyName; } } System.out.println("用户" + userName + "下线了。。。"); clientMap.remove(userName); System.out.println("当前共有用户" + clientMap.size() + "人"); continue; } else{ PrintStream out = new PrintStream(client.getOutputStream(),true,"UTF-8"); out.println("输入错误。。。"); } } } } catch (IOException e) { e.printStackTrace(); } } private void registerUser(String name,Socket client){ System.out.println("用户:" + name + "已上线!"); clientMap.put(name,client); System.out.println("当前在线人数:" + clientMap.size() + "人!"); //既然是用户在注册,所以这里服务器通知用户注册结果 try { PrintStream out = new PrintStream(client.getOutputStream(),true,"UTF-8"); out.println("用户注册成功!"); } catch (IOException e) { e.printStackTrace(); } } private void groupChat(String msg,Socket client){ //取出clientMap中所有的Entry对象,遍历每个用户,并且发送消息 Set<Map.Entry<String,Socket>> clientSet = clientMap.entrySet(); for(Map.Entry<String,Socket> entry:clientSet){ try { Socket socket = entry.getValue(); //取得输出流,向客户端发送消息 PrintStream out = new PrintStream(socket.getOutputStream(),true,"UTF-8"); out.println("由端口号为"+ client.getPort() + "发来的群聊消息:" + msg); } catch (IOException e) { e.printStackTrace(); } } } private void privateChat(String userName,String msg,Socket client){ Socket privateSocket = clientMap.get(userName); try { PrintStream out = new PrintStream(privateSocket.getOutputStream(),true,"UTF-8"); out.println("由端口号为:" + client.getPort() + "发来的消息:" + msg); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args)throws Exception{ //为了提高效率,这里使用多线程进行处理 ExecutorService executorService = Executors.newFixedThreadPool(30); //实例化ServerSocket对象,并指定IP为本地主机,端口号为6666 ServerSocket serverSocket = new ServerSocket(6666); for(int i = 0; i < 30;i++){ System.out.println("等待用户连接。。。"); //等待客户端连接服务器 Socket client = serverSocket.accept(); System.out.println("有客户端连接,端口号为:" + client.getPort()); //启动线程,并处理客户端请求 executorService.submit(new ExcuteClient(client)); } //关闭线程,关闭服务器 executorService.shutdown(); serverSocket.close(); }}客户端:
import java.io.IOException;import java.io.PrintStream;import java.net.Socket;import java.util.Scanner; /** * 接收服务端发来的消息 */class FromServer implements Runnable{ Socket client; public FromServer(Socket client){ this.client = client; } @Override public void run() { try { Scanner in = new Scanner(client.getInputStream()); while (true) { if (in.hasNextLine()) { System.out.println("服务器:" + in.nextLine()); } //判断客户端是否退出,如果推出,跳出循环,并关闭流 if (client.isClosed()) { System.out.println("客户端关闭。。。"); break; } } in.close(); } catch (IOException e) { e.printStackTrace(); } }} /** * 向服务端发出消息 */class ToServer implements Runnable{ Socket client; public ToServer(Socket client){ this.client = client; } @Override public void run() { try { Scanner scanner = new Scanner(System.in); PrintStream out = new PrintStream(client.getOutputStream(),true,"UTF-8"); while (true) { System.out.println("请输入信息:"); String strToserver; if(scanner.hasNextLine()){ strToserver = scanner.nextLine().trim(); out.println(strToserver); //客户端退出标志:B if(strToserver.startsWith("B")){ System.out.println("客户端退出。。。"); scanner.close(); out.close(); client.close(); break; } } } } catch (IOException e) { e.printStackTrace(); } }}public class ManyThreadClient { public static void main(String[] args){ try { //实例化Socket对象,与服务器建立连接 Socket client = new Socket("127.0.0.1",6666); //为了发送消息和接收消息可以同时进行,使用多线程进行处理 Thread thread1 = new Thread(new FromServer(client)); Thread thread2 = new Thread(new ToServer(client)); thread1.start(); thread2.start(); } catch (IOException e) { e.printStackTrace(); } }}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。