本次可以实现一个服务端接收多个客户端的请求,将接收客户请求的代码封装到线程类中,可以记录客户端数量及其IP地址:
服务线程类:
package jimo.love;
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 sket = null;
//构造方法
public ServerThread(Socket sket){
this.sket = sket;
}
//将接收客户端请求的操作写在线程里
@Override
public void run() {
InputStream is = null;
OutputStream os = null;
InputStreamReader isr = null;
BufferedReader br = null;
PrintWriter pw = null;
String info = null;
try {
is = sket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
while(null != (info = br.readLine())){
System.out.println("这里是服务端,客户端说:"+info);
}
//关闭输入流
sket.shutdownInput();
os = sket.getOutputStream();
pw = new PrintWriter(os);
pw.write("欢迎您!");
pw.flush();
//关闭输出流
sket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭资源
try {
if(null!=is){
is.close();
}
if(null!=isr){
isr.close();
}
if(null!=os){
os.close();
}
if(null!=br){
br.close();
}
if(null!=pw){
pw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package jimo.love;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
/*
* 服务端
*/
try {
//建立服务器端socket,并监听此端口9000
ServerSocket ssket = new ServerSocket(9000);
System.out.println("---服务器端启动---");
Socket sket = null;
int num = 0;//客户端的数量
while(true){
//调用accept方法监听,等待客户端连接
sket = ssket.accept();
//创建一个新的线程
ServerThread st = new ServerThread(sket);
//开启线程
st.start();
//记录客户端的数量
num++;
System.out.println("当前客户数量:"+num);
//获取每个客户端的IP
InetAddress ia = sket.getInetAddress();
System.out.println("IP:"+ia.getHostAddress());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package jimo.love;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream.GetField;
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 {
//创建客户端socket,指定服务器地址和端口,localhost代表本机地址
Socket sket = new Socket("localhost",9000);
//获取输出流,向服务器发送信息
OutputStream os = sket.getOutputStream();
//将字节输出流包装为打印输出流
PrintWriter pw = new PrintWriter(os);
pw.write("username:jimo;password:111");
//清空缓存,将消息发送
pw.flush();
//关闭socket输出流
sket.shutdownOutput();
//接收服务器的反馈
InputStream is = sket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String info = null;
while(null != (info = br.readLine())){
System.out.println("这里是客户端,服务器端反馈说:"+info);
}
//关闭资源
is.close();
isr.close();
br.close();
os.close();
pw.close();
sket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
先运行服务端:
再启动客户端:
这时服务端输出:
然后将客户端代码里的用户名和密码改一下:
pw.write("username:lonely;password:222");
再次运行客户端:
这时服务端输出:
由于都是在本地同一台机器的客户端,所以IP都是一样的。