在服务器端创建ServerScoket对象,并绑定端口号,用来让客户单进行访问,客户端创建Socket对象,绑定主机名(由于演示案例是在同一台电脑上进行,所以主机名用了"localhost")和端口号,服务器端监听客户单,通过输入流读取客户端发送的请求,输出流相应客户端请求。客户端通过输出流向服务器端发送请求,输出流读取服务器端相应信息。为了便于在控制条展示信息,输出流都用了打印流进行包装。
服务器端代码
/**
* 服务端
*/
public class Server {
public static void main(String[] args) {
//创建服务器端ServerSocket
try {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
System.out.println("###服务器即将启动###");
int count = 0;
while (true) {
//监听客户端请求
socket = serverSocket.accept();
//启动线程接收客户端请求
ServerThread serverThread = new ServerThread(socket);
serverThread.start();
count++;
System.out.println("客户端数量:" + count);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器实际情况是永远不关闭,并且可以相应多个客户端的请求,这里用死循环和多线程进行模拟。
public class ServerThread extends Thread {
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 {
//获取输入流读取客户端发送的请求
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();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (br != null) {
br.close();
}
if (isr != null) {
isr.close();
}
if (is != null) {
is.close();
}
if (pw != null) {
pw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端代码
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
try {
//创建客户端Socket,指定主机名和端口号
Socket socket = new Socket("localhost", 8888);
//获得输出流
OutputStream os = socket.getOutputStream();
//转换为打印输出流
PrintWriter pw = new PrintWriter(os);
pw.write("用户名:admin, 密码:789");
pw.flush();
socket.shutdownOutput();
//获得输入流接收服务器端相应内容
InputStream is = socket.getInputStream();
InputStreamReader ist = new InputStreamReader(is);
BufferedReader br = new BufferedReader(ist);
String data = null;
while ((data = br.readLine()) != null) {
System.out.println("服务器说:" + data);
}
//关闭流和资源
is.close();
ist.close();
br.close();
br.close();
pw.close();
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果展示:
每请求一次,客户端信息更改一次,用来模拟多用户操作
注意:必须先启动服务器端,再启动客户端
启动服务器端信息展示
启动客户端:
这时客户端会向服务器端发送请求,服务器端做出相应的相应
在看服务器端控制台
服务器端接收到了客户端的请求信息
更改客户端请求信息,模拟多客户端请求