1、ServerSocket
package com.video.video.common;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 基于TCP协议的Socket通信,实现用户登录
* 服务器端
*/
public class Server {
public static void main(String[] args) {
try {
//1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(8888);
//2、调用accept()方法开始监听,等待客户端的连接
Socket socket = null;
int count = 0;
System.out.println("****服务器已启动,等待客户端的连接****");
//循环监听等待客户端连接
while (true){
socket = serverSocket.accept();
//创建一个新的线程
ServerThread serverThread = new ServerThread(socket);
//启动线程
serverThread.start();
count ++;
System.out.println("客户端数量:" + count);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
响应结果
2、ClientSocket
package com.video.video.common;
import java.io.*;
import java.net.Socket;
/**
* 客户端服务器
*/
public class Client {
public static void main(String[] args) {
try {
//1、创建客户端Socket,指定服务器地址和端口
Socket socket = new Socket("localhost", 8888);
//2、获取输出流,向服务器端发送信息
OutputStream os = socket.getOutputStream();//字节输出流
PrintWriter pw = new PrintWriter(os);//将输出流包装为打印流
pw.write("用户名:ben,密码:456");
pw.flush();
socket.shutdownOutput();//关闭输出流
//3、获取输入流,并读取服务器端响应信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String centont = null;
while((centont = br.readLine()) != null){
System.out.println("我是客户端,服务器说:" + centont);
}
// socket.shutdownInput();
//关闭资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
响应结果
3、ServerThread
package com.video.video.common;
import java.io.*;
import java.net.Socket;
/**
* 服务器线程类
*/
public class ServerThread extends Thread {
//和本线程相关的socket
Socket socket = null;
public ServerThread(Socket socket){
this.socket = socket;
}
//线程执行的操作,响应客户端的请求
@Override
public void run() {
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream os = null;
PrintWriter pw = null;
try {
//3、获取输入流,并读取客户端信息
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();//关闭输入流
//4、获取输出流,响应客户端响应
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎您");
pw.flush();//调用flush()方法将缓冲输出
socket.shutdownOutput();
}catch (Exception 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 (Exception e){
e.printStackTrace();
}
}
}
}
服务器端接收到客户端发送过来的登录信息,服务器也将校验结果发送给客户端。该Socket实例是支持多用户进行登录