简介:
下面是我在慕课上听完JAVA Socket课程后的学习总结,需要的小伙伴可以看下。
工具:IntelliJ IDEA
1. Socket 通信
Java Socket 实现客户端--服务器间的双向实时通信。java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的client和server端。
2. Socket 通信实现方法
2.1 服务器端(非多线程)
① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求
③ 连接建立后,通过输入流读取客户端发送的请求信息
④ 通过输出流向客户端发送相应信息
⑤ 关闭相关资源
代码实现类:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 基于TCP 协议的Socket通信,实现用户登录
* 服务器端
* Created by Administrator on 2017/9/28.
*/
public class TestServerSocket {
public static void main(String[] args) {
ServerSocket serverSocket= null;
Socket socket=null;
try {
//1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
serverSocket = new ServerSocket(8888);
System.out.println("***服务器即将启动,等待客户端的连接");
//2、调用accept()方法开始监听,等待客户端的连接
socket=serverSocket.accept();
//3、获取输入流,并读取客户端信息
InputStream inputStream=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
String data=null;
while((data=br.readLine())!=null)
{
System.out.println("我是服务器,客户端说:"+data);
}
socket.shutdownInput();//关闭输入流
//4、获取输出流,响应客户端的请求
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("欢迎你!");
pw.flush();
//关闭资源
pw.close();
os.close();
br.close();
inputStream.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.2 客户端
① 创建Socket对象,指明需要连接的服务器的地址和端口号
② 连接建立后,通过输出流想服务器端发送请求信息
③ 通过输入流获取服务器响应的信息
④ 关闭响应资源
代码实现类:
import java.io.*;
import java.net.Socket;
/**
* 客户端
* Created by Administrator on 2017/9/28.
*/
public class TestSocket {
public static void main(String[] args) {
try {
//1、创建客户端Socket,指定服务器地址和端口
Socket socket=new Socket("localhost",8888);
//2、获取输出流,向服务器端发送信息
OutputStream outputStream=socket.getOutputStream();
PrintWriter pw=new PrintWriter(outputStream);
pw.write("用户名:admin;密码:123");
pw.flush();
socket.shutdownInput();
//3、获取输入流,并读取服务器端的响应信息
InputStream inputStream=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
String data=null;
while((data=br.readLine())!=null)
{
System.out.println("我是客户端,服务器说:"+data);
}
//关闭资源
br.close();
inputStream.close();
pw.close();
outputStream.close();
socket.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
3.应用多线程实现服务器与多客户端之间的通信
3.1新建服务器端线程处理类
import java.io.*;
import java.net.Socket;
/**
* 服务器端线程处理类
* Created by Administrator on 2017/9/28.
*/
public class ServerThread extends Thread {
//和本线程相关的socket
Socket socket = null;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
//服务器处理代码
//3、获取输入流,并读取客户端信息
InputStream inputStream = null;
BufferedReader br = null;
OutputStream os = null;
PrintWriter pw = null;
try {
inputStream = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
String data = null;
while ((data = br.readLine()) != null) {
System.out.println("我是服务器,客户端说:" + data);
}
socket.shutdownInput();//关闭输入流
//4、获取输出流,响应客户端的请求
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎你!");
pw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭资源
try {
if (pw != null) {
pw.close();
}
if (os != null) {
os.close();
}
if (br != null) {
br.close();
}
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3.2 服务器端 (多线程)
①
服务器端创建ServerSocket,循环调用accept()等待客户端连接
②客户端创建一个socket并请求和服务器端连接
③服务器端接受客户端请求,创建socket与该客户建立专线连接
④ 建立连接的两个socket在一个单独的线程上对话
⑤ 服务器端继续等待新的连接
代码实现类:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务器端(多线程)
* Created by Administrator on 2017/9/28.
*/
public class ThreadServerSocket {
public static void main(String[] args) {
try {
//1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
//记录客户端的数量
int count = 0;
System.out.println("***服务器即将启动,等待客户端的连接");
//循环监听等待客户端的连接
while (true) {
//调用accept()方法开始监听,等待客户端的连接
socket = serverSocket.accept();
//创建一个新的线程
ServerThread serverThread = new ServerThread(socket);
//启动线程
serverThread.start();
count++;
System.out.println("客户端连接的数量:" + count);
//获取当前客户端的IP地址
InetAddress address=socket.getInetAddress();
System.out.println("当前客户端的IP:"+address.getHostAddress());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}