JAVA之Socket编程

网上对Socket的诠释很多,也很全,在这里我就不多说了,总之,现在的网络处处都在使用Socket。本帖是一个Socket的例子,用来模拟一个简单的登录系统,只有核心代码,访问数据库、输入神马的统统没有,只是带入一行数据进行处理的代码。废话不说,请看代码。

注:Socket依附的传输协议有TCP的,也有UDP的,本帖中只给出TCP的代码。

TCPServer类,Socket服务端。

 1 import java.io.IOException;
 2 import java.net.InetAddress;
 3 import java.net.ServerSocket;
 4 import java.net.Socket;
 5 
 6 // 基于TCP的Socket通信,实现用户登录(服务端)
 7 public class TCPServer {
 8     public static void main(String args[]) {
 9         try {
10             // 创建一个服务器端的Socket,即ServerSocket,指定绑定的端口,并监听此端口(端口最好是1023之后的端口)
11             ServerSocket serverSocket = new ServerSocket(8888);
12             Socket socket = null;
13             System.out.println("***服务器即将启动,等待客户端的连接***");
14             // 记录客户端的数量
15             int count = 0;
16             // 循环监听等待客户端的连接
17             while (true) {
18                 // 调用accept()方法开始监听,等待客户端的连接
19                 socket = serverSocket.accept();
20                 // 创建一个新的线程,与客户端线程进行通信
21                 TCPServerThread serverThread = new TCPServerThread(socket);
22                 // 启动线程
23                 serverThread.start();
24                 System.out.println("客户端的数量:" + ++count);
25                 // 获取客户端的IP地址等信息
26                 InetAddress inet = socket.getInetAddress();
27                 System.out.println("当前客户端的IP地址:" + inet.getHostAddress());
28             }
29         } catch (IOException e) {
30             e.printStackTrace();
31         }
32     }
33 }

TCPServerThread类,Socket服务端多线程类,为的是能让多个客户端访问服务端。

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.io.PrintWriter;
 7 import java.net.Socket;
 8 
 9 // 服务器端线程处理类
10 // 让一个服务器可以处理多个客户端的请求
11 public class TCPServerThread extends Thread {
12     private Socket socket; // 和本线程相关的socket
13 
14     public TCPServerThread(Socket socket) {
15         this.socket = socket;
16     }
17 
18     public void run() {
19         // 获取输入流,读取客户端发送的信息
20         InputStream is = null;
21         InputStreamReader isr = null;
22         BufferedReader br = null;
23         OutputStream os = null;
24         PrintWriter pw = null;
25         try {
26             // 执行线程的操作,相应客户端的请求
27             is = socket.getInputStream();
28             isr = new InputStreamReader(is);
29             br = new BufferedReader(isr);
30             String info = null;
31             while ((info = br.readLine()) != null) {
32                 System.out.println("我是服务端,客户端说:" + info);
33             }
34             socket.shutdownInput();
35             // 获取输出流,相应客户端的请求
36             os = socket.getOutputStream();
37             pw = new PrintWriter(os);
38             pw.write("欢迎您!!");
39             pw.flush();
40             socket.shutdownOutput();
41         } catch (IOException e) {
42             e.printStackTrace();
43         } finally {
44             // 关闭资源
45             try {
46                 if (pw != null)
47                     pw.close();
48                 if (os != null)
49                     os.close();
50                 if (br != null)
51                     br.close();
52                 if (isr != null)
53                     isr.close();
54                 if (is != null)
55                     is.close();
56                 if (socket != null)
57                     socket.close();
58             } catch (IOException e) {
59                 e.printStackTrace();
60             }
61         }
62     }
63 }

TCPClient类,Socket客户端。

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.io.PrintWriter;
 7 import java.net.Socket;
 8 import java.net.UnknownHostException;
 9 
10 public class TCPClient {
11     public static void main(String[] args) {
12         try {
13             // 创建客户端Socket,指定服务端地址和端口
14             Socket socket = new Socket("localhost", 8888);
15             // 获取输出流,向服务器端发送信息
16             OutputStream os = socket.getOutputStream();
17             PrintWriter pw = new PrintWriter(os);
18             pw.write("用户名:Admin,密码:123456");
19             pw.flush();
20             socket.shutdownOutput();
21             // 获取输入流,读取服务端的相应信息
22             InputStream is = socket.getInputStream();
23             BufferedReader br = new BufferedReader(new InputStreamReader(is));
24             String info = null;
25             while ((info = br.readLine()) != null) {
26                 System.out.println("我是客户端,服务端说:" + info);
27             }
28             socket.shutdownInput();
29             // 关闭资源
30             br.close();
31             is.close();
32             pw.close();
33             os.close();
34             socket.close();
35         } catch (UnknownHostException e) {
36             e.printStackTrace();
37         } catch (IOException e) {
38             e.printStackTrace();
39         }
40     }
41 }