其实就是让服务端不断监听客户端连接,一旦有请求则使用多线程单独处理客户端请求,主线程继续监视客户端连接
服务端:
package demo_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.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(9978);
// 2,使用accept()方法监听,等待客户端链接
Socket socket = null;
long count = 0;
System.out.println("服务器正在启动,等待客户端连接..");
while (true) {
// 用循环不断监听客户端连接
socket = serversocket.accept();
// 创建新线程
ServerThread serverThread = new ServerThread(socket);
// 启动线程
serverThread.run();
count++;
InetAddress address = socket.getInetAddress();
System.out.println("该客户端IP地址为:" + address.getHostName());
System.out.println("客户端连接次数:" + count);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务端的多线程类,用于处理多客户端连接:
package demo_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 ServerThread extends Thread {
// 和本线程相关的socket
Socket socket = null;
public ServerThread() {
}
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 = null;
while ((info = br.readLine()) != null) {
System.out.println("我是服务器,客户端说: " + info);
}
socket.shutdownInput();
// 4.获取输出流,响应客户端
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎使用");
pw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 5,关闭资源
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 e2) {
// TODO: handle exception
}
}
}
}
客户端:
package demo_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 Client {
public static void main(String[] args) {
// 1.创建客户端Socket,指定服务器地址和端口
try {
//2.获取输出流,向服务器端发送信息
Socket socket = new Socket("localhost", 9978);
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("用户名:tony;密码:789");
pw.flush();
socket.shutdownOutput();
//3.打开输入流,读取服务端的响应信息
InputStream is=socket.getInputStream();
//包装成缓冲
BufferedReader br=new BufferedReader(
new InputStreamReader(is));
String info = null;
while ((info = br.readLine()) != null) {
System.out.println("我是客户端,服务器说: " + info);
}
//4.关闭各种资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}