JAVA之Socket编程

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

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

TCPServer类,Socket服务端。

 import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; // 基于TCP的Socket通信,实现用户登录(服务端)
public class TCPServer {
public static void main(String args[]) {
try {
// 创建一个服务器端的Socket,即ServerSocket,指定绑定的端口,并监听此端口(端口最好是1023之后的端口)
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
System.out.println("***服务器即将启动,等待客户端的连接***");
// 记录客户端的数量
int count = 0;
// 循环监听等待客户端的连接
while (true) {
// 调用accept()方法开始监听,等待客户端的连接
socket = serverSocket.accept();
// 创建一个新的线程,与客户端线程进行通信
TCPServerThread serverThread = new TCPServerThread(socket);
// 启动线程
serverThread.start();
System.out.println("客户端的数量:" + ++count);
// 获取客户端的IP地址等信息
InetAddress inet = socket.getInetAddress();
System.out.println("当前客户端的IP地址:" + inet.getHostAddress());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

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

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket; // 服务器端线程处理类
// 让一个服务器可以处理多个客户端的请求
public class TCPServerThread extends Thread {
private Socket socket; // 和本线程相关的socket public TCPServerThread(Socket socket) {
this.socket = socket;
} public void run() {
// 获取输入流,读取客户端发送的信息
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream os = null;
PrintWriter pw = null;
try {
// 执行线程的操作,相应客户端的请求
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String info = null;
while ((info = br.readLine()) != null) {
System.out.println("我是服务端,客户端说:" + info);
}
socket.shutdownInput();
// 获取输出流,相应客户端的请求
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎您!!");
pw.flush();
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (pw != null)
pw.close();
if (os != null)
os.close();
if (br != null)
br.close();
if (isr != null)
isr.close();
if (is != null)
is.close();
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

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 }
上一篇:java多线程详解(1)-多线程入门


下一篇:BZOJ4720 [Noip2016]换教室