3个类:服务端Server+客户端Client+服务端线程ServerThread
1.服务端Server代码:
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.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 服务器端
*/
public class Server {
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);
InetAddress address = socket.getInetAddress();
System.out.println("当前客户端的IP:" + address.getHostAddress());
System.out.println(address.getHostName());
System.out.println(address.getCanonicalHostName());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.客户端Server代码:
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;
import java.net.UnknownHostException;
/*
* 服务器端
*/
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("用户名:admin;密码:6666");
pw.flush();
socket.shutdownOutput();//关闭输出流
//3.获取输入流,并且读取服务器端的响应信息
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String info = null;
while((info = br.readLine()) != null){
System.out.println("这里是 客户端,服务器说:" + info);
}
//4.关闭资源
br.close();
isr.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.服务端线程ServerThread代码:
/**
* 服务器端线程处理类
*/
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 ServerThread extends Thread {
//和本线程相关的Socket
Socket socket = null;
public ServerThread(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 ;
while((info = br.readLine()) != null){//循环读取客户端信息
System.out.println("这里是服务器,客户端说:" + info);
}
socket.shutdownInput();//关闭输入流
//获取输出流,响应客户端的请求
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎你!");
pw.flush();//调用flush()方法,将缓冲输出
} catch (IOException e) {
// TODO Auto-generated catch block
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();
}
System.out.println("--------全部关闭");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
启动服务端后,线程一致等待客户端的连接