java服务端和用户端
Posted 初夏的一棵歪脖子树
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java服务端和用户端相关的知识,希望对你有一定的参考价值。
1.server
Logintherad:
1 package com.zdsofe.server; 2 3 import java.io.InputStream; 4 import java.io.OutputStream; 5 import java.net.Socket; 6 import java.util.Set; 7 8 /** 9 * 主要用于用户登录 10 * 11 * @author Administrator 12 * 13 */ 14 public class Logintherad extends Thread 15 { 16 Socket client; 17 int n;// n的值表示用户是否连接上 18 19 public Logintherad(Socket client) 20 { 21 this.client = client; 22 } 23 24 @Override 25 public void run() 26 { 27 try 28 { 29 // 调用登录处理的方法 30 loginServer(); 31 // 判断是否登录成功 32 if (n == 1) 33 { 34 // 开启发送信息的线程 35 new SendThread(client).start(); 36 } 37 } catch (Exception e) 38 { 39 40 e.printStackTrace(); 41 } 42 } 43 44 // 登录处理方法 45 private void loginServer() throws Exception 46 { 47 // 获取输入流 48 InputStream inputStream = client.getInputStream(); 49 // 获取输出流 50 OutputStream outputStream = client.getOutputStream(); 51 // 创建数组用来存放读取的昵称 52 byte[] bytes = new byte[1024]; 53 // 从流里读取客服的昵称,放入数组中 54 inputStream.read(bytes); 55 // 把数组转化为String类型 56 String nickName = new String(bytes); 57 // 保存昵称到Set集合 58 boolean b = UserInfo.nickNames.add(nickName); 59 // 判断登录的状态 60 if (b) 61 { 62 n = 1; 63 // 登录成功 64 outputStream.write("1".getBytes()); 65 // 登录成功后把用户信息存放在hashMap集合中 66 UserInfo.hashMap.put(client, nickName); 67 // 获取hashMap集合的键,也就是获取用户 68 Set<Socket> set = UserInfo.hashMap.keySet(); 69 // 遍历set集合,发送登录成功的信息给其他客户, 70 for (Socket socket : set) 71 { 72 if (client != socket)// 排除把登录成功的信息发送给自己 73 { 74 OutputStream os = socket.getOutputStream(); 75 // 输出客户上线 76 os.write((nickName + "上线了").getBytes()); 77 } 78 } 79 80 } else 81 { 82 n = 0; 83 // 登录失败,输出0 84 outputStream.write("0".getBytes()); 85 } 86 } 87 88 }
SendThread:
1 package com.zdsofe.server; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.net.Socket; 6 import java.util.Set; 7 8 /** 9 * 发送信息的线程 10 * 11 * @author Administrator 12 * 13 */ 14 public class SendThread extends Thread 15 { 16 Socket socket; 17 public SendThread(Socket socket) 18 { 19 this.socket = socket; 20 } 21 22 @Override 23 public void run() 24 { 25 while (true) 26 { 27 try 28 { 29 // 创建输入流 30 InputStream inputStream = socket.getInputStream(); 31 // 创建数组 32 byte[] bytes = new byte[1024]; 33 // 把信息存入字节数组里 34 inputStream.read(bytes); 35 // 把数组转化为String类型 36 String s = new String(bytes); 37 // 获取所有客户端的列表 38 Set<Socket> set = UserInfo.hashMap.keySet(); 39 // 遍历set集合,得到所有用户 40 for (Socket socket : set) 41 { 42 // 使用户得到输出的信息 43 socket.getOutputStream().write(s.getBytes()); 44 } 45 } catch (IOException e) 46 { 47 e.printStackTrace(); 48 } 49 50 } 51 } 52 53 }
TestServer:
1 package com.zdsofe.server; 2 3 import java.io.IOException; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 7 public class TestServer 8 { 9 10 public static void main(String[] args) 11 { 12 try 13 { 14 // 创建服务器 15 ServerSocket serverSocket = new ServerSocket(8000); 16 while (true) 17 { 18 // 等待客服连接 19 Socket socket = serverSocket.accept(); 20 // 调用线程(登录和发消息的线程) 21 new Logintherad(socket).start(); 22 } 23 } catch (IOException e) 24 { 25 e.printStackTrace(); 26 } 27 28 } 29 30 }
UserInfo:
1 package com.zdsofe.server; 2 3 import java.net.Socket; 4 import java.util.HashMap; 5 import java.util.HashSet; 6 import java.util.Set; 7 8 /** 9 * 保存用户信息 10 * 11 * @author Administrator 12 * 13 */ 14 public class UserInfo 15 { 16 // 连接信息存在hashMap集合里 17 public static HashMap<Socket, String> hashMap = new HashMap<Socket, String>(); 18 // 把用户的昵称信息存入set集合 19 public static Set<String> nickNames = new HashSet<String>(); 20 21 }
2.socket
ReceiveThread:
1 package com.zdsofe.socket; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.net.Socket; 6 7 public class ReceiveThread extends Thread 8 { 9 private Socket socket; 10 11 public ReceiveThread(Socket socket) 12 { 13 14 this.socket = socket; 15 } 16 17 @Override 18 public void run() 19 { 20 while(true) 21 { 22 try 23 { 24 //创建输入流 25 InputStream inputStream=socket.getInputStream(); 26 //创建字节数组 27 byte[]bytes=new byte[1024]; 28 //把读的数据放在数组里 29 inputStream.read(bytes); 30 //转化为字符串类型并打印 31 System.out.println(new String(bytes)); 32 33 } catch (IOException e) 34 { 35 36 e.printStackTrace(); 37 } 38 } 39 } 40 41 }
SendThread:
1 package com.zdsofe.socket; 2 3 import java.io.IOException; 4 import java.io.OutputStream; 5 import java.net.Socket; 6 import java.util.Scanner; 7 8 public class SendThread extends Thread 9 { 10 private Socket socket; 11 12 public SendThread(Socket socket) 13 { 14 this.socket = socket; 15 } 16 17 @Override 18 public void run() 19 { 20 //开启键盘扫描 21 Scanner sc=new Scanner(System.in); 22 while(true) 23 { 24 String s=sc.nextLine().trim(); 25 try 26 { 27 //创建输出流 28 OutputStream outputStream=socket.getOutputStream(); 29 //把字符串转化为字节,并写入 30 outputStream.write(s.getBytes()); 31 32 } catch (IOException e) 33 { 34 35 e.printStackTrace(); 36 } 37 } 38 } 39 }
TestUers:
1 package com.zdsofe.socket; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.OutputStream; 6 import java.net.Socket; 7 import java.util.Scanner; 8 9 public class TestUers 10 { 11 // 服务器的IP地址 12 private static String IP = "192.168.10.183"; 13 // 服务器的端口 14 private static int DUAN = 8000; 15 16 public static void main(String[] args) throws Exception 17 { 18 try 19 { 20 //创建Socket连接 21 Socket socket = new Socket(IP, DUAN); 22 System.out.println("请输入昵称进行验证"); 23 //开启键盘扫描 24 Scanner sc = new Scanner(System.in); 25 String nickName = sc.nextLine().trim(); 26 //判断昵称是否为空 27 if (nickName.equals("")) 28 { 29 System.out.println("昵称不能为空"); 30 return; 31 } 32 // 开始登陆 33 loginServer(socket, nickName); 34 // 开启发送的线程 35 new SendThread(socket).start(); 36 // 开启接受的线程 37 new ReceiveThread(socket).start(); 38 } catch (IOException e) 39 { 40 e.printStackTrace(); 41 } 42 43 } 44 45 // 登录的方法 46 public static void loginServer(Socket socket, String nickName) 47 throws Exception 48 { 49 // 获取输出流 50 OutputStream outputStream = socket.getOutputStream(); 51 //把昵称写入 52 outputStream.write(nickName.getBytes()); 53 // 获取输入流 54 InputStream inputStream = socket.getInputStream(); 55 //创建字节数组 56 byte[] bytes = new byte[1024]; 57 //把读取的信息存入数组里 58 inputStream.read(bytes); 59 //把数组转化为字符串类型 60 String s = new String(bytes).trim(); 61 //判断登录是否成功 62 if (s.equals("1")) 63 { 64 System.out.println("登录成功"); 65 } else if (s.equals("0")) 66 { 67 System.out.println("昵称重复"); 68 } else 69 { 70 System.out.println("服务器异常"); 71 } 72 73 } 74 }
以上是关于java服务端和用户端的主要内容,如果未能解决你的问题,请参考以下文章