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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code
原文地址:https://www.cnblogs.com/zclqian/p/7233304.html