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 }